1747 lines
48 KiB
Plaintext
1747 lines
48 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
traps_init()
|
|
{
|
|
level.outline_switch["traps_fire"] = 1;
|
|
level thread fire_trap_init();
|
|
level.outline_switch["traps_puddle"] = 1;
|
|
level thread electric_puddle_init();
|
|
level.outline_switch["traps_fence"] = 1;
|
|
level thread electric_fence_init();
|
|
level.spawnglow["enemy"] = loadfx( "fx/misc/flare_ambient" );
|
|
}
|
|
|
|
can_activate_trap( var_0 )
|
|
{
|
|
return maps\mp\alien\_persistence::player_has_enough_currency( int( var_0.cost ) );
|
|
}
|
|
|
|
fire_trap_init()
|
|
{
|
|
var_0 = getentarray( "fire_trap_barrel", "targetname" );
|
|
|
|
if ( !isdefined( var_0 ) || var_0.size == 0 )
|
|
return;
|
|
|
|
while ( !isdefined( level.players ) || level.players.size < 1 )
|
|
wait 0.05;
|
|
|
|
level.fire_traps = [];
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
var_2.damagefeedback = 0;
|
|
var_3 = fire_trap_setup( var_2 );
|
|
level.fire_traps[level.fire_traps.size] = var_3;
|
|
var_3 thread fire_trap_think();
|
|
}
|
|
}
|
|
|
|
fire_trap_setup( var_0 )
|
|
{
|
|
var_1 = spawnstruct();
|
|
var_1.trap_type = "traps_fire";
|
|
var_1.barrel = var_0;
|
|
var_1.burn_trig = getent( var_1.barrel.target, "targetname" );
|
|
var_1.burn_trig.script_noteworthy = "fire_trap";
|
|
var_2 = [];
|
|
|
|
for ( var_3 = var_1.burn_trig; isdefined( var_3 ) && isdefined( var_3.target ); var_3 = var_4 )
|
|
{
|
|
var_4 = common_scripts\utility::getstruct( var_3.target, "targetname" );
|
|
|
|
if ( !isdefined( var_4 ) )
|
|
break;
|
|
|
|
if ( isdefined( var_2[0] ) && var_4 == var_2[0] )
|
|
break;
|
|
|
|
var_2[var_2.size] = var_4;
|
|
}
|
|
|
|
var_5 = 45;
|
|
var_6 = 15;
|
|
var_7 = [];
|
|
|
|
for ( var_8 = 0; var_8 < var_2.size - 1; var_8++ )
|
|
{
|
|
var_9 = distance( var_2[var_8].origin, var_2[var_8 + 1].origin );
|
|
|
|
for ( var_10 = 0; var_10 < int( var_9 / var_5 ); var_10++ )
|
|
{
|
|
var_11 = vectorlerp( var_2[var_8].origin, var_2[var_8 + 1].origin, var_10 / int( var_9 / var_5 ) );
|
|
var_7[var_7.size] = var_11;
|
|
|
|
if ( var_7.size > var_6 )
|
|
break;
|
|
}
|
|
|
|
if ( var_7.size > var_6 )
|
|
break;
|
|
}
|
|
|
|
var_1.fire_fx_locs = var_7;
|
|
var_1.fire_link_structs = var_2;
|
|
var_1.fire_fx = loadfx( "vfx/gameplay/alien/vfx_alien_trap_fire" );
|
|
var_1.burning = 0;
|
|
var_1.duration = 50;
|
|
var_1.base_duration = 50;
|
|
var_1.dot = 600;
|
|
var_1.damage_time = 6;
|
|
var_1.dot_player = 33;
|
|
var_1.damage_time_player = 3;
|
|
var_1 fire_trap_setup_sizes();
|
|
var_1.barrel setcursorhint( "HINT_NOICON" );
|
|
var_1.barrel sethintstring( var_1.hintstring );
|
|
var_1.barrel makeusable();
|
|
|
|
if ( maps\mp\alien\_utility::alien_mode_has( "outline" ) )
|
|
maps\mp\alien\_outline_proto::add_to_outline_watch_list( var_0, var_1.cost );
|
|
|
|
return var_1;
|
|
}
|
|
|
|
fire_trap_setup_sizes()
|
|
{
|
|
var_0 = [ "small", "medium", "large" ];
|
|
var_1 = [];
|
|
var_1["small"] = 50;
|
|
var_1["medium"] = 80;
|
|
var_1["large"] = 110;
|
|
var_2 = 1;
|
|
|
|
if ( isdefined( self.barrel.script_noteworthy ) )
|
|
{
|
|
if ( self.barrel.script_noteworthy == "small" )
|
|
var_2 = 0;
|
|
|
|
if ( self.barrel.script_noteworthy == "large" )
|
|
var_2 = 2;
|
|
|
|
if ( issubstr( self.barrel.script_noteworthy, "custom" ) )
|
|
{
|
|
var_3 = strtok( self.barrel.script_noteworthy, " " );
|
|
|
|
switch ( var_3[1] )
|
|
{
|
|
case "small":
|
|
var_2 = 0;
|
|
break;
|
|
case "medium":
|
|
var_2 = 1;
|
|
break;
|
|
case "large":
|
|
var_2 = 2;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
self.custom = var_3[2];
|
|
}
|
|
}
|
|
|
|
if ( maps\mp\alien\_utility::isplayingsolo() )
|
|
var_2 = int( max( 0, var_2 - 1 ) );
|
|
|
|
if ( var_0[var_2] == "small" )
|
|
{
|
|
self.dot = 400;
|
|
self.cost = 300;
|
|
self.hintstring = &"ALIEN_COLLECTIBLES_ACTIVATE_FIRE_TRAP_SMALL";
|
|
}
|
|
|
|
if ( var_0[var_2] == "medium" )
|
|
{
|
|
self.dot = 600;
|
|
self.cost = 750;
|
|
self.hintstring = &"ALIEN_COLLECTIBLES_ACTIVATE_FIRE_TRAP_MED";
|
|
}
|
|
|
|
if ( var_0[var_2] == "large" )
|
|
{
|
|
self.dot = 800;
|
|
self.cost = 1000;
|
|
self.hintstring = &"ALIEN_COLLECTIBLES_ACTIVATE_FIRE_TRAP_LARGE";
|
|
}
|
|
|
|
if ( isdefined( self.custom ) )
|
|
self.base_duration = var_1[self.custom];
|
|
}
|
|
|
|
trap_bbprint( var_0, var_1, var_2 )
|
|
{
|
|
level.alienbbdata["traps_used"]++;
|
|
var_1 maps\mp\alien\_persistence::eog_player_update_stat( "traps", 1 );
|
|
var_3 = var_2[0];
|
|
var_4 = var_2[1];
|
|
var_5 = var_2[2];
|
|
var_6 = var_0;
|
|
var_7 = "";
|
|
|
|
if ( isdefined( var_1.name ) )
|
|
var_7 = var_1.name;
|
|
|
|
bbprint( "alientrap", "traptype %s trapx %f trapy %f trapz %f ownername %s ", var_6, var_3, var_4, var_5, var_7 );
|
|
}
|
|
|
|
fire_trap_think()
|
|
{
|
|
self endon( "disable_fire_trap" );
|
|
level endon( "game_ended" );
|
|
|
|
while ( isdefined( self ) )
|
|
{
|
|
while ( !self.burning )
|
|
{
|
|
self.barrel waittill( "trigger", var_0 );
|
|
|
|
if ( var_0 can_activate_trap( self ) )
|
|
{
|
|
thread trap_bbprint( "fire", var_0, self.barrel.origin );
|
|
level thread maps\mp\alien\_music_and_dialog::playvofortrapactivation( var_0, self.trap_type );
|
|
self.owner = var_0;
|
|
self.barrel sethintstring( "" );
|
|
self.barrel makeunusable();
|
|
var_1 = int( self.cost * var_0 maps\mp\alien\_perk_utility::perk_gettrapcostscalar() );
|
|
var_2 = self.cost - var_1;
|
|
var_0 maps\mp\alien\_persistence::take_player_currency( var_1, 0, "trap" );
|
|
self.duration = int( self.base_duration * var_0 maps\mp\alien\_perk_utility::perk_gettrapdurationscalar() );
|
|
thread sounds_fire_trap( self.barrel.origin );
|
|
thread fire_trap_burn( self.barrel.origin );
|
|
var_0 thread stop_firetrap_on_disconnect( self );
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
wait 0.05;
|
|
var_0 maps\mp\_utility::setlowermessage( "no_money", &"ALIEN_COLLECTIBLES_NO_MONEY", 3 );
|
|
continue;
|
|
}
|
|
}
|
|
|
|
if ( maps\mp\alien\_utility::alien_mode_has( "outline" ) )
|
|
maps\mp\alien\_outline_proto::remove_from_outline_watch_list( self.barrel );
|
|
|
|
self waittill( "fire_trap_exhausted" );
|
|
wait 0.5;
|
|
markdangerousnodesintrigger( self.burn_trig, 0 );
|
|
self.burning = 0;
|
|
self.barrel sethintstring( self.hintstring );
|
|
self.barrel makeusable();
|
|
|
|
if ( maps\mp\alien\_utility::alien_mode_has( "outline" ) )
|
|
maps\mp\alien\_outline_proto::add_to_outline_watch_list( self.barrel, self.cost );
|
|
}
|
|
}
|
|
|
|
sounds_fire_trap( var_0 )
|
|
{
|
|
var_1 = spawn( "script_origin", var_0 );
|
|
var_1 playsound( "alien_incendiary_impact" );
|
|
self.sound_flames = spawn( "script_origin", var_0 );
|
|
self.sound_flames playloopsound( "fire_trap_fire_lp" );
|
|
}
|
|
|
|
fire_trap_wait_for_impact()
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "fire_trap_exhausted" );
|
|
|
|
for (;;)
|
|
{
|
|
self.activation_trig waittill( "damage", var_0, var_1, var_2, var_3, var_4 );
|
|
|
|
if ( !isplayer( var_1 ) )
|
|
{
|
|
if ( isdefined( var_1.owner ) && isplayer( var_1.owner ) )
|
|
var_1 = var_1.owner;
|
|
else
|
|
{
|
|
wait 0.05;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
if ( !isdefined( var_4 ) )
|
|
{
|
|
wait 0.05;
|
|
continue;
|
|
}
|
|
|
|
var_5 = tolower( var_4 );
|
|
|
|
switch ( var_5 )
|
|
{
|
|
case "mod_impact":
|
|
case "mod_crush":
|
|
case "mod_melee":
|
|
case "unknown":
|
|
case "melee":
|
|
wait 0.05;
|
|
continue;
|
|
default:
|
|
return var_3;
|
|
}
|
|
|
|
return var_3;
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
fire_trap_burn( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "fire_trap_exhausted" );
|
|
thread monitor_fire_trap_exhausted( var_0 );
|
|
markdangerousnodesintrigger( self.burn_trig, 1 );
|
|
wait 2;
|
|
|
|
for (;;)
|
|
{
|
|
self.burn_trig waittill( "trigger", var_1 );
|
|
|
|
if ( !isdefined( var_1 ) || !maps\mp\_utility::isreallyalive( var_1 ) || !isplayer( var_1 ) && !isagent( var_1 ) || isdefined( var_1.burning ) && var_1.burning )
|
|
continue;
|
|
|
|
thread do_damage_over_time( var_1 );
|
|
}
|
|
}
|
|
|
|
do_damage_over_time( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
var_0 endon( "death" );
|
|
|
|
if ( !isdefined( self.owner ) )
|
|
return;
|
|
|
|
var_0 notify( "fire_trap_burning" );
|
|
var_0 endon( "fire_trap_burning" );
|
|
var_0.burning = 1;
|
|
|
|
if ( isplayer( var_0 ) )
|
|
{
|
|
var_1 = self.damage_time_player;
|
|
var_2 = self.dot_player;
|
|
}
|
|
else
|
|
{
|
|
var_1 = self.damage_time * self.owner maps\mp\alien\_perk_utility::perk_gettrapdamagescalar();
|
|
var_2 = self.dot * level.alien_health_per_player_scalar[level.players.size] * self.owner maps\mp\alien\_perk_utility::perk_gettrapdamagescalar();
|
|
}
|
|
|
|
var_3 = var_0 maps\mp\alien\_utility::is_alien_agent();
|
|
|
|
if ( var_3 )
|
|
var_0 maps\mp\alien\_alien_fx::alien_fire_on();
|
|
|
|
var_4 = 1;
|
|
var_5 = var_2 / ( var_1 / var_4 );
|
|
var_0 do_damage_until_timeout( var_5, var_1, var_4, self );
|
|
|
|
if ( var_3 )
|
|
var_0 maps\mp\alien\_alien_fx::alien_fire_off();
|
|
|
|
var_0.burning = undefined;
|
|
}
|
|
|
|
do_damage_until_timeout( var_0, var_1, var_2, var_3 )
|
|
{
|
|
self endon( "death" );
|
|
var_3.owner endon( "disconnect" );
|
|
var_4 = 0;
|
|
|
|
while ( var_4 < var_1 && isdefined( var_3.owner ) )
|
|
{
|
|
var_3.owner.burning_victim = 1;
|
|
|
|
if ( isplayer( self ) )
|
|
self dodamage( var_0, self.origin, undefined, var_3.burn_trig );
|
|
else if ( isdefined( var_3 ) && isdefined( var_3.owner ) )
|
|
self dodamage( var_0, self.origin, var_3.owner, var_3.burn_trig );
|
|
|
|
var_4 = var_4 + 1.0;
|
|
wait( var_2 );
|
|
}
|
|
}
|
|
|
|
monitor_fire_trap_exhausted( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "owner_disconnected" );
|
|
var_1 = sort_vectors_by_distance( self.fire_fx_locs, var_0 );
|
|
var_2 = 0.25;
|
|
self.fire_fx_array = play_fire( var_1, var_2 );
|
|
wait( self.duration );
|
|
self notify( "fire_trap_exhausted" );
|
|
|
|
if ( isdefined( self.fire_fx_array ) )
|
|
kill_fire( self.fire_fx_array );
|
|
}
|
|
|
|
sort_vectors_by_distance( var_0, var_1 )
|
|
{
|
|
for ( var_2 = []; var_0.size; var_0 = common_scripts\utility::array_remove( var_0, var_0[var_3] ) )
|
|
{
|
|
var_3 = get_closest_vec_index( var_0, var_1 );
|
|
var_2[var_2.size] = var_0[var_3];
|
|
}
|
|
|
|
return var_2;
|
|
}
|
|
|
|
get_closest_vec_index( var_0, var_1 )
|
|
{
|
|
var_2 = 0;
|
|
var_3 = var_0[0];
|
|
|
|
foreach ( var_6, var_5 in var_0 )
|
|
{
|
|
if ( distance( var_5, var_1 ) <= distance( var_3, var_1 ) )
|
|
{
|
|
var_2 = var_6;
|
|
var_3 = var_5;
|
|
}
|
|
}
|
|
|
|
return var_2;
|
|
}
|
|
|
|
play_fire( var_0, var_1 )
|
|
{
|
|
var_2 = [];
|
|
|
|
for ( var_3 = 0; var_3 < var_0.size; var_3++ )
|
|
{
|
|
var_4 = spawnfx( self.fire_fx, var_0[var_3] );
|
|
triggerfx( var_4 );
|
|
var_2[var_2.size] = var_4;
|
|
wait( var_1 );
|
|
}
|
|
|
|
return var_2;
|
|
}
|
|
|
|
kill_fire( var_0 )
|
|
{
|
|
if ( isdefined( self.sound_flames ) )
|
|
thread sounds_kill_flames();
|
|
|
|
if ( isdefined( var_0 ) )
|
|
{
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
if ( isdefined( var_2 ) )
|
|
var_2 delete();
|
|
}
|
|
}
|
|
}
|
|
|
|
sounds_kill_flames()
|
|
{
|
|
self.sound_flames endon( "death" );
|
|
var_0 = spawn( "script_origin", self.sound_flames.origin );
|
|
var_0 playsound( "fire_trap_fire_end_lp" );
|
|
wait 0.5;
|
|
self.sound_flames stopsounds();
|
|
wait 0.1;
|
|
self.sound_flames delete();
|
|
}
|
|
|
|
run_generator()
|
|
{
|
|
self notify( "electric_trap_turned_on" );
|
|
eletric_trap_asserts();
|
|
self.running = 1;
|
|
self.capacity = self.max_capacity;
|
|
self.generator sethintstring( "" );
|
|
self.generator makeunusable();
|
|
}
|
|
|
|
trap_shock( var_0, var_1, var_2 )
|
|
{
|
|
self endon( "electric_trap_turned_off" );
|
|
var_0 endon( "death" );
|
|
|
|
if ( !isdefined( self.owner ) )
|
|
return;
|
|
|
|
eletric_trap_asserts();
|
|
var_3 = self.shock_damage * level.alien_health_per_player_scalar[level.players.size] * self.owner maps\mp\alien\_perk_utility::perk_gettrapdamagescalar();
|
|
|
|
if ( isdefined( var_1 ) )
|
|
var_3 = var_1;
|
|
|
|
var_0.shocked = 1;
|
|
|
|
if ( !isalive( var_0 ) )
|
|
return;
|
|
|
|
playfx( self.shock_fx["shock"], var_0.origin + ( 0, 0, 32 ) );
|
|
playfx( self.shock_fx["sparks"], var_0.origin + ( 0, 0, 32 ) );
|
|
debug_electric_trap_print( var_0.origin, "hp:" + var_0.health, ( 0.5, 0.5, 1 ), 0.75, 2, 1 );
|
|
var_0.pain_registered = 1;
|
|
wait 0.05;
|
|
var_4 = self.owner;
|
|
|
|
if ( isplayer( var_0 ) )
|
|
var_4 = self.generator;
|
|
|
|
if ( isdefined( var_2 ) && var_2 )
|
|
self.capacity--;
|
|
|
|
var_0 dodamage( var_3, var_0.origin, var_4, self.generator, "MOD_EXPLOSIVE" );
|
|
playsoundatpos( var_0.origin, "alien_fence_shock" );
|
|
|
|
if ( !isalive( var_0 ) && isagent( var_0 ) )
|
|
{
|
|
var_5 = var_0 wait_for_ragdoll_pos();
|
|
|
|
if ( isdefined( var_5 ) )
|
|
{
|
|
wait 0.1;
|
|
physicsexplosionsphere( var_5, 300, 150, 5 );
|
|
playfx( self.shock_fx["shock"], var_5 );
|
|
playfx( self.shock_fx["sparks"], var_5 );
|
|
}
|
|
}
|
|
|
|
var_6 = randomfloatrange( self.shock_interval / 2, self.shock_interval * 1.5 );
|
|
var_0 thread time_out_shocked_state( var_6 );
|
|
}
|
|
|
|
time_out_shocked_state( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
wait( var_0 );
|
|
self.shocked = 0;
|
|
}
|
|
|
|
wait_for_ragdoll_pos()
|
|
{
|
|
self endon( "ragdoll_timed_out" );
|
|
thread ragdoll_timeout( 1 );
|
|
self waittill( "in_ragdoll", var_0 );
|
|
return var_0;
|
|
}
|
|
|
|
ragdoll_timeout( var_0 )
|
|
{
|
|
wait( var_0 );
|
|
|
|
if ( isdefined( self ) )
|
|
self notify( "ragdoll_timed_out" );
|
|
}
|
|
|
|
debug_electric_trap_print( var_0, var_1, var_2, var_3, var_4, var_5 )
|
|
{
|
|
|
|
}
|
|
|
|
debug_electric_trap_print_raw( var_0, var_1, var_2, var_3, var_4, var_5 )
|
|
{
|
|
level endon( "game_ended" );
|
|
|
|
while ( var_5 > 0 )
|
|
{
|
|
var_5 = var_5 - 0.05;
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
run_electric_trap( var_0, var_1, var_2 )
|
|
{
|
|
self endon( "death" );
|
|
level endon( "game_ended" );
|
|
eletric_trap_asserts();
|
|
|
|
if ( isdefined( var_2 ) )
|
|
self thread [[ var_2 ]]();
|
|
|
|
while ( isdefined( self ) )
|
|
{
|
|
while ( !self.running )
|
|
{
|
|
self.generator waittill( "trigger", var_3 );
|
|
|
|
if ( var_3 can_activate_trap( self ) )
|
|
{
|
|
thread trap_bbprint( "electric", var_3, self.generator.origin );
|
|
level thread maps\mp\alien\_music_and_dialog::playvofortrapactivation( var_3, self.trap_type );
|
|
self.owner = var_3;
|
|
var_3 thread stop_electric_trap_on_disconnect( self );
|
|
|
|
if ( isdefined( var_0 ) )
|
|
self thread [[ var_0 ]]();
|
|
|
|
self.shock_trig playloopsound( "alien_fence_hum_lp" );
|
|
self.generator playloopsound( "alien_fence_gen_lp" );
|
|
var_4 = int( self.cost * var_3 maps\mp\alien\_perk_utility::perk_gettrapcostscalar() );
|
|
var_5 = self.cost - var_4;
|
|
var_3 maps\mp\alien\_persistence::take_player_currency( var_4, 0, "trap" );
|
|
self.capacity = int( 20 * var_3 maps\mp\alien\_perk_utility::perk_gettrapdurationscalar() );
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
wait 0.05;
|
|
var_3 maps\mp\_utility::setlowermessage( "no_money", &"ALIEN_COLLECTIBLES_NO_MONEY", 3 );
|
|
continue;
|
|
}
|
|
}
|
|
|
|
if ( maps\mp\alien\_utility::alien_mode_has( "outline" ) )
|
|
maps\mp\alien\_outline_proto::remove_from_outline_watch_list( self.generator );
|
|
|
|
thread run_generator();
|
|
var_6 = gettime();
|
|
|
|
while ( self.running && self.capacity > 0 && isdefined( self.owner ) && issentient( self.owner ) )
|
|
{
|
|
var_7 = max( 0, ( gettime() - var_6 ) / 1000 );
|
|
var_8 = max( 5, self.life_span - var_7 );
|
|
var_9 = wait_for_trigger_timeout( var_8 * self.owner maps\mp\alien\_perk_utility::perk_gettrapdurationscalar() );
|
|
|
|
if ( !isdefined( var_9 ) && ( isdefined( self.trap_timed_out ) && self.trap_timed_out ) )
|
|
break;
|
|
|
|
if ( self.capacity <= 0 || !isdefined( self.owner ) )
|
|
break;
|
|
|
|
if ( isagent( var_9 ) && isalive( var_9 ) && !( isdefined( var_9.shocked ) && var_9.shocked ) )
|
|
thread trap_shock( var_9, undefined, 1 );
|
|
|
|
if ( isdefined( self.player_damage ) && isplayer( var_9 ) && isalive( var_9 ) && !( isdefined( var_9.shocked ) && var_9.shocked ) )
|
|
thread trap_shock( var_9, self.player_damage, 0 );
|
|
}
|
|
|
|
if ( maps\mp\alien\_utility::alien_mode_has( "outline" ) )
|
|
maps\mp\alien\_outline_proto::add_to_outline_watch_list( self.generator, self.cost );
|
|
|
|
self notify( "electric_trap_turned_off" );
|
|
|
|
if ( isdefined( self.owner ) && isalive( self.owner ) )
|
|
{
|
|
if ( self.trap_type == "traps_fence" )
|
|
self.owner maps\mp\_utility::setlowermessage( "electric_fence_offline", &"ALIEN_COLLECTIBLES_ELECTRIC_FENCE_OFFLINE", 3 );
|
|
else
|
|
self.owner maps\mp\_utility::setlowermessage( "electric_fence_offline", &"ALIENS_PATCH_ELECTRIC_TRAP_OFFLINE", 3 );
|
|
}
|
|
|
|
wait 0.5;
|
|
|
|
if ( isdefined( var_1 ) )
|
|
self thread [[ var_1 ]]();
|
|
|
|
self.owner = undefined;
|
|
self.running = 0;
|
|
self.generator sethintstring( self.hintstring );
|
|
self.generator makeusable();
|
|
self.generator stoploopsound( "alien_fence_gen_lp" );
|
|
self.generator playsound( "alien_fence_gen_off" );
|
|
self.shock_trig stoploopsound( "alien_fence_hum_lp" );
|
|
}
|
|
}
|
|
|
|
stop_electric_trap_on_disconnect( var_0 )
|
|
{
|
|
var_0 endon( "electric_trap_turned_off" );
|
|
var_0 endon( "timed_out" );
|
|
self waittill( "disconnect" );
|
|
var_0 notify( "electric_trap_turned_off" );
|
|
}
|
|
|
|
stop_firetrap_on_disconnect( var_0 )
|
|
{
|
|
var_0 endon( "timed_out" );
|
|
var_0 endon( "fire_trap_exhausted" );
|
|
self waittill( "disconnect" );
|
|
var_0 thread kill_fire( var_0.fire_fx_array );
|
|
var_0 notify( "owner_disconnected" );
|
|
var_0 notify( "fire_trap_exhausted" );
|
|
}
|
|
|
|
wait_for_trigger_timeout( var_0 )
|
|
{
|
|
self endon( "electric_trap_turned_off" );
|
|
thread timeout_watch( var_0 );
|
|
self endon( "timed_out" );
|
|
self.shock_trig waittill( "trigger", var_1 );
|
|
return var_1;
|
|
}
|
|
|
|
timeout_watch( var_0 )
|
|
{
|
|
self endon( "electric_trap_turned_off" );
|
|
self.trap_timed_out = 0;
|
|
wait( var_0 );
|
|
self notify( "timed_out" );
|
|
self.trap_timed_out = 1;
|
|
}
|
|
|
|
eletric_trap_asserts()
|
|
{
|
|
var_0 = " is not defined in eletric trap setup function.";
|
|
}
|
|
|
|
electric_puddle_init()
|
|
{
|
|
var_0 = getentarray( "puddle_generator", "targetname" );
|
|
|
|
if ( !isdefined( var_0 ) || var_0.size == 0 )
|
|
return;
|
|
|
|
while ( !isdefined( level.players ) || level.players.size < 1 )
|
|
wait 0.05;
|
|
|
|
level.electric_puddles = [];
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
var_2.damagefeedback = 0;
|
|
var_3 = setup_electric_puddle( var_2 );
|
|
level.electric_puddles[level.electric_puddles.size] = var_3;
|
|
var_3 thread run_electric_trap( ::play_puddle_on_fx, ::play_puddle_off_fx, ::ambient_puddle_shocks );
|
|
}
|
|
}
|
|
|
|
setup_electric_puddle( var_0 )
|
|
{
|
|
var_1 = spawnstruct();
|
|
var_1.trap_type = "traps_puddle";
|
|
var_1.generator = var_0;
|
|
var_1.shock_trig = getent( var_0.target, "targetname" );
|
|
var_1.contact_points = [];
|
|
var_2 = common_scripts\utility::getstruct( var_1.shock_trig.target, "targetname" );
|
|
|
|
for ( var_1.contact_points[0] = var_2; isdefined( var_2.target ); var_2 = var_3 )
|
|
{
|
|
var_3 = common_scripts\utility::getstruct( var_2.target, "targetname" );
|
|
var_1.contact_points[var_1.contact_points.size] = var_3;
|
|
}
|
|
|
|
var_1.shock_fx["shock"] = loadfx( "vfx/moments/alien/fence_lightning_shock" );
|
|
var_1.shock_fx["ambient_flash"] = loadfx( "vfx/moments/alien/fence_lightning_turn_on" );
|
|
var_1.shock_fx["sparks"] = loadfx( "fx/explosions/transformer_sparks_f_sound" );
|
|
var_1.shock_fx["sparks_sm"] = loadfx( "fx/explosions/transformer_sparks_b_sound" );
|
|
var_1.running = 0;
|
|
var_1.capacity = 20;
|
|
var_1.max_capacity = 20;
|
|
var_1.player_damage = 3;
|
|
var_1 puddle_trap_setup_sizes();
|
|
var_1.generator setcursorhint( "HINT_NOICON" );
|
|
var_1.generator sethintstring( var_1.hintstring );
|
|
var_1.generator makeusable();
|
|
|
|
if ( maps\mp\alien\_utility::alien_mode_has( "outline" ) )
|
|
maps\mp\alien\_outline_proto::add_to_outline_watch_list( var_0, var_1.cost );
|
|
|
|
return var_1;
|
|
}
|
|
|
|
puddle_trap_setup_sizes()
|
|
{
|
|
var_0 = [ "small", "medium", "large" ];
|
|
var_1 = [];
|
|
var_1["small"] = 90;
|
|
var_1["medium"] = 120;
|
|
var_1["large"] = 150;
|
|
var_2 = 1;
|
|
|
|
if ( isdefined( self.generator.script_noteworthy ) )
|
|
{
|
|
if ( self.generator.script_noteworthy == "small" )
|
|
var_2 = 0;
|
|
|
|
if ( self.generator.script_noteworthy == "large" )
|
|
var_2 = 2;
|
|
|
|
if ( issubstr( self.generator.script_noteworthy, "custom" ) )
|
|
{
|
|
var_3 = strtok( self.generator.script_noteworthy, " " );
|
|
|
|
switch ( var_3[1] )
|
|
{
|
|
case "small":
|
|
var_2 = 0;
|
|
break;
|
|
case "medium":
|
|
var_2 = 1;
|
|
break;
|
|
case "large":
|
|
var_2 = 2;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
self.custom = var_3[2];
|
|
}
|
|
}
|
|
|
|
if ( maps\mp\alien\_utility::isplayingsolo() )
|
|
var_2 = int( max( 0, var_2 - 1 ) );
|
|
|
|
self.shock_damage = 200;
|
|
self.shock_interval = 0.35;
|
|
|
|
if ( var_0[var_2] == "small" )
|
|
{
|
|
self.cost = 300;
|
|
self.life_span = 90;
|
|
self.hintstring = &"ALIEN_COLLECTIBLES_ACTIVATE_PUDDLE_SMALL";
|
|
}
|
|
|
|
if ( var_0[var_2] == "medium" )
|
|
{
|
|
self.cost = 500;
|
|
self.life_span = 120;
|
|
self.hintstring = &"ALIEN_COLLECTIBLES_ACTIVATE_PUDDLE_MED";
|
|
}
|
|
|
|
if ( var_0[var_2] == "large" )
|
|
{
|
|
self.cost = 750;
|
|
self.life_span = 150;
|
|
self.hintstring = &"ALIEN_COLLECTIBLES_ACTIVATE_PUDDLE_LARGE";
|
|
}
|
|
|
|
if ( isdefined( self.custom ) )
|
|
self.life_span = var_1[self.custom];
|
|
}
|
|
|
|
play_puddle_off_fx()
|
|
{
|
|
playfx( self.shock_fx["sparks"], self.contact_points[0].origin );
|
|
var_0 = 3;
|
|
|
|
while ( var_0 > 0 )
|
|
{
|
|
playfx( self.shock_fx["sparks"], self.generator.origin );
|
|
var_0--;
|
|
wait 0.2;
|
|
}
|
|
}
|
|
|
|
play_puddle_on_fx()
|
|
{
|
|
playfx( self.shock_fx["sparks"], self.contact_points[0].origin );
|
|
}
|
|
|
|
ambient_puddle_shocks()
|
|
{
|
|
self endon( "death" );
|
|
level endon( "game_ended" );
|
|
var_0 = spawnfx( self.shock_fx["sparks"], self.contact_points[0].origin );
|
|
var_1 = [];
|
|
|
|
foreach ( var_3 in self.contact_points )
|
|
var_1[var_1.size] = spawnfx( self.shock_fx["sparks"], var_3.origin );
|
|
|
|
var_5 = 0;
|
|
|
|
for (;;)
|
|
{
|
|
while ( !self.running )
|
|
{
|
|
var_5 = 0;
|
|
self waittill( "electric_trap_turned_on" );
|
|
}
|
|
|
|
if ( !var_5 )
|
|
var_5 = 1;
|
|
|
|
triggerfx( var_0 );
|
|
wait 0.25;
|
|
triggerfx( var_0 );
|
|
|
|
foreach ( var_8, var_7 in var_1 )
|
|
{
|
|
if ( var_8 == 0 )
|
|
{
|
|
triggerfx( var_7 );
|
|
continue;
|
|
}
|
|
|
|
if ( common_scripts\utility::cointoss() )
|
|
triggerfx( var_7 );
|
|
}
|
|
|
|
if ( !maps\mp\alien\_utility::is_true( level.skip_radius_damage_on_puddles ) )
|
|
radiusdamage( self.contact_points[0].origin, 80, 20, 5 );
|
|
|
|
common_scripts\utility::waittill_any_timeout( randomintrange( 3, 5 ), "electric_trap_turned_off" );
|
|
}
|
|
}
|
|
|
|
electric_fence_init()
|
|
{
|
|
var_0 = getentarray( "fence_generator", "targetname" );
|
|
|
|
if ( !isdefined( var_0 ) || var_0.size == 0 )
|
|
return;
|
|
|
|
while ( !isdefined( level.players ) || level.players.size < 1 )
|
|
wait 0.05;
|
|
|
|
level.electric_fences = [];
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
var_2.damagefeedback = 0;
|
|
var_3 = setup_electric_fence( var_2 );
|
|
level.electric_fences[level.electric_fences.size] = var_3;
|
|
var_3 thread run_electric_trap( ::play_fence_on_fx, ::play_fence_off_fx, ::ambient_fence_shocks );
|
|
}
|
|
}
|
|
|
|
setup_electric_fence( var_0 )
|
|
{
|
|
var_1 = spawnstruct();
|
|
var_1.trap_type = "traps_fence";
|
|
var_1.generator = var_0;
|
|
var_2 = common_scripts\utility::getstructarray( var_0.target, "targetname" );
|
|
var_3 = [];
|
|
var_4 = var_2[0];
|
|
|
|
foreach ( var_6 in var_2 )
|
|
{
|
|
if ( isdefined( var_6.script_noteworthy ) && var_6.script_noteworthy == "fence_sparks" )
|
|
var_3[var_3.size] = var_6;
|
|
|
|
if ( isdefined( var_6.script_noteworthy ) && var_6.script_noteworthy == "fence_area" )
|
|
var_4 = var_6;
|
|
}
|
|
|
|
var_8 = common_scripts\utility::getstruct( var_4.target, "targetname" );
|
|
var_9 = common_scripts\utility::getstruct( var_8.target, "targetname" );
|
|
var_10 = common_scripts\utility::getstruct( var_9.target, "targetname" );
|
|
var_1.fence_top_left_angles = var_4.angles;
|
|
var_1.fence_top_left = var_4.origin;
|
|
var_1.fence_top_right = var_10.origin;
|
|
var_1.fence_bottom_left = var_8.origin;
|
|
var_1.fence_bottom_right = var_9.origin;
|
|
var_1.fence_height = var_1.fence_top_left[2] - var_1.fence_bottom_left[2];
|
|
var_1.fence_center = get_center( var_4.origin, var_10.origin, var_8.origin, var_9.origin );
|
|
var_1.fence_sparks = var_3;
|
|
var_1.shock_trig = getent( var_10.target, "targetname" );
|
|
var_1.optimal_height = 100;
|
|
var_1.shock_fx["ambient"] = loadfx( "vfx/moments/alien/fence_lightning_ambient" );
|
|
var_1.shock_fx["shock"] = loadfx( "vfx/moments/alien/fence_lightning_shock" );
|
|
var_1.shock_fx["turn_on"] = loadfx( "vfx/moments/alien/fence_lightning_turn_on" );
|
|
var_1.shock_fx["sparks"] = loadfx( "fx/explosions/transformer_sparks_b_sound" );
|
|
var_1.shock_fx["sparks_sm"] = loadfx( "fx/explosions/transformer_sparks_f_sound" );
|
|
var_1.shock_bar_fx_ent = spawn( "script_origin", var_1.fence_center );
|
|
var_1.shock_bar_fx_ent setmodel( "tag_origin" );
|
|
var_1.running = 0;
|
|
var_1.capacity = 20;
|
|
var_1.max_capacity = 20;
|
|
var_1.player_damage = 2;
|
|
var_1 fence_trap_setup_sizes();
|
|
var_1.generator setcursorhint( "HINT_NOICON" );
|
|
var_1.generator sethintstring( var_1.hintstring );
|
|
var_1.generator makeusable();
|
|
|
|
if ( maps\mp\alien\_utility::alien_mode_has( "outline" ) )
|
|
maps\mp\alien\_outline_proto::add_to_outline_watch_list( var_0, var_1.cost );
|
|
|
|
return var_1;
|
|
}
|
|
|
|
fence_trap_setup_sizes()
|
|
{
|
|
var_0 = [ "small", "medium", "large" ];
|
|
var_1 = [];
|
|
var_1["small"] = 90;
|
|
var_1["medium"] = 120;
|
|
var_1["large"] = 150;
|
|
var_2 = 1;
|
|
|
|
if ( isdefined( self.generator.script_noteworthy ) )
|
|
{
|
|
if ( self.generator.script_noteworthy == "small" )
|
|
var_2 = 0;
|
|
|
|
if ( self.generator.script_noteworthy == "large" )
|
|
var_2 = 2;
|
|
|
|
if ( issubstr( self.generator.script_noteworthy, "custom" ) )
|
|
{
|
|
var_3 = strtok( self.generator.script_noteworthy, " " );
|
|
|
|
switch ( var_3[1] )
|
|
{
|
|
case "small":
|
|
var_2 = 0;
|
|
break;
|
|
case "medium":
|
|
var_2 = 1;
|
|
break;
|
|
case "large":
|
|
var_2 = 2;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
self.custom = var_3[2];
|
|
}
|
|
}
|
|
|
|
if ( maps\mp\alien\_utility::isplayingsolo() )
|
|
var_2 = int( max( 0, var_2 - 1 ) );
|
|
|
|
self.shock_damage = int( min( 800, 200 * max( 1, self.optimal_height / self.fence_height ) ) );
|
|
self.shock_interval = 0.35;
|
|
|
|
if ( var_0[var_2] == "small" )
|
|
{
|
|
self.cost = 300;
|
|
self.life_span = 90;
|
|
self.hintstring = &"ALIEN_COLLECTIBLES_ACTIVATE_FENCE_SMALL";
|
|
|
|
if ( isdefined( level.generic_electric_trap_check ) && self [[ level.generic_electric_trap_check ]]() )
|
|
self.hintstring = &"ALIEN_COLLECTIBLES_ACTIVATE_PUDDLE_SMALL";
|
|
}
|
|
|
|
if ( var_0[var_2] == "medium" )
|
|
{
|
|
self.cost = 500;
|
|
self.life_span = 120;
|
|
self.hintstring = &"ALIEN_COLLECTIBLES_ACTIVATE_FENCE_MED";
|
|
|
|
if ( isdefined( level.generic_electric_trap_check ) && self [[ level.generic_electric_trap_check ]]() )
|
|
self.hintstring = &"ALIEN_COLLECTIBLES_ACTIVATE_PUDDLE_MED";
|
|
}
|
|
|
|
if ( var_0[var_2] == "large" )
|
|
{
|
|
self.cost = 750;
|
|
self.life_span = 150;
|
|
self.hintstring = &"ALIEN_COLLECTIBLES_ACTIVATE_FENCE_LARGE";
|
|
|
|
if ( isdefined( level.generic_electric_trap_check ) && self [[ level.generic_electric_trap_check ]]() )
|
|
self.hintstring = &"ALIEN_COLLECTIBLES_ACTIVATE_PUDDLE_LARGE";
|
|
}
|
|
|
|
if ( isdefined( self.custom ) )
|
|
self.life_span = var_1[self.custom];
|
|
}
|
|
|
|
get_center( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_4 = ( var_0[0] + var_1[0] + var_2[0] + var_3[0] ) / 4;
|
|
var_5 = ( var_0[1] + var_1[1] + var_2[1] + var_3[1] ) / 4;
|
|
var_6 = ( var_0[2] + var_1[2] + var_2[2] + var_3[2] ) / 4;
|
|
return ( var_4, var_5, var_6 );
|
|
}
|
|
|
|
ambient_fence_shocks()
|
|
{
|
|
self endon( "death" );
|
|
level endon( "game_ended" );
|
|
var_0 = 0;
|
|
|
|
for (;;)
|
|
{
|
|
while ( !self.running )
|
|
{
|
|
var_0 = 0;
|
|
stopfxontag( self.shock_fx["ambient"], self.shock_bar_fx_ent, "tag_origin" );
|
|
self waittill( "electric_trap_turned_on" );
|
|
}
|
|
|
|
if ( !var_0 )
|
|
{
|
|
playfxontag( self.shock_fx["ambient"], self.shock_bar_fx_ent, "tag_origin" );
|
|
var_0 = 1;
|
|
}
|
|
|
|
var_1 = self.capacity / self.max_capacity;
|
|
var_2 = self.fence_height * var_1;
|
|
var_3 = self.fence_bottom_left + ( 0, 0, var_2 );
|
|
var_4 = self.fence_bottom_right + ( 0, 0, var_2 );
|
|
var_5 = ( self.fence_center[0], self.fence_center[1], var_4[2] );
|
|
playfx( self.shock_fx["sparks_sm"], var_3 );
|
|
wait 0.3;
|
|
playfx( self.shock_fx["sparks_sm"], var_5 );
|
|
wait 0.3;
|
|
playfx( self.shock_fx["sparks_sm"], var_4 );
|
|
|
|
if ( isdefined( self.fence_sparks ) )
|
|
{
|
|
foreach ( var_7 in self.fence_sparks )
|
|
{
|
|
playfx( self.shock_fx["sparks_sm"], var_7.origin );
|
|
wait 0.3;
|
|
}
|
|
}
|
|
|
|
debug_electric_trap_print( self.generator.origin, "Power: " + var_1, ( 0.5, 0.5, 1 ), 0.75, 3, 3 );
|
|
common_scripts\utility::waittill_any_timeout( randomintrange( 2, 3 ), "electric_trap_turned_off" );
|
|
}
|
|
}
|
|
|
|
play_fence_off_fx()
|
|
{
|
|
playfx( self.shock_fx["shock"], self.fence_top_left );
|
|
playfx( self.shock_fx["sparks"], self.fence_top_left );
|
|
playfx( self.shock_fx["shock"], self.fence_top_right );
|
|
playfx( self.shock_fx["sparks"], self.fence_top_right );
|
|
var_0 = 3;
|
|
|
|
while ( var_0 > 0 )
|
|
{
|
|
playfx( self.shock_fx["shock"], self.generator.origin );
|
|
playfx( self.shock_fx["sparks"], self.generator.origin );
|
|
var_0--;
|
|
wait 0.2;
|
|
}
|
|
}
|
|
|
|
play_fence_on_fx()
|
|
{
|
|
playfx( self.shock_fx["shock"], self.fence_top_left );
|
|
playfx( self.shock_fx["sparks"], self.fence_top_left );
|
|
playfx( self.shock_fx["shock"], self.fence_top_right );
|
|
playfx( self.shock_fx["sparks"], self.fence_top_right );
|
|
}
|
|
|
|
turret_monitoruse()
|
|
{
|
|
level endon( "game_ended" );
|
|
self setcursorhint( "HINT_NOICON" );
|
|
self makeusable();
|
|
wait 0.05;
|
|
|
|
if ( maps\mp\alien\_utility::alien_mode_has( "outline" ) )
|
|
maps\mp\alien\_outline_proto::add_to_outline_watch_list( self, 750 );
|
|
|
|
disable_turret();
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "trigger", var_0 );
|
|
|
|
if ( !isplayer( var_0 ) )
|
|
continue;
|
|
|
|
if ( var_0 maps\mp\alien\_utility::is_holding_deployable() )
|
|
{
|
|
var_0 maps\mp\_utility::setlowermessage( "cant_buy", &"ALIEN_COLLECTIBLES_PLAYER_HOLDING", 3 );
|
|
continue;
|
|
}
|
|
|
|
var_1 = int( 750 * var_0 maps\mp\alien\_perk_utility::perk_gettrapcostscalar() );
|
|
|
|
if ( !is_turret_enabled() )
|
|
{
|
|
if ( var_0 can_activate_turret() )
|
|
{
|
|
var_0 maps\mp\alien\_persistence::take_player_currency( var_1, 0, "trap" );
|
|
enable_turret();
|
|
level thread maps\mp\alien\_music_and_dialog::playvoforsentry( var_0, "minigun" );
|
|
thread monitor_player_use();
|
|
}
|
|
else
|
|
var_0 maps\mp\_utility::setlowermessage( "no_money", &"ALIEN_COLLECTIBLES_NO_MONEY", 3 );
|
|
|
|
continue;
|
|
}
|
|
|
|
self.owner = var_0;
|
|
wait_for_disable_turret();
|
|
disable_turret();
|
|
}
|
|
}
|
|
|
|
wait_for_disable_turret()
|
|
{
|
|
thread watch_bullet_fired();
|
|
self waittill( "disable_turret" );
|
|
}
|
|
|
|
watch_bullet_fired()
|
|
{
|
|
self endon( "disable_turret" );
|
|
self notify( "stop_fire_monitor" );
|
|
self endon( "stop_fire_monitor" );
|
|
var_0 = 0;
|
|
var_1 = int( 300 * self.owner maps\mp\alien\_perk_utility::perk_gettrapdurationscalar() );
|
|
self.turret_ammo = var_1;
|
|
var_2 = weaponfiretime( self.weaponinfo );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "turret_fire" );
|
|
self getturretowner() notify( "turret_fire" );
|
|
self.heatlevel = self.heatlevel + var_2;
|
|
var_0++;
|
|
self.cooldownwaittime = var_2;
|
|
self.turret_ammo = var_1 - var_0;
|
|
|
|
if ( var_0 > var_1 )
|
|
{
|
|
self.turret_ammo = 0;
|
|
break;
|
|
}
|
|
|
|
self.owner maps\mp\alien\_utility::set_turret_ammocount( self.turret_ammo );
|
|
}
|
|
|
|
if ( isdefined( self.owner ) && isalive( self.owner ) )
|
|
self.owner thread maps\mp\alien\_utility::wait_for_player_to_dismount_turret();
|
|
|
|
self notify( "disable_turret" );
|
|
}
|
|
|
|
is_turret_enabled()
|
|
{
|
|
return self.enabled;
|
|
}
|
|
|
|
disable_turret()
|
|
{
|
|
self.enabled = 0;
|
|
self sethintstring( &"ALIEN_COLLECTIBLES_ACTIVATE_TURRET" );
|
|
self turretfiredisable();
|
|
self maketurretinoperable();
|
|
}
|
|
|
|
enable_turret()
|
|
{
|
|
self.enabled = 1;
|
|
self sethintstring( "" );
|
|
self turretfireenable();
|
|
self maketurretoperable();
|
|
}
|
|
|
|
can_activate_turret()
|
|
{
|
|
return maps\mp\alien\_persistence::player_has_enough_currency( 750 );
|
|
}
|
|
|
|
monitor_player_use()
|
|
{
|
|
self endon( "turret_disabled" );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "trigger", var_0 );
|
|
|
|
if ( !isdefined( var_0 ) || !isalive( var_0 ) )
|
|
continue;
|
|
|
|
if ( var_0 maps\mp\alien\_utility::is_holding_deployable() )
|
|
{
|
|
var_0 maps\mp\_utility::setlowermessage( "cant_buy", &"ALIEN_COLLECTIBLES_PLAYER_HOLDING", 3 );
|
|
continue;
|
|
}
|
|
|
|
if ( var_0 isusingturret() )
|
|
{
|
|
self.owner = var_0;
|
|
|
|
while ( !isdefined( self.turret_ammo ) )
|
|
wait 0.05;
|
|
|
|
if ( !maps\mp\alien\_utility::is_chaos_mode() )
|
|
var_0 maps\mp\alien\_utility::disable_special_ammo();
|
|
|
|
var_0 maps\mp\alien\_utility::show_turret_icon( 2 );
|
|
var_0 maps\mp\alien\_utility::set_turret_ammocount( self.turret_ammo );
|
|
var_0 setclientomnvar( "ui_alien_turret_overheat", 0 );
|
|
thread turret_overheat_monitor( var_0 );
|
|
thread turret_cooldown_monitor();
|
|
thread clear_turret_ammo_counter_on_dismount( var_0 );
|
|
thread clear_turret_ammo_counter_on_death( var_0 );
|
|
var_0 maps\mp\_utility::setlowermessage( "disengage_turret", &"ALIEN_COLLECTIBLES_DISENGAGE_TURRET", 4 );
|
|
continue;
|
|
}
|
|
|
|
var_0 maps\mp\alien\_utility::hide_turret_icon();
|
|
|
|
if ( !maps\mp\alien\_utility::is_chaos_mode() )
|
|
var_0 maps\mp\alien\_utility::enable_special_ammo();
|
|
|
|
self.owner = undefined;
|
|
var_0 setclientomnvar( "ui_alien_turret_overheat", -1 );
|
|
var_0 maps\mp\_utility::clearlowermessage( "disengage_turret" );
|
|
}
|
|
}
|
|
|
|
turret_cooldown_monitor()
|
|
{
|
|
self endon( "death" );
|
|
self notify( "stop_cooldown_monitor" );
|
|
self endon( "stop_cooldown_monitor" );
|
|
self endon( "turret_disabled" );
|
|
|
|
for (;;)
|
|
{
|
|
if ( self.heatlevel > 0 )
|
|
{
|
|
if ( self.cooldownwaittime <= 0 )
|
|
self.heatlevel = max( 0, self.heatlevel - 0.05 );
|
|
else
|
|
self.cooldownwaittime = max( 0, self.cooldownwaittime - 0.05 );
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
turret_overheat_monitor( var_0 )
|
|
{
|
|
self notify( "overheat_monitor" );
|
|
self endon( "overheat_monitor" );
|
|
self endon( "turret_disabled" );
|
|
self.heatlevel = 0;
|
|
self.cooldownwaittime = 1;
|
|
var_0 endon( "disconnect" );
|
|
var_1 = 0;
|
|
|
|
for (;;)
|
|
{
|
|
if ( !maps\mp\_utility::isreallyalive( var_0 ) )
|
|
{
|
|
self.inuseby = undefined;
|
|
var_0 setclientomnvar( "ui_alien_turret_overheat", -1 );
|
|
break;
|
|
}
|
|
|
|
if ( !var_0 isusingturret() )
|
|
{
|
|
var_0 setclientomnvar( "ui_alien_turret_overheat", -1 );
|
|
break;
|
|
}
|
|
|
|
if ( self.heatlevel >= 2 )
|
|
var_2 = 1;
|
|
else
|
|
var_2 = self.heatlevel / 2;
|
|
|
|
var_3 = 5;
|
|
var_4 = int( var_2 * 100 );
|
|
|
|
if ( var_1 != var_4 )
|
|
{
|
|
if ( var_4 <= var_3 || abs( abs( var_1 ) - abs( var_4 ) ) > var_3 )
|
|
{
|
|
var_0 setclientomnvar( "ui_alien_turret_overheat", var_4 );
|
|
var_1 = var_4;
|
|
}
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
|
|
var_0 setclientomnvar( "ui_alien_turret_overheat", -1 );
|
|
}
|
|
|
|
clear_turret_ammo_counter_on_death( var_0 )
|
|
{
|
|
self notify( "clearammocounterondeath" );
|
|
self endon( "clearammocounterondeath" );
|
|
var_0 endon( "disconnect" );
|
|
self waittill( "turret_disabled" );
|
|
var_0 maps\mp\alien\_utility::hide_turret_icon();
|
|
var_0 maps\mp\_utility::clearlowermessage( "disengage_turret" );
|
|
}
|
|
|
|
clear_turret_ammo_counter_on_dismount( var_0 )
|
|
{
|
|
self notify( "dimountammocounter" );
|
|
self endon( "dismountammocounter" );
|
|
var_0 endon( "disconnect" );
|
|
|
|
while ( var_0 isusingturret() )
|
|
wait 0.1;
|
|
|
|
var_0 maps\mp\alien\_utility::hide_turret_icon();
|
|
self.owner = undefined;
|
|
var_0 maps\mp\_utility::clearlowermessage( "disengage_turret" );
|
|
|
|
if ( var_0 getcurrentweapon() == "none" )
|
|
var_0 thread restore_last_valid_weapon();
|
|
}
|
|
|
|
restore_last_valid_weapon()
|
|
{
|
|
var_0 = self getweaponslistprimaries();
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
if ( isdefined( var_2 ) && var_2 != "none" )
|
|
{
|
|
self switchtoweapon( var_2 );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
monitor_flare_use()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
level endon( "game_ended" );
|
|
self endon( "end_monitor_flare_use" );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "grenade_fire", var_0, var_1 );
|
|
|
|
if ( var_1 == "iw6_aliendlc21_mp" )
|
|
{
|
|
var_0 thread sticky_flare( self );
|
|
continue;
|
|
}
|
|
|
|
if ( var_1 != "alienflare_mp" )
|
|
continue;
|
|
|
|
var_0 common_scripts\utility::make_entity_sentient_mp( "allies" );
|
|
var_0.threatbias = 1000;
|
|
var_2 = var_0 common_scripts\utility::waittill_notify_or_timeout_return( "missile_stuck", 7 );
|
|
|
|
if ( isdefined( var_2 ) && var_2 == "timeout" )
|
|
{
|
|
if ( isdefined( var_0 ) )
|
|
var_0 delete();
|
|
|
|
continue;
|
|
}
|
|
|
|
var_3 = spawn( "script_model", var_0.origin );
|
|
var_0 delete();
|
|
var_3 setmodel( "mil_emergency_flare_mp" );
|
|
var_3.angles = self.angles;
|
|
var_3.owner = self;
|
|
|
|
if ( maps\mp\alien\_persistence::is_upgrade_enabled( "master_scavenger_upgrade" ) )
|
|
var_3 thread create_flare( level.spawnglow["enemy"], self );
|
|
else
|
|
var_3 thread create_flare( level.spawnglow["friendly"], self );
|
|
|
|
self takeweapon( "alienflare_mp" );
|
|
}
|
|
}
|
|
|
|
sticky_flare( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
common_scripts\utility::make_entity_sentient_mp( "allies" );
|
|
self.threatbias = 1000;
|
|
self.owner = var_0;
|
|
thread flare_out_of_playable_monitor();
|
|
thread create_flare( level._effect["sticky_flare"], var_0 );
|
|
thread sfx_flare_lp( var_0 );
|
|
self waittill( "missile_stuck", var_1 );
|
|
|
|
if ( isdefined( var_1 ) && var_1 maps\mp\alien\_utility::is_alien_agent() )
|
|
{
|
|
var_1 maps\mp\alien\_utility::enable_alien_scripted();
|
|
var_1.stuck_by_flare = 1;
|
|
var_1 setorigin( var_1.origin );
|
|
level thread wait_for_flare_finished( var_1, self );
|
|
}
|
|
else
|
|
{
|
|
var_2 = undefined;
|
|
level thread wait_for_flare_finished( var_2, self );
|
|
}
|
|
}
|
|
|
|
flare_out_of_playable_monitor()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "missile_stuck" );
|
|
wait 7;
|
|
|
|
if ( isdefined( self ) )
|
|
self delete();
|
|
}
|
|
|
|
wait_for_flare_finished( var_0, var_1 )
|
|
{
|
|
var_2 = var_1.owner;
|
|
var_1 waittill( "deleting_flare", var_3 );
|
|
var_4 = level.placeableconfigs["fuse_resin_tnt"];
|
|
playfx( level._effect["sticky_explode"], var_3 );
|
|
playsoundatpos( var_3, "flare_explode_default" );
|
|
radiusdamage( var_3, var_4.item_damage_radius, var_4.item_damage, var_4.item_damage_falloff, var_2, "MOD_EXPLOSIVE", "iw6_aliendlc22_mp" );
|
|
earthquake( 0.35, 0.5, var_3, 512 );
|
|
|
|
if ( isdefined( var_0 ) )
|
|
{
|
|
var_0 maps\mp\alien\_utility::disable_alien_scripted();
|
|
var_0.stuck_by_flare = 0;
|
|
}
|
|
}
|
|
|
|
create_flare( var_0, var_1 )
|
|
{
|
|
self endon( "death" );
|
|
wait 0.5;
|
|
var_2 = self gettagangles( "tag_fire_fx" );
|
|
playfxontag( var_0, self, "tag_fire_fx" );
|
|
self playloopsound( "emt_road_flare_burn" );
|
|
self.flaretype = 1;
|
|
|
|
if ( var_1 maps\mp\alien\_persistence::is_upgrade_enabled( "master_scavenger_upgrade" ) )
|
|
{
|
|
thread flare_attract_aliens( 30, var_1 );
|
|
wait 30;
|
|
}
|
|
else
|
|
{
|
|
thread flare_attract_aliens( 20, var_1 );
|
|
wait 20;
|
|
}
|
|
|
|
self notify( "deleting_flare", self.origin );
|
|
self delete();
|
|
}
|
|
|
|
sfx_flare_lp( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
var_1 = 0.163;
|
|
|
|
if ( var_0 maps\mp\alien\_persistence::is_upgrade_enabled( "master_scavenger_upgrade" ) )
|
|
var_2 = gettime() + 28600.0;
|
|
else
|
|
var_2 = gettime() + 18600.0;
|
|
|
|
wait 0.2;
|
|
|
|
while ( gettime() < var_2 && isdefined( self ) )
|
|
{
|
|
playsoundatpos( self.origin, "flare_beep" );
|
|
wait( var_1 );
|
|
}
|
|
|
|
playsoundatpos( self.origin, "flare_beep_end" );
|
|
}
|
|
|
|
flare_attract_aliens( var_0, var_1 )
|
|
{
|
|
var_2 = gettime() + var_0 * 1000;
|
|
var_3 = [];
|
|
|
|
while ( gettime() < var_2 && isdefined( self ) )
|
|
{
|
|
var_4 = [];
|
|
|
|
foreach ( var_6 in var_3 )
|
|
{
|
|
if ( isdefined( var_6 ) && isalive( var_6 ) )
|
|
var_4[var_4.size] = var_6;
|
|
}
|
|
|
|
var_3 = var_4;
|
|
|
|
if ( isdefined( var_1 ) )
|
|
var_8 = var_1.origin;
|
|
else
|
|
var_8 = self.origin;
|
|
|
|
var_9 = get_possible_flare_victims( var_8 );
|
|
|
|
for ( var_10 = 0; var_10 < var_9.size && var_3.size < 6; var_10++ )
|
|
{
|
|
var_6 = var_9[var_10];
|
|
|
|
if ( !var_6 should_attract_alien() )
|
|
continue;
|
|
|
|
if ( isdefined( var_6.attractor_flare ) )
|
|
continue;
|
|
|
|
var_6 maps\mp\agents\alien\_alien_think::handle_attractor_flare( self, 1 );
|
|
var_3[var_3.size] = var_6;
|
|
}
|
|
|
|
wait 0.2;
|
|
}
|
|
|
|
foreach ( var_6 in var_3 )
|
|
var_6 maps\mp\agents\alien\_alien_think::handle_attractor_flare( self, 0 );
|
|
}
|
|
|
|
get_possible_flare_victims( var_0 )
|
|
{
|
|
var_1 = 131072.0;
|
|
var_2 = maps\mp\agents\_agent_utility::getactiveagentsoftype( "alien" );
|
|
var_3 = common_scripts\utility::get_array_of_closest( var_0, var_2, undefined, undefined, 512 );
|
|
var_4 = common_scripts\utility::get_array_of_closest( self.origin, var_2, undefined, undefined, 512 );
|
|
var_5 = [];
|
|
|
|
for ( var_6 = 0; var_6 < var_3.size; var_6++ )
|
|
{
|
|
var_7 = var_3[var_6];
|
|
|
|
if ( common_scripts\utility::array_contains( var_5, var_7 ) )
|
|
continue;
|
|
|
|
var_8 = distancesquared( var_0, var_7.origin );
|
|
|
|
if ( var_8 <= var_1 )
|
|
{
|
|
var_5[var_5.size] = var_7;
|
|
continue;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
var_9 = 0;
|
|
|
|
while ( var_6 < var_3.size || var_9 < var_4.size )
|
|
{
|
|
var_10 = undefined;
|
|
|
|
for ( var_11 = undefined; var_6 < var_3.size; var_6++ )
|
|
{
|
|
var_11 = var_3[var_6];
|
|
|
|
if ( !common_scripts\utility::array_contains( var_5, var_11 ) )
|
|
{
|
|
var_10 = distancesquared( var_0, var_11.origin );
|
|
break;
|
|
}
|
|
}
|
|
|
|
while ( var_9 < var_4.size )
|
|
{
|
|
var_12 = var_4[var_9];
|
|
|
|
if ( common_scripts\utility::array_contains( var_5, var_12 ) )
|
|
{
|
|
var_9++;
|
|
continue;
|
|
}
|
|
|
|
var_13 = distancesquared( self.origin, var_12.origin );
|
|
|
|
if ( !isdefined( var_10 ) || var_13 < var_10 )
|
|
var_5[var_5.size] = var_12;
|
|
else
|
|
break;
|
|
|
|
var_9++;
|
|
}
|
|
|
|
if ( isdefined( var_10 ) )
|
|
{
|
|
var_5[var_5.size] = var_11;
|
|
var_6++;
|
|
}
|
|
}
|
|
|
|
return var_5;
|
|
}
|
|
|
|
should_attract_alien()
|
|
{
|
|
if ( maps\mp\alien\_utility::is_true( self.stuck_by_flare ) )
|
|
return 0;
|
|
|
|
switch ( maps\mp\alien\_utility::get_alien_type() )
|
|
{
|
|
case "mammoth":
|
|
case "gargoyle":
|
|
case "elite":
|
|
return 0;
|
|
default:
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
deleteondeath( var_0 )
|
|
{
|
|
self waittill( "death" );
|
|
|
|
if ( isdefined( var_0 ) )
|
|
var_0 delete();
|
|
}
|
|
|
|
easter_egg_lodge_sign()
|
|
{
|
|
level endon( "game_ended" );
|
|
level notify( "easter_egg_lodge_sign_reset" );
|
|
level endon( "easter_egg_lodge_sign_reset" );
|
|
var_0 = getent( "easter_egg_letter_l", "targetname" );
|
|
var_1 = getent( "easter_egg_letter_o", "targetname" );
|
|
var_2 = getent( "easter_egg_letter_reset", "targetname" );
|
|
|
|
if ( !isdefined( var_0 ) || !isdefined( var_1 ) || !isdefined( var_2 ) )
|
|
return;
|
|
|
|
var_2 thread watch_for_letter_reset();
|
|
|
|
for (;;)
|
|
{
|
|
var_0 waittill( "damage", var_3, var_4, var_5, var_6, var_7 );
|
|
var_8 = gettime();
|
|
|
|
if ( !is_letter_valid_hit( var_4, var_7 ) )
|
|
continue;
|
|
|
|
var_1 waittill( "damage", var_3, var_4, var_5, var_6, var_7 );
|
|
|
|
if ( !is_letter_valid_hit( var_4, var_7 ) )
|
|
continue;
|
|
|
|
var_0 waittill( "damage", var_3, var_4, var_5, var_6, var_7 );
|
|
|
|
if ( !is_letter_valid_hit( var_4, var_7 ) || gettime() - var_8 > 5000 )
|
|
continue;
|
|
|
|
wait 1;
|
|
iprintlnbold( "^5L^6O^5L" );
|
|
level.easter_egg_lodge_sign_active = 1;
|
|
wait 120;
|
|
level.easter_egg_lodge_sign_active = 0;
|
|
}
|
|
}
|
|
|
|
is_letter_valid_hit( var_0, var_1 )
|
|
{
|
|
if ( !isdefined( var_0 ) || !isplayer( var_0 ) )
|
|
return 0;
|
|
|
|
var_2 = var_0 getcurrentweapon();
|
|
|
|
if ( !isdefined( var_2 ) || var_2 != "iw6_alienvks_mp_alienvksscope" )
|
|
return 0;
|
|
|
|
var_1 = tolower( var_1 );
|
|
|
|
if ( !isdefined( var_1 ) || var_1 != "mod_rifle_bullet" )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
watch_for_letter_reset()
|
|
{
|
|
for (;;)
|
|
{
|
|
self waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
|
|
|
if ( !isdefined( var_1 ) || !isplayer( var_1 ) )
|
|
continue;
|
|
|
|
if ( isdefined( level.easter_egg_lodge_sign_active ) && level.easter_egg_lodge_sign_active )
|
|
continue;
|
|
|
|
wait 1;
|
|
return easter_egg_lodge_sign();
|
|
}
|
|
}
|