2734 lines
78 KiB
Plaintext
2734 lines
78 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
player_panic_bubbles()
|
|
{
|
|
if ( isalive( self ) )
|
|
{
|
|
if ( isdefined( self.playerfxorg ) )
|
|
playfxontag( common_scripts\utility::getfx( "scuba_bubbles_panic" ), self.playerfxorg, "tag_origin" );
|
|
}
|
|
}
|
|
|
|
keep_player_below_surface()
|
|
{
|
|
level endon( "end_swimming" );
|
|
common_scripts\utility::flag_wait( "start_swim" );
|
|
var_0 = 0.0;
|
|
var_1 = getdvarfloat( "player_swimVerticalSpeed", 95.0 ) * 2.5;
|
|
var_2 = var_1 * 25;
|
|
|
|
for (;;)
|
|
{
|
|
if ( level.water_level_z - level.player.origin[2] < 128 )
|
|
{
|
|
if ( var_0 > -1 * var_2 )
|
|
{
|
|
level.water_current = level.water_current - ( 0, 0, var_1 );
|
|
var_3 = level.water_current[0] + " " + level.water_current[1] + " " + level.water_current[2];
|
|
setsaveddvar( "player_swimWaterCurrent", var_3 );
|
|
var_0 = var_0 - var_1;
|
|
}
|
|
}
|
|
else if ( var_0 < 0 )
|
|
{
|
|
level.water_current = level.water_current + ( 0, 0, var_1 );
|
|
var_0 = var_0 + var_1;
|
|
|
|
if ( var_0 > -0.01 )
|
|
{
|
|
level.water_current = level.water_current - ( 0, 0, var_0 );
|
|
var_0 = 0;
|
|
}
|
|
|
|
var_3 = level.water_current[0] + " " + level.water_current[1] + " " + level.water_current[2];
|
|
setsaveddvar( "player_swimWaterCurrent", var_3 );
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
read_parameters()
|
|
{
|
|
if ( isdefined( self.script_moveplaybackrate ) )
|
|
{
|
|
self.moveplaybackrate = self.script_moveplaybackrate;
|
|
self.movetransitionrate = self.moveplaybackrate;
|
|
}
|
|
}
|
|
|
|
teleport_to_target()
|
|
{
|
|
var_0 = common_scripts\utility::get_target_ent();
|
|
|
|
if ( !isdefined( var_0.angles ) )
|
|
var_0.angles = self.angles;
|
|
|
|
self forceteleport( var_0.origin, var_0.angles );
|
|
|
|
if ( isdefined( var_0.target ) )
|
|
{
|
|
var_0 = var_0 common_scripts\utility::get_target_ent();
|
|
|
|
if ( isdefined( var_0.script_animation ) )
|
|
maps\ship_graveyard_stealth::stealth_idle( var_0, var_0.script_animation );
|
|
else if ( isdefined( var_0.script_idlereach ) )
|
|
stealth_idle_reach( var_0 );
|
|
else
|
|
maps\_utility::follow_path_and_animate( var_0, 0 );
|
|
}
|
|
}
|
|
|
|
stop_path_on_damage()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "path_end_reached" );
|
|
thread break_from_path();
|
|
self waittill( "damage" );
|
|
common_scripts\utility::flag_set( "stealth2_approach_guys_damaged" );
|
|
}
|
|
|
|
break_from_path()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "path_end_reached" );
|
|
common_scripts\utility::flag_wait( "stealth2_approach_guys_damaged" );
|
|
self notify( "stop_path" );
|
|
self setgoalentity( level.player );
|
|
}
|
|
|
|
stealth_idle_reach( var_0 )
|
|
{
|
|
var_1 = var_0 maps\_utility::get_last_ent_in_chain( "struct" );
|
|
self.goalradius = 128;
|
|
self.goalheight = 128;
|
|
maps\_utility::follow_path_and_animate( var_0, 0 );
|
|
maps\ship_graveyard_stealth::stealth_idle( var_1, var_1.script_animation );
|
|
}
|
|
|
|
boat_shoot_entity( var_0, var_1 )
|
|
{
|
|
if ( isdefined( var_1 ) )
|
|
level endon( var_1 );
|
|
|
|
self endon( "death" );
|
|
self endon( "stop_shooting" );
|
|
|
|
for (;;)
|
|
{
|
|
var_2 = ( self.origin[0], self.origin[1], level.water_level_z );
|
|
var_3 = 64 * anglestoforward( var_0.angles );
|
|
|
|
if ( isplayer( var_0 ) )
|
|
var_4 = var_0 geteye() + var_3;
|
|
else
|
|
var_4 = var_0.origin + var_3;
|
|
|
|
var_5 = anglestoright( self.angles );
|
|
var_6 = vectordot( var_5, var_4 - self.origin );
|
|
|
|
if ( var_6 < 0 )
|
|
var_7 = common_scripts\utility::random( [ 70, 90, 110 ] );
|
|
else
|
|
var_7 = common_scripts\utility::random( [ -70, -90, -110 ] );
|
|
|
|
var_8 = 256;
|
|
var_2 = var_2 + anglestoforward( ( 0, var_7, 0 ) ) * var_8;
|
|
var_9 = randomintrange( 5, 20 );
|
|
|
|
for ( var_10 = 0; var_10 < var_9; var_10++ )
|
|
{
|
|
var_11 = var_2 + ( randomfloatrange( -30, 30 ), randomfloatrange( -30, 30 ), 0 );
|
|
var_12 = var_4 + common_scripts\utility::randomvectorrange( -24, 24 );
|
|
var_13 = vectortoangles( var_12 - var_11 );
|
|
var_14 = anglestoup( var_13 );
|
|
var_15 = ( 90, 0, 0 );
|
|
playfx( common_scripts\utility::getfx( "underwater_surface_splash_bullet" ), ( var_11[0], var_11[1], level.water_level_z - 1 ), anglestoforward( var_15 ), anglestoup( var_15 ) );
|
|
magicbullet( "aps_underwater", var_11, var_12 );
|
|
wait( randomfloatrange( 0.3, 0.4 ) );
|
|
}
|
|
|
|
wait( randomfloatrange( 2, 6 ) );
|
|
}
|
|
}
|
|
|
|
underwater_setup()
|
|
{
|
|
level.f_min = [];
|
|
level.f_max = [];
|
|
level.player.breathing_overlay = [];
|
|
thread overlay_manage( "gasmask_overlay", -98 );
|
|
thread overlay_manage( "halo_overlay_scuba_steam", -100 );
|
|
level.f_min["halo_overlay_scuba_steam"] = 0.35;
|
|
level.f_max["halo_overlay_scuba_steam"] = 0.95;
|
|
level.player.breathing_overlay["halo_overlay_scuba_steam"].alpha = 1;
|
|
common_scripts\utility::flag_wait( "start_swim" );
|
|
level.baker thread maps\_swim_ai::enable_swim();
|
|
playfxontag( common_scripts\utility::getfx( "silt_ground_kickup_runner" ), level.baker, "tag_origin" );
|
|
var_0 = getentarray( "marker_deleteme", "targetname" );
|
|
common_scripts\utility::array_call( var_0, ::delete );
|
|
level.player maps\_swim_player::enable_player_swim();
|
|
level.player thread maps\ship_graveyard_fx::water_particulates();
|
|
setsaveddvar( "glass_angular_vel", "1 5" );
|
|
setsaveddvar( "glass_linear_vel", "20 40" );
|
|
setsaveddvar( "glass_fall_gravity", 25 );
|
|
setsaveddvar( "glass_simple_duration", 20000 );
|
|
setsaveddvar( "bg_viewKickMax", 20 );
|
|
setsaveddvar( "g_gravity", 30 );
|
|
setsaveddvar( "sm_sunshadowscale", 0.65 );
|
|
setsaveddvar( "sm_sunsamplesizeNear", 0.25 );
|
|
setsaveddvar( "actionSlotsHide", 1 );
|
|
setsaveddvar( "player_swimVerticalSpeed", 80 );
|
|
|
|
if ( !is_demo_check() )
|
|
playfxontag( common_scripts\utility::getfx( "vfx_scrnfx_water_distortion" ), level.player.scubamask_distortion, "tag_origin" );
|
|
|
|
thread keep_player_below_surface();
|
|
thread baker_killfirms();
|
|
level.player thread shark_heartbeat();
|
|
thread track_shark_flag();
|
|
thread track_shark_warning();
|
|
level.player thread player_get_closest_node();
|
|
|
|
if ( maps\_utility::is_gen4() )
|
|
maps\_art::dof_set_base( 1, 200, 5, 700, 2500, 3, 0.0 );
|
|
else
|
|
maps\_art::dof_set_base( 0, 0, 5, 700, 2500, 3, 0.0 );
|
|
}
|
|
|
|
track_shark_warning()
|
|
{
|
|
level endon( "shark_eating_player" );
|
|
common_scripts\utility::flag_wait_either( "shark_warn_player", "baker_warn_player" );
|
|
maps\_utility::smart_radio_dialogue( "shipg_bkr_openwatersoutthere" );
|
|
wait 10;
|
|
|
|
for (;;)
|
|
{
|
|
common_scripts\utility::flag_wait( "shark_warn_player" );
|
|
maps\_utility::smart_radio_dialogue( "shipg_bkr_wandering" );
|
|
wait 10;
|
|
|
|
if ( common_scripts\utility::flag( "shark_warn_player" ) )
|
|
childthread shark_eat_wandering_player();
|
|
}
|
|
}
|
|
|
|
shark_eat_wandering_player()
|
|
{
|
|
level endon( "shark_warn_player" );
|
|
wait 5;
|
|
common_scripts\utility::flag_set( "shark_force_eat_player" );
|
|
}
|
|
|
|
track_shark_flag()
|
|
{
|
|
wait 0.1;
|
|
common_scripts\utility::flag_clear( "shark_force_eat_player" );
|
|
wait 0.1;
|
|
common_scripts\utility::flag_wait( "shark_force_eat_player" );
|
|
|
|
if ( level.deadly_sharks.size > 0 )
|
|
{
|
|
wait 0.5;
|
|
level.deadly_sharks = common_scripts\utility::array_removeundefined( level.deadly_sharks );
|
|
|
|
if ( level.deadly_sharks.size > 0 )
|
|
{
|
|
var_0 = sortbydistance( level.deadly_sharks, level.player.origin );
|
|
|
|
if ( distance( var_0[0].origin, level.player.origin ) < 800 )
|
|
{
|
|
var_0[0] shark_kill_player();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
shark_kill_front();
|
|
}
|
|
|
|
shark_heartbeat()
|
|
{
|
|
common_scripts\utility::flag_init( "player_near_shark" );
|
|
level.heartbeat_delay = 2.25;
|
|
thread track_sharks();
|
|
|
|
for (;;)
|
|
{
|
|
if ( ( common_scripts\utility::flag( "player_near_shark" ) || common_scripts\utility::flag( "shark_warn_player" ) ) && ( !common_scripts\utility::flag( "no_shark_heartbeat" ) || common_scripts\utility::flag( "shark_eating_player" ) ) )
|
|
{
|
|
level.player thread maps\_utility::play_sound_on_entity( "shipg_shark_warning" );
|
|
level.player common_scripts\utility::delaycall( 0.2, ::playrumbleonentity, "damage_light" );
|
|
wait( level.heartbeat_delay );
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
heartbeat_rumble()
|
|
{
|
|
level.player playrumbleonentity( "heavy_3s" );
|
|
wait 0.1;
|
|
stopallrumbles();
|
|
wait 0.05;
|
|
level.player playrumbleonentity( "light_1s" );
|
|
wait 0.1;
|
|
stopallrumbles();
|
|
}
|
|
|
|
track_sharks()
|
|
{
|
|
level.shark_heartbeat_distances = [ 400, 250, 200, 150 ];
|
|
|
|
for (;;)
|
|
{
|
|
level.deadly_sharks = common_scripts\utility::array_removeundefined( level.deadly_sharks );
|
|
level.deadly_sharks = sortbydistance( level.deadly_sharks, level.player.origin );
|
|
common_scripts\utility::flag_clear( "player_near_shark" );
|
|
level.heartbeat_delay = 2.25;
|
|
|
|
foreach ( var_1 in level.deadly_sharks )
|
|
{
|
|
var_2 = min( distance( level.player.origin, var_1.origin ), distance( level.player.origin, var_1 gettagorigin( "j_jaw" ) ) );
|
|
|
|
if ( var_2 < level.shark_heartbeat_distances[0] && isdefined( var_1 ) && isalive( var_1 ) )
|
|
{
|
|
common_scripts\utility::flag_set( "player_near_shark" );
|
|
|
|
if ( var_2 < level.shark_heartbeat_distances[1] )
|
|
level.heartbeat_delay = 1.25;
|
|
|
|
if ( var_2 < level.shark_heartbeat_distances[2] )
|
|
level.heartbeat_delay = 0.75;
|
|
|
|
if ( var_2 < level.shark_heartbeat_distances[3] )
|
|
level.heartbeat_delay = 0.5;
|
|
|
|
wait( level.heartbeat_delay );
|
|
break;
|
|
}
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
player_not_obstructed( var_0 )
|
|
{
|
|
var_1 = level.player geteye();
|
|
var_2 = level.player getplayerangles();
|
|
var_3 = anglestoforward( var_2 );
|
|
var_4 = bullettrace( var_1, var_1 + var_3 * var_0, 1, level.player );
|
|
return var_4["fraction"] == 1;
|
|
}
|
|
|
|
overlay_manage( var_0, var_1 )
|
|
{
|
|
var_2 = "destory_" + var_0;
|
|
level endon( var_2 );
|
|
level.f_min[var_0] = 0.3;
|
|
level.f_max[var_0] = 0.65;
|
|
var_3 = maps\_hud_util::create_client_overlay( var_0, level.f_min[var_0], level.player );
|
|
var_3.foreground = 0;
|
|
var_3.sort = var_1;
|
|
var_3.alpha = level.f_min[var_0];
|
|
level.player.breathing_overlay[var_0] = var_3;
|
|
var_3 thread delete_on_notify( var_2 );
|
|
|
|
if ( is_demo_check() )
|
|
return;
|
|
|
|
for (;;)
|
|
{
|
|
level.player waittill( "scuba_breathe_sound_starting" );
|
|
var_3 maps\_hud_util::fade_over_time( level.f_max[var_0], 1.1 );
|
|
wait 0.7;
|
|
var_3 maps\_hud_util::fade_over_time( level.f_min[var_0], 2.3 );
|
|
}
|
|
}
|
|
|
|
sun_manage()
|
|
{
|
|
level endon( "stop_sun_movement" );
|
|
var_0 = getmapsundirection();
|
|
var_1 = var_0;
|
|
var_2 = 0;
|
|
var_3 = 0.1;
|
|
|
|
for (;;)
|
|
{
|
|
var_4 = randomfloatrange( 0.2, 0.4 );
|
|
var_5 = var_0 + ( sin( var_2 ) * var_3, cos( var_2 ) * var_3, 0 );
|
|
lerpsundirection( var_1, var_5, var_4 );
|
|
var_2 = ( var_2 + 1 ) % 360;
|
|
wait( var_4 - 0.05 );
|
|
var_1 = var_5;
|
|
}
|
|
}
|
|
|
|
salvage_cargo_setup()
|
|
{
|
|
self.linked_ents = common_scripts\utility::get_linked_ents();
|
|
self hide();
|
|
|
|
foreach ( var_1 in self.linked_ents )
|
|
{
|
|
var_1 linkto( self );
|
|
var_1 hide();
|
|
}
|
|
}
|
|
|
|
salvage_cargo_show()
|
|
{
|
|
self show();
|
|
|
|
foreach ( var_1 in self.linked_ents )
|
|
var_1 show();
|
|
}
|
|
|
|
salvage_cargo_rise( var_0 )
|
|
{
|
|
self endon( "deleted" );
|
|
self.balloon_count = level.balloon_count;
|
|
level.balloon_count = level.balloon_count + 1;
|
|
var_1 = common_scripts\utility::get_linked_ents();
|
|
common_scripts\utility::array_call( var_1, ::linkto, self );
|
|
self.linked = var_1;
|
|
var_2 = getentarray( self.target, "targetname" );
|
|
self.path_clip = [];
|
|
self.delete_things = [];
|
|
self.damage_detect = self;
|
|
|
|
foreach ( var_4 in var_2 )
|
|
{
|
|
switch ( var_4.script_noteworthy )
|
|
{
|
|
case "bottom":
|
|
self.bottom = var_4;
|
|
self.bottom_target = self.bottom common_scripts\utility::get_target_ent();
|
|
var_5 = self.origin[2] - self.bottom.origin[2];
|
|
self.land_pos = self.bottom_target.origin + ( 0, 0, var_5 );
|
|
break;
|
|
case "path_clip":
|
|
self.path_clip = common_scripts\utility::array_add( self.path_clip, var_4 );
|
|
break;
|
|
}
|
|
}
|
|
|
|
foreach ( var_8 in var_1 )
|
|
{
|
|
if ( isdefined( var_8.script_noteworthy ) )
|
|
{
|
|
switch ( var_8.script_noteworthy )
|
|
{
|
|
case "damage_detect":
|
|
self.damage_detect = var_8;
|
|
case "delete_on_explode":
|
|
self.delete_things = common_scripts\utility::array_add( self.delete_things, var_8 );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
common_scripts\utility::waitframe();
|
|
salvage_cargo_show();
|
|
|
|
foreach ( var_11 in self.path_clip )
|
|
{
|
|
var_11 notsolid();
|
|
var_11 connectpaths();
|
|
}
|
|
|
|
var_13 = ( self.origin[0], self.origin[1], level.water_level_z - 24 );
|
|
var_14 = self.origin;
|
|
var_15 = distance( var_14, var_13 );
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
var_0 = 40;
|
|
|
|
var_16 = var_15 / var_0;
|
|
self moveto( var_13, var_16, var_16 * 0.15, var_16 * 0.1 );
|
|
self.damage_detect setcandamage( 1 );
|
|
self.damage_detect.health = 1;
|
|
|
|
while ( self.damage_detect.health > 0 )
|
|
self.damage_detect waittill( "damage", var_17, var_18, var_19, var_13, var_20 );
|
|
|
|
playfx( common_scripts\utility::getfx( "shpg_underwater_bubble_explo" ), self.origin + ( 0, 0, 64 ) );
|
|
thread common_scripts\utility::play_sound_in_space( "underwater_balloon_pop", self.origin );
|
|
self hide();
|
|
|
|
foreach ( var_22 in self.delete_things )
|
|
var_22 delete();
|
|
|
|
badplace_cylinder( "balloon" + self.balloon_count, 5, self.bottom.origin, 128, 128 );
|
|
|
|
foreach ( var_11 in self.path_clip )
|
|
{
|
|
var_11 solid();
|
|
var_11 disconnectpaths();
|
|
}
|
|
|
|
var_26 = getaiarray( "axis" );
|
|
|
|
foreach ( var_28 in var_26 )
|
|
{
|
|
if ( distance2d( self.origin, var_28.origin ) < 128 )
|
|
{
|
|
var_28 thread maps\_utility::notify_delay( "ai_event", randomfloatrange( 0.2, 0.4 ) );
|
|
var_28.health = 1;
|
|
var_28.baseaccuracy = 0.3;
|
|
var_28 setthreatbiasgroup( "easy_kills" );
|
|
}
|
|
}
|
|
|
|
moveto_speed( self.land_pos, 50, 0.3, 0.0 );
|
|
playfx( common_scripts\utility::getfx( "underwater_impact_vehicle_cheap" ), self.land_pos, ( 0, 0, 1 ), ( 1, 0, 0 ) );
|
|
thread common_scripts\utility::play_sound_in_space( "underwater_balloon_crate_hit_bottom", self.land_pos );
|
|
earthquake( 0.3, 0.6, self.land_pos, 512 );
|
|
}
|
|
|
|
vehicle_setup()
|
|
{
|
|
switch ( self.classname )
|
|
{
|
|
case "script_vehicle_submarine_minisub":
|
|
thread sdv_setup();
|
|
thread notify_spotted_on_damage();
|
|
break;
|
|
case "script_vehicle_zodiac_underneath":
|
|
thread zodiac_setup( 1 );
|
|
break;
|
|
case "script_vehicle_missile_boat_under":
|
|
thread zodiac_setup( 0 );
|
|
break;
|
|
}
|
|
}
|
|
|
|
sdv_setup()
|
|
{
|
|
self startignoringspotlight();
|
|
maps\_utility::ent_flag_set( "moving" );
|
|
maps\_utility::ent_flag_set( "lights" );
|
|
self endon( "death" );
|
|
level.player endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
if ( level.player istouching( self ) || sdv_run_over_player() )
|
|
level.player dodamage( 100, self.origin, self );
|
|
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
}
|
|
|
|
sdv_run_over_player()
|
|
{
|
|
var_0 = self gettagorigin( "tag_body" );
|
|
var_1 = self gettagangles( "tag_body" );
|
|
var_2 = anglestoforward( var_1 );
|
|
var_3 = vectornormalize( level.player.origin - var_0 );
|
|
var_4 = vectordot( var_3, var_2 );
|
|
return var_4 > 0.8 && distance( level.player.origin, var_0 ) < 128;
|
|
}
|
|
|
|
zodiac_setup( var_0 )
|
|
{
|
|
if ( !isdefined( self.hasstarted ) || !self.hasstarted )
|
|
common_scripts\utility::waittill_either( "newpath", "start_vehiclepath" );
|
|
|
|
if ( isdefined( var_0 ) )
|
|
{
|
|
if ( var_0 )
|
|
{
|
|
var_1 = common_scripts\utility::spawn_tag_origin();
|
|
self.fx_tag_prop_wash = var_1;
|
|
self.fx_tag_prop_wash linkto( self, "TAG_PROPELLER_FX", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
playfxontag( common_scripts\utility::getfx( "prop_wash" ), self.fx_tag_prop_wash, "tag_origin" );
|
|
}
|
|
else
|
|
{
|
|
var_1 = common_scripts\utility::spawn_tag_origin();
|
|
self.fx_tag_prop_wash1 = var_1;
|
|
self.fx_tag_prop_wash1 linkto( self, "TAG_PROPELLER_FX_LEFT", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
playfxontag( common_scripts\utility::getfx( "prop_wash" ), self.fx_tag_prop_wash1, "tag_origin" );
|
|
var_1 = common_scripts\utility::spawn_tag_origin();
|
|
self.fx_tag_prop_wash2 = var_1;
|
|
self.fx_tag_prop_wash2 linkto( self, "TAG_PROPELLER_FX_RIGHT", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
playfxontag( common_scripts\utility::getfx( "prop_wash" ), self.fx_tag_prop_wash2, "tag_origin" );
|
|
}
|
|
}
|
|
|
|
maps\_vehicle::godon();
|
|
var_1 = common_scripts\utility::spawn_tag_origin();
|
|
self.fx_tag = var_1;
|
|
self.fx_tag linkto( self, "tag_fx_water_splash2", ( 0, 0, 10 ), ( 0, 0, 180 ) );
|
|
playfxontag( common_scripts\utility::getfx( "boat_trail" ), self.fx_tag, "tag_origin" );
|
|
var_1 = common_scripts\utility::spawn_tag_origin();
|
|
self.fx_tag2 = var_1;
|
|
self.fx_tag2 linkto( self, "tag_fx_water_splash1", ( 90, 0, 10 ), ( 0, 0, 180 ) );
|
|
playfxontag( common_scripts\utility::getfx( "boat_trail" ), self.fx_tag2, "tag_origin" );
|
|
var_1 = common_scripts\utility::spawn_tag_origin();
|
|
self.wake_org = var_1;
|
|
self.wake_org linkto( self, "tag_fx_water_splash2", ( 0, 0, 10 ), ( 90, -90, 180 ) );
|
|
thread zodiac_wake( self.wake_org );
|
|
common_scripts\utility::waittill_any( "death", "reached_end_node" );
|
|
self.fx_tag delete();
|
|
self.fx_tag2 delete();
|
|
self.wake_org delete();
|
|
|
|
if ( isdefined( self.fx_tag_prop_wash ) )
|
|
self.fx_tag_prop_wash delete();
|
|
|
|
if ( isdefined( self.fx_tag_prop_wash1 ) )
|
|
{
|
|
self.fx_tag_prop_wash1 delete();
|
|
self.fx_tag_prop_wash2 delete();
|
|
}
|
|
}
|
|
|
|
zodiac_wake( var_0 )
|
|
{
|
|
self endon( "reached_end_node" );
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
playfxontag( common_scripts\utility::getfx( "wake_med" ), var_0, "tag_origin" );
|
|
wait 0.3;
|
|
}
|
|
}
|
|
|
|
lcs_setup()
|
|
{
|
|
var_0 = common_scripts\utility::spawn_tag_origin();
|
|
self.wake_org = var_0;
|
|
self.wake_org linkto( self, "TAG_SPLASH_BACK", ( 0, 0, 10 ), ( 90, -90, 180 ) );
|
|
thread lcs_wake( self.wake_org );
|
|
self waittill( "death" );
|
|
|
|
if ( isdefined( self.wake_org ) )
|
|
self.wake_org delete();
|
|
}
|
|
|
|
lcs_intro_setup()
|
|
{
|
|
var_0 = common_scripts\utility::spawn_tag_origin();
|
|
self.wake_org = var_0;
|
|
self.wake_org linkto( self, "TAG_SPLASH_BACK", ( 0, 0, 10 ), ( 90, -90, 180 ) );
|
|
thread lcs_wake_intro( self.wake_org );
|
|
common_scripts\utility::waittill_any( "start_swim", "reached_end_node", "death" );
|
|
|
|
if ( isdefined( self.wake_org ) )
|
|
self.wake_org delete();
|
|
}
|
|
|
|
lcs_wake( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
playfxontag( common_scripts\utility::getfx( "wake_lg" ), var_0, "tag_origin" );
|
|
wait 1.0;
|
|
}
|
|
}
|
|
|
|
lcs_wake_intro( var_0 )
|
|
{
|
|
self endon( "reached_end_node" );
|
|
self endon( "death" );
|
|
self endon( "start_swim" );
|
|
|
|
for (;;)
|
|
{
|
|
playfxontag( common_scripts\utility::getfx( "vfx_boat_wake_lcs_abovewater" ), var_0, "tag_origin" );
|
|
wait 0.6;
|
|
}
|
|
}
|
|
|
|
littoral_ship_lights()
|
|
{
|
|
self.target_points = [];
|
|
lcs_lights_front();
|
|
lcs_lights_back();
|
|
thread add_lcs_target( ( -174, 101, -47 ) );
|
|
}
|
|
|
|
lcs_lights_front()
|
|
{
|
|
thread spawn_tag_fx( "circle_glow_w_beam_lg", "tag_origin", ( -406, -160, -10 ), ( 90, 0, 0 ) );
|
|
thread spawn_tag_fx( "circle_glow_w_beam_lg", "tag_origin", ( -134, -160, -10 ), ( 90, 0, 0 ) );
|
|
thread spawn_tag_fx( "circle_glow_w_beam_lg", "tag_origin", ( -406, 160, -10 ), ( 90, 0, 0 ) );
|
|
thread spawn_tag_fx( "circle_glow_w_beam_lg", "tag_origin", ( -134, 160, -10 ), ( 90, 0, 0 ) );
|
|
}
|
|
|
|
lcs_lights_back()
|
|
{
|
|
thread spawn_tag_fx( "circle_glow_w_beam_lg", "tag_origin", ( -698, -160, -10 ), ( 90, 0, 0 ) );
|
|
thread spawn_tag_fx( "circle_glow_w_beam_lg", "tag_origin", ( -698, 160, -10 ), ( 90, 0, 0 ) );
|
|
}
|
|
|
|
add_lcs_target( var_0 )
|
|
{
|
|
var_1 = common_scripts\utility::spawn_tag_origin();
|
|
self.target_points = common_scripts\utility::array_add( self.target_points, var_1 );
|
|
var_1 linkto( self, "tag_origin", var_0, ( 0, 0, 0 ) );
|
|
self waittill( "death" );
|
|
var_1 delete();
|
|
}
|
|
|
|
add_headlamp()
|
|
{
|
|
if ( self.team == "axis" && isai( self ) && self.type != "dog" )
|
|
thread spawn_tag_fx( "vfx_headlamp_enemy_diver", "j_head_end", ( 0, -5, 0 ), ( 0, -90, 0 ) );
|
|
}
|
|
|
|
spawn_tag_fx( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_4 = common_scripts\utility::spawn_tag_origin();
|
|
var_4 linkto( self, var_1, var_2, var_3 );
|
|
playfxontag( common_scripts\utility::getfx( var_0 ), var_4, "tag_origin" );
|
|
self waittill( "death" );
|
|
|
|
if ( !maps\_vehicle::isvehicle() && !isdefined( self.script_parameters ) )
|
|
var_4 thread headlamp_death_blink( common_scripts\utility::getfx( var_0 ) );
|
|
else
|
|
var_4 delete();
|
|
}
|
|
|
|
headlamp_death_blink( var_0 )
|
|
{
|
|
playfxontag( common_scripts\utility::getfx( "shpg_enm_death_bubbles_a" ), self, "tag_origin" );
|
|
|
|
for ( var_1 = 0; var_1 < randomintrange( 5, 12 ); var_1++ )
|
|
{
|
|
var_2 = common_scripts\utility::getfx( "rebreather_hose_bubbles" );
|
|
playfxontag( var_2, self, "tag_origin" );
|
|
playfxontag( var_0, self, "tag_origin" );
|
|
wait( randomfloatrange( 0.05, 0.1 ) );
|
|
stopfxontag( var_0, self, "tag_origin" );
|
|
wait( randomfloatrange( 0.05, 0.1 ) );
|
|
}
|
|
|
|
for ( var_1 = 0; var_1 < randomintrange( 1, 8 ); var_1++ )
|
|
{
|
|
var_2 = common_scripts\utility::getfx( "rebreather_hose_bubbles" );
|
|
playfxontag( var_2, self, "tag_origin" );
|
|
wait( randomfloatrange( 0.1, 0.2 ) );
|
|
}
|
|
|
|
self delete();
|
|
}
|
|
|
|
sdv_patrol_setup()
|
|
{
|
|
self vehicle_turnengineoff();
|
|
self startignoringspotlight();
|
|
self.light_tag thread spot_light( "spotlight_underwater", "spotlight_underwater_cheap", "tag_origin" );
|
|
self waittill( "death" );
|
|
|
|
if ( isdefined( level.last_spot_light ) )
|
|
{
|
|
if ( isdefined( level.last_spot_light.entity ) && level.last_spot_light.entity == self.light_tag )
|
|
{
|
|
wait 0.05;
|
|
stop_last_spot_light();
|
|
}
|
|
}
|
|
}
|
|
|
|
sdv_silt_kickup()
|
|
{
|
|
self vehicle_turnengineoff();
|
|
playfxontag( common_scripts\utility::getfx( "silt_ground_kickup_runner" ), self, "TAG_PROPELLER" );
|
|
}
|
|
|
|
set_start_positions( var_0 )
|
|
{
|
|
var_1 = common_scripts\utility::getstructarray( var_0, "targetname" );
|
|
|
|
foreach ( var_3 in var_1 )
|
|
{
|
|
if ( isdefined( level.player_rig ) && var_3.script_noteworthy == "player" )
|
|
{
|
|
level.player_rig unlink();
|
|
level.player_rig.origin = var_3.origin;
|
|
}
|
|
|
|
switch ( var_3.script_noteworthy )
|
|
{
|
|
case "player":
|
|
level.player setorigin( var_3.origin );
|
|
level.player setplayerangles( var_3.angles );
|
|
break;
|
|
case "baker":
|
|
level.baker forceteleport( var_3.origin, var_3.angles );
|
|
level.baker setgoalpos( var_3.origin );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
spawn_baker()
|
|
{
|
|
var_0 = common_scripts\utility::get_target_ent( "baker" );
|
|
level.baker = var_0 maps\_utility::spawn_ai( 1 );
|
|
level.baker thread maps\_utility::magic_bullet_shield();
|
|
level.baker.animname = "baker";
|
|
level.baker.name = "Keegan";
|
|
level.baker.script_friendname = "Keegan";
|
|
thread baker_glint();
|
|
}
|
|
|
|
baker_glint()
|
|
{
|
|
level.baker.glint_org = common_scripts\utility::spawn_tag_origin();
|
|
level.baker.glint_org.origin = level.baker gettagorigin( "tag_stowed_back" );
|
|
level.baker.glint_org linkto( level.baker, "tag_stowed_back", ( 7, 3, 3 ), ( 0, 0, 0 ) );
|
|
level.baker.icon = newhudelem();
|
|
level.baker.icon setshader( "blank", 1, 1 );
|
|
level.baker.icon setwaypoint( 0, 1, 1 );
|
|
level.baker.icon setwaypointiconoffscreenonly();
|
|
level.baker.icon settargetent( level.baker );
|
|
level.baker.icon.alpha = 0.6;
|
|
setsaveddvar( "r_hudOutlineAlpha0", 0.35 );
|
|
level.baker endon( "death" );
|
|
level endon( "end_swimming" );
|
|
common_scripts\utility::flag_wait( "start_swim" );
|
|
baker_glint_on();
|
|
|
|
for (;;)
|
|
{
|
|
if ( isdefined( level.baker ) )
|
|
{
|
|
if ( level.baker.back_light_on )
|
|
playfxontag( common_scripts\utility::getfx( "ai_marker_light" ), level.baker.glint_org, "tag_origin" );
|
|
|
|
var_0 = 0.75;
|
|
wait( var_0 );
|
|
}
|
|
|
|
wait 0.2;
|
|
}
|
|
}
|
|
|
|
baker_glint_off()
|
|
{
|
|
level.baker notify( "glint_off" );
|
|
level.baker.back_light_on = 0;
|
|
level.baker.icon fadeovertime( 0.5 );
|
|
level.baker.icon.alpha = 0.0;
|
|
}
|
|
|
|
baker_glint_on()
|
|
{
|
|
level.baker notify( "glint_on" );
|
|
level.baker.back_light_on = 1;
|
|
level.baker.icon fadeovertime( 0.5 );
|
|
level.baker.icon.alpha = 0.6;
|
|
thread turn_off_glint_when_player_looks();
|
|
}
|
|
|
|
turn_off_glint_when_player_looks()
|
|
{
|
|
level.baker endon( "glint_on" );
|
|
level.baker endon( "glint_off" );
|
|
var_0 = 450;
|
|
|
|
for (;;)
|
|
{
|
|
wait 1;
|
|
|
|
if ( distance( level.player.origin, level.baker.origin ) > var_0 )
|
|
level.baker.back_light_on = 1;
|
|
|
|
while ( distance( level.player.origin, level.baker.origin ) > var_0 )
|
|
wait 0.1;
|
|
|
|
level.baker maps\_utility::waittill_player_lookat_for_time( 3, 0.7 );
|
|
|
|
if ( distance( level.player.origin, level.baker.origin ) <= var_0 )
|
|
level.baker.back_light_on = 0;
|
|
|
|
wait 1;
|
|
|
|
while ( distance( level.player.origin, level.baker.origin ) <= var_0 )
|
|
wait 0.1;
|
|
}
|
|
}
|
|
|
|
jump_into_water()
|
|
{
|
|
if ( !isdefined( level.total_jumpers ) )
|
|
level.total_jumpers = [];
|
|
|
|
level.total_jumpers = common_scripts\utility::array_add( level.total_jumpers, self );
|
|
var_0 = undefined;
|
|
var_1 = undefined;
|
|
|
|
if ( isdefined( self.target ) )
|
|
{
|
|
var_1 = common_scripts\utility::get_target_ent();
|
|
var_0 = var_1.origin;
|
|
}
|
|
|
|
thread maps\_swim_ai::jumpintowater( var_0 );
|
|
}
|
|
|
|
paired_death_restart()
|
|
{
|
|
level notify( "paired_death_restart" );
|
|
level.paired_death_group = [];
|
|
level.paired_death_max_distance = 700;
|
|
}
|
|
|
|
paired_death_think( var_0 )
|
|
{
|
|
level endon( "paired_death_restart" );
|
|
thread paired_death_add();
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "damage", var_1, var_2 );
|
|
|
|
if ( var_2 != level.player )
|
|
return;
|
|
else
|
|
break;
|
|
}
|
|
|
|
self.gotshot = 1;
|
|
var_3 = self.origin;
|
|
|
|
if ( !isdefined( var_3 ) )
|
|
return;
|
|
|
|
wait 0.1;
|
|
|
|
if ( level.paired_death_group.size > 0 )
|
|
{
|
|
var_4 = level.paired_death_group;
|
|
var_4 = maps\_utility::array_removedead( var_4 );
|
|
var_4 = sortbydistance( var_4, var_3 );
|
|
|
|
foreach ( var_6 in var_4 )
|
|
{
|
|
if ( var_6 != self )
|
|
{
|
|
if ( distance2d( var_6.origin, var_3 ) < level.paired_death_max_distance && !isdefined( var_6.gotshot ) )
|
|
{
|
|
var_0 stealth_shot( var_6 );
|
|
level notify( "other_guy_died" );
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
paired_death_wait_flag( var_0 )
|
|
{
|
|
if ( common_scripts\utility::flag( var_0 ) )
|
|
return;
|
|
|
|
level endon( var_0 );
|
|
|
|
while ( level.paired_death_group.size > 0 )
|
|
wait 0.05;
|
|
|
|
thread common_scripts\utility::flag_set( var_0 );
|
|
}
|
|
|
|
paired_death_wait()
|
|
{
|
|
while ( level.paired_death_group.size > 0 )
|
|
wait 0.05;
|
|
}
|
|
|
|
paired_death_add()
|
|
{
|
|
if ( !isdefined( level.paired_death_group ) )
|
|
level.paired_death_group = [];
|
|
|
|
level.paired_death_group[level.paired_death_group.size] = self;
|
|
self waittill( "death" );
|
|
level.paired_death_group = common_scripts\utility::array_remove( level.paired_death_group, self );
|
|
}
|
|
|
|
stealth_shot( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
var_0 endon( "death" );
|
|
thread stealth_shot_accuracy( var_0 );
|
|
self.favoriteenemy = var_0;
|
|
self getenemyinfo( var_0 );
|
|
var_0.dontattackme = undefined;
|
|
wait 0.4;
|
|
var_1 = self gettagorigin( "tag_flash" );
|
|
var_2 = var_0 gettagorigin( "j_head" );
|
|
magicbullet( self.weapon, var_1, var_2 );
|
|
wait 0.1;
|
|
var_1 = self gettagorigin( "tag_flash" );
|
|
var_2 = var_0 gettagorigin( "j_head" );
|
|
magicbullet( self.weapon, var_1, var_2 );
|
|
var_0 kill( var_0.origin, self );
|
|
magicbullet( self.weapon, var_1, var_2 + ( randomint( 5 ), randomint( 5 ), randomint( 5 ) ) );
|
|
wait 0.05;
|
|
magicbullet( self.weapon, var_1, var_2 + ( randomint( 5 ), randomint( 5 ), randomint( 5 ) ) );
|
|
wait 0.05;
|
|
magicbullet( self.weapon, var_1, var_2 + ( randomint( 5 ), randomint( 5 ), randomint( 5 ) ) );
|
|
wait 0.05;
|
|
magicbullet( self.weapon, var_1, var_2 + ( randomint( 5 ), randomint( 5 ), randomint( 5 ) ) );
|
|
wait 0.05;
|
|
var_3 = randomint( 5 );
|
|
var_4 = randomint( 5 );
|
|
var_5 = randomint( 5 );
|
|
magicbullet( self.weapon, var_1, var_2 + ( var_3, var_4, var_5 ) );
|
|
wait 0.05;
|
|
magicbullet( self.weapon, var_1, var_2 + ( var_3, var_4, var_5 ) );
|
|
}
|
|
|
|
stealth_shot_accuracy( var_0 )
|
|
{
|
|
var_1 = self.baseaccuracy;
|
|
self.baseaccuracy = 9999;
|
|
var_0 waittill( "death" );
|
|
self.baseaccuracy = var_1;
|
|
}
|
|
|
|
moveto_speed( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_4 = self.origin;
|
|
var_5 = distance( var_4, var_0 );
|
|
var_6 = var_5 / var_1;
|
|
|
|
if ( !isdefined( var_2 ) )
|
|
var_2 = 0;
|
|
|
|
if ( !isdefined( var_3 ) )
|
|
var_3 = 0;
|
|
|
|
self moveto( var_0, var_6, var_6 * var_2, var_6 * var_3 );
|
|
self waittill( "movedone" );
|
|
}
|
|
|
|
moveto_rotateto_speed( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_4 = var_0.origin;
|
|
var_5 = self.origin;
|
|
var_6 = distance( var_5, var_4 );
|
|
var_7 = var_6 / var_1;
|
|
|
|
if ( !isdefined( var_2 ) )
|
|
var_2 = 0;
|
|
|
|
if ( !isdefined( var_3 ) )
|
|
var_3 = 0;
|
|
|
|
self rotateto( var_0.angles, var_7, var_7 * var_2, var_7 * var_3 );
|
|
self moveto( var_4, var_7, var_7 * var_2, var_7 * var_3 );
|
|
self waittill( "movedone" );
|
|
}
|
|
|
|
spot_light( var_0, var_1, var_2, var_3 )
|
|
{
|
|
if ( isdefined( level.last_spot_light ) )
|
|
{
|
|
var_4 = level.last_spot_light;
|
|
|
|
if ( isdefined( var_4.entity ) )
|
|
{
|
|
stopfxontag( var_4.effect_id, var_4.entity, var_4.tag_name );
|
|
|
|
if ( isdefined( var_4.cheap_effect_id ) )
|
|
playfxontag( var_4.cheap_effect_id, var_4.entity, var_4.tag_name );
|
|
}
|
|
|
|
wait 0.1;
|
|
}
|
|
|
|
wait 0.8;
|
|
level notify( "spotlight_changed_owner" );
|
|
var_4 = spawnstruct();
|
|
var_4.effect_id = common_scripts\utility::getfx( var_0 );
|
|
|
|
if ( isdefined( var_1 ) )
|
|
var_4.cheap_effect_id = common_scripts\utility::getfx( var_1 );
|
|
|
|
var_4.entity = self;
|
|
var_4.tag_name = var_2;
|
|
playfxontag( var_4.effect_id, var_4.entity, var_4.tag_name );
|
|
|
|
if ( isdefined( var_3 ) )
|
|
thread spot_light_death( var_3 );
|
|
|
|
level.last_spot_light = var_4;
|
|
}
|
|
|
|
stop_last_spot_light()
|
|
{
|
|
if ( isdefined( level.last_spot_light ) )
|
|
{
|
|
var_0 = level.last_spot_light;
|
|
stopfxontag( var_0.effect_id, var_0.entity, var_0.tag_name );
|
|
level.last_spot_light = undefined;
|
|
}
|
|
}
|
|
|
|
spot_light_death( var_0 )
|
|
{
|
|
self notify( "new_spot_light_death" );
|
|
self endon( "new_spot_light_death" );
|
|
self endon( "death" );
|
|
var_0 waittill( "death" );
|
|
self delete();
|
|
}
|
|
|
|
volume_waittill_no_axis( var_0, var_1 )
|
|
{
|
|
var_2 = common_scripts\utility::get_target_ent( var_0 );
|
|
|
|
for (;;)
|
|
{
|
|
if ( volume_is_empty( var_2, var_1 ) )
|
|
break;
|
|
|
|
wait 0.2;
|
|
}
|
|
}
|
|
|
|
volume_is_empty( var_0, var_1 )
|
|
{
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = 0;
|
|
|
|
var_2 = getaiarray( "axis" );
|
|
var_3 = 0;
|
|
|
|
foreach ( var_5 in var_2 )
|
|
{
|
|
if ( var_5 istouching( var_0 ) )
|
|
{
|
|
var_3 = var_3 + 1;
|
|
|
|
if ( var_3 > var_1 )
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
anim_generic_reach_and_animate( var_0, var_1, var_2, var_3 )
|
|
{
|
|
maps\_anim::anim_generic_reach( var_0, var_1, var_2 );
|
|
self notify( "starting_anim" );
|
|
var_0 notify( "starting_anim" );
|
|
|
|
if ( isdefined( var_3 ) )
|
|
maps\_anim::anim_generic_custom_animmode( var_0, var_3, var_1, var_2 );
|
|
else
|
|
maps\_anim::anim_generic( var_0, var_1, var_2 );
|
|
}
|
|
|
|
move_up_when_clear()
|
|
{
|
|
var_0 = common_scripts\utility::get_target_ent();
|
|
var_1 = var_0 common_scripts\utility::get_target_ent();
|
|
var_1 endon( "trigger" );
|
|
self waittill( "trigger" );
|
|
volume_waittill_no_axis( var_0.targetname, var_0.script_count );
|
|
var_1 thread maps\_utility::activate_trigger();
|
|
}
|
|
|
|
depth_charge_org()
|
|
{
|
|
var_0 = undefined;
|
|
|
|
if ( isdefined( self.target ) )
|
|
{
|
|
var_1 = common_scripts\utility::get_target_ent();
|
|
var_0 = var_1.origin;
|
|
}
|
|
|
|
var_2 = ( 0, 0, 5 );
|
|
var_3 = level.water_level_z;
|
|
var_4 = self.script_flag;
|
|
|
|
if ( isdefined( var_4 ) )
|
|
{
|
|
if ( !common_scripts\utility::flag_exist( var_4 ) )
|
|
common_scripts\utility::flag_init( var_4 );
|
|
}
|
|
|
|
maps\_utility::script_delay();
|
|
drop_depth_charge( self.origin, var_0, var_4 );
|
|
}
|
|
|
|
drop_depth_charge( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = ( 0, 0, 5 );
|
|
var_4 = level.water_level_z;
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
{
|
|
var_0 = ( var_0[0], var_0[1], var_4 );
|
|
var_5 = bullettrace( var_0 - ( 0, 0, 10 ), var_0 - ( 0, 0, 700 ), 0 );
|
|
var_1 = var_5["position"];
|
|
}
|
|
else
|
|
var_0 = ( var_1[0], var_1[1], var_4 );
|
|
|
|
var_0 = var_0 + var_3;
|
|
var_6 = common_scripts\utility::spawn_tag_origin();
|
|
var_6.origin = var_0 + ( 0, 0, 22 );
|
|
var_7 = spawn( "script_model", var_0 );
|
|
var_7 setmodel( "com_barrel_benzin2" );
|
|
var_7 linkto( var_6 );
|
|
var_8 = 200;
|
|
var_9 = var_4 - var_1[2];
|
|
var_6 thread barrel_roll();
|
|
var_10 = min( 100, var_9 * 0.2 );
|
|
var_11 = var_9 - var_10;
|
|
var_12 = var_10 / var_8;
|
|
var_13 = var_11 / ( var_8 / 2 );
|
|
var_6 playsound( "depth_charge_drop" );
|
|
playfx( common_scripts\utility::getfx( "jump_into_water_splash" ), var_0 - var_3 );
|
|
playfxontag( common_scripts\utility::getfx( "underwater_object_trail" ), var_6, "tag_origin" );
|
|
var_6 movez( -1 * var_10, var_12, 0, var_12 );
|
|
wait( var_12 );
|
|
var_6 movez( -1 * var_11, var_13, 0, 0 );
|
|
wait( var_13 );
|
|
stopfxontag( common_scripts\utility::getfx( "underwater_object_trail" ), var_6, "tag_origin" );
|
|
playfx( common_scripts\utility::getfx( "shpg_underwater_explosion_med_a" ), var_6.origin );
|
|
thread common_scripts\utility::play_sound_in_space( "depth_charge_explo_dist", var_6.origin );
|
|
|
|
if ( isdefined( var_2 ) )
|
|
common_scripts\utility::flag_set( var_2 );
|
|
|
|
if ( !common_scripts\utility::flag( "depth_charge_muffle" ) )
|
|
{
|
|
earthquake( 0.6, 0.75, var_6.origin, 1024 );
|
|
radiusdamage( var_6.origin, 300, 100, 20 );
|
|
var_9 = distance( level.player.origin, var_6.origin );
|
|
|
|
if ( var_9 < 1900 )
|
|
{
|
|
if ( var_9 < 900 )
|
|
thread common_scripts\utility::play_sound_in_space( "depth_charge_explo_close_2d", var_6.origin );
|
|
else
|
|
thread common_scripts\utility::play_sound_in_space( "depth_charge_explo_mid_2d", var_6.origin );
|
|
}
|
|
|
|
if ( var_9 < 600 )
|
|
{
|
|
thread thrash_player( 600, 0.4, var_6.origin );
|
|
|
|
if ( var_9 < 300 )
|
|
{
|
|
if ( var_9 < 150 )
|
|
{
|
|
level.player shellshock( "depth_charge_hit", 2.5 );
|
|
level.player thread delay_reset_swim_shock( 3 );
|
|
}
|
|
else
|
|
{
|
|
level.player shellshock( "depth_charge_hit", 1.5 );
|
|
level.player thread delay_reset_swim_shock( 2 );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
earthquake( 0.3, 0.5, var_6.origin, 1024 );
|
|
|
|
var_7 delete();
|
|
var_6 delete();
|
|
}
|
|
|
|
thrash_player( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = distance( level.player.origin, var_2 );
|
|
var_4 = max( var_3 / var_0, var_1 );
|
|
level.player viewkick( int( var_4 * 120 ), var_2 );
|
|
var_5 = level.player getvelocity();
|
|
var_6 = vectornormalize( level.player.origin - var_2 );
|
|
level.player setvelocity( var_5 * 0.75 + var_6 * var_4 * 100 );
|
|
}
|
|
|
|
delay_reset_swim_shock( var_0 )
|
|
{
|
|
self allowsprint( 0 );
|
|
self notify( "new_shock" );
|
|
self endon( "new_shock" );
|
|
wait( var_0 );
|
|
thread maps\_swim_player::shellshock_forever();
|
|
self allowsprint( 1 );
|
|
}
|
|
|
|
barrel_roll()
|
|
{
|
|
self endon( "death" );
|
|
var_0 = randomfloatrange( 0.5, 1.5 );
|
|
|
|
for (;;)
|
|
{
|
|
var_1 = ( self.angles[0] + 20, self.angles[1] + 30, self.angles[2] + 40 );
|
|
self rotateto( var_1, var_0 );
|
|
wait( var_0 );
|
|
}
|
|
}
|
|
|
|
trigger_depth_charges()
|
|
{
|
|
self waittill( "trigger" );
|
|
var_0 = common_scripts\utility::getstructarray( self.target, "targetname" );
|
|
common_scripts\utility::array_thread( var_0, ::depth_charge_org );
|
|
}
|
|
|
|
dyn_swimspeed_enable( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "dynspeed_off" );
|
|
|
|
if ( isdefined( self.dyn_speed ) )
|
|
return;
|
|
|
|
self.dyn_speed = 1;
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
var_0 = 200;
|
|
|
|
self.old_moveplaybackrate = self.moveplaybackrate;
|
|
|
|
for (;;)
|
|
{
|
|
var_1 = player_is_behind_me();
|
|
var_2 = distance( self.origin, level.player.origin );
|
|
|
|
if ( !var_1 || var_2 < var_0 )
|
|
{
|
|
self.moveplaybackrate = self.old_moveplaybackrate * 1.4;
|
|
self.movetransitionrate = self.moveplaybackrate;
|
|
wait 1;
|
|
|
|
while ( !player_is_behind_me() || distance( self.origin, level.player.origin ) < var_0 )
|
|
wait 0.1;
|
|
|
|
self.moveplaybackrate = self.old_moveplaybackrate;
|
|
self.movetransitionrate = self.moveplaybackrate;
|
|
wait 5;
|
|
}
|
|
|
|
wait 0.3;
|
|
}
|
|
}
|
|
|
|
dyn_swimspeed_disable()
|
|
{
|
|
self notify( "dynspeed_off" );
|
|
|
|
if ( isdefined( self.old_moveplaybackrate ) )
|
|
{
|
|
self.moveplaybackrate = self.old_moveplaybackrate;
|
|
self.movetransitionrate = self.moveplaybackrate;
|
|
}
|
|
|
|
self.old_moveplaybackrate = undefined;
|
|
self.dyn_speed = undefined;
|
|
}
|
|
|
|
player_is_behind_me( var_0 )
|
|
{
|
|
if ( !isdefined( var_0 ) )
|
|
var_0 = -0.1;
|
|
|
|
var_1 = ( self.angles[0], self.angles[1], 0 );
|
|
var_2 = anglestoforward( var_1 );
|
|
var_3 = self.origin - ( 0, 0, self.origin[2] );
|
|
var_4 = level.player.origin - ( 0, 0, level.player.origin[2] );
|
|
var_5 = vectornormalize( var_4 - var_3 );
|
|
var_6 = vectordot( var_5, var_2 );
|
|
return var_6 < var_0;
|
|
}
|
|
|
|
track_death()
|
|
{
|
|
if ( isai( self ) && self.team == "axis" )
|
|
{
|
|
self waittill( "death", var_0 );
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
return;
|
|
|
|
if ( !common_scripts\utility::flag( "allow_killfirms" ) )
|
|
return;
|
|
|
|
wait 0.3;
|
|
var_1 = 0.2;
|
|
|
|
if ( gettime() - level.last_killfirm_time < level.last_killfirm_timeout )
|
|
return;
|
|
|
|
if ( var_0 == level.player )
|
|
{
|
|
if ( gettime() - level.last_killfirm_time < level.last_killfirm_timeout )
|
|
return;
|
|
|
|
if ( level.killfirm_suffix == "_loud" )
|
|
{
|
|
var_2 = maps\_utility::radio_dialogue( "shpg_killfirm_other_" + randomintrange( 0, 3 ) + level.killfirm_suffix, var_1 );
|
|
|
|
if ( var_2 )
|
|
level.last_killfirm_time = gettime();
|
|
}
|
|
}
|
|
else if ( var_0 == level.baker )
|
|
{
|
|
if ( gettime() - level.last_killfirm_time < level.last_killfirm_timeout )
|
|
return;
|
|
|
|
var_2 = maps\_utility::radio_dialogue( "shpg_killfirm_other_" + randomintrange( 0, 4 ) + level.killfirm_suffix, var_1 );
|
|
|
|
if ( var_2 )
|
|
level.last_killfirm_time = gettime();
|
|
}
|
|
}
|
|
}
|
|
|
|
baker_killfirms()
|
|
{
|
|
common_scripts\utility::flag_init( "allow_killfirms" );
|
|
common_scripts\utility::flag_set( "allow_killfirms" );
|
|
level.last_killfirm_time = 0;
|
|
level.last_killfirm_timeout = 15000;
|
|
level.killfirm_suffix = "";
|
|
}
|
|
|
|
force_deathquote( var_0 )
|
|
{
|
|
if ( isdefined( var_0 ) )
|
|
{
|
|
level notify( "new_quote_string" );
|
|
setdvar( "ui_deadquote", var_0 );
|
|
}
|
|
}
|
|
|
|
dyn_balloon_delete()
|
|
{
|
|
self notify( "deleted" );
|
|
|
|
foreach ( var_1 in self.path_clip )
|
|
{
|
|
if ( isdefined( var_1 ) )
|
|
var_1 delete();
|
|
}
|
|
|
|
foreach ( var_4 in self.linked )
|
|
{
|
|
if ( isdefined( var_4 ) )
|
|
var_4 delete();
|
|
}
|
|
|
|
if ( isdefined( self.trigger ) )
|
|
self.trigger delete();
|
|
|
|
self delete();
|
|
}
|
|
|
|
new_dyn_balloon_think()
|
|
{
|
|
self endon( "deleted" );
|
|
self.balloon_count = level.balloon_count;
|
|
level.balloon_count = level.balloon_count + 1;
|
|
var_0 = common_scripts\utility::get_linked_ents();
|
|
common_scripts\utility::array_call( var_0, ::linkto, self );
|
|
self.linked = var_0;
|
|
var_1 = getentarray( self.target, "targetname" );
|
|
self.path_clip = [];
|
|
self.delete_things = [];
|
|
self.damage_detect = self;
|
|
|
|
foreach ( var_3 in var_1 )
|
|
{
|
|
switch ( var_3.script_noteworthy )
|
|
{
|
|
case "bottom":
|
|
self.bottom = var_3;
|
|
self.bottom_target = self.bottom common_scripts\utility::get_target_ent();
|
|
break;
|
|
case "path_clip":
|
|
self.path_clip = common_scripts\utility::array_add( self.path_clip, var_3 );
|
|
break;
|
|
}
|
|
}
|
|
|
|
foreach ( var_6 in var_0 )
|
|
{
|
|
if ( isdefined( var_6.script_noteworthy ) )
|
|
{
|
|
switch ( var_6.script_noteworthy )
|
|
{
|
|
case "damage_detect":
|
|
self.damage_detect = var_6;
|
|
case "delete_on_explode":
|
|
self.delete_things = common_scripts\utility::array_add( self.delete_things, var_6 );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
common_scripts\utility::waitframe();
|
|
|
|
foreach ( var_9 in self.path_clip )
|
|
{
|
|
var_9 notsolid();
|
|
var_9 connectpaths();
|
|
}
|
|
|
|
self.damage_detect setcandamage( 1 );
|
|
thread dyn_balloon_bob();
|
|
self.damage_detect.health = 1;
|
|
|
|
while ( self.damage_detect.health > 0 )
|
|
self.damage_detect waittill( "damage", var_11, var_12, var_13, var_14, var_15 );
|
|
|
|
playfx( common_scripts\utility::getfx( "shpg_underwater_bubble_explo" ), self.origin + ( 0, 0, 64 ) );
|
|
thread common_scripts\utility::play_sound_in_space( "underwater_balloon_pop", self.origin );
|
|
self hide();
|
|
self notify( "stop_bob" );
|
|
|
|
foreach ( var_17 in self.delete_things )
|
|
var_17 delete();
|
|
|
|
badplace_cylinder( "balloon" + self.balloon_count, 5, self.bottom.origin, 128, 128 );
|
|
var_19 = getnodearray( "disable_node_on_damage", "targetname" );
|
|
|
|
foreach ( var_21 in var_19 )
|
|
{
|
|
if ( distance( var_21.origin, self.origin - ( 0, 0, 180 ) ) < 128 )
|
|
var_21 disconnectnode();
|
|
}
|
|
|
|
foreach ( var_9 in self.path_clip )
|
|
{
|
|
var_9 solid();
|
|
var_9 disconnectpaths();
|
|
}
|
|
|
|
var_25 = getaiarray( "axis" );
|
|
|
|
foreach ( var_27 in var_25 )
|
|
{
|
|
if ( distance2d( self.origin, var_27.origin ) < 128 )
|
|
{
|
|
var_27 thread maps\_utility::notify_delay( "ai_event", randomfloatrange( 0.2, 0.4 ) );
|
|
var_27.health = 1;
|
|
var_27.baseaccuracy = 0.3;
|
|
var_27 setthreatbiasgroup( "easy_kills" );
|
|
}
|
|
|
|
if ( distance2d( self.origin, var_27.origin ) < 1000 )
|
|
var_27 thread maps\_utility::notify_delay( "ai_event", randomfloatrange( 0.2, 0.4 ) );
|
|
}
|
|
|
|
var_29 = self.origin[2] - self.orig_org[2];
|
|
var_30 = spawn( "trigger_radius", self.bottom.origin - ( 0, 0, 32 ), 0, 32, 64 );
|
|
var_30 thread trigger_hurt();
|
|
var_30 enablelinkto();
|
|
var_30 linkto( self );
|
|
self.trigger = var_30;
|
|
moveto_speed( self.origin - ( 0, 0, self.bottom.origin[2] - self.bottom_target.origin[2] + var_29 ), 50, 0.3, 0.0 );
|
|
playfx( common_scripts\utility::getfx( "underwater_impact_vehicle_cheap" ), self.bottom_target.origin, ( 0, 0, 1 ), ( 1, 0, 0 ) );
|
|
thread common_scripts\utility::play_sound_in_space( "underwater_balloon_crate_hit_bottom", self.bottom_target.origin );
|
|
earthquake( 0.3, 0.6, self.bottom_target.origin, 512 );
|
|
wait 0.1;
|
|
var_30 delete();
|
|
}
|
|
|
|
trigger_hurt()
|
|
{
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "trigger", var_0 );
|
|
var_0 dodamage( 100, self.origin );
|
|
}
|
|
}
|
|
|
|
dyn_balloon_think()
|
|
{
|
|
self endon( "deleted" );
|
|
self.balloon_count = level.balloon_count;
|
|
level.balloon_count = level.balloon_count + 1;
|
|
var_0 = common_scripts\utility::get_linked_ents();
|
|
common_scripts\utility::array_call( var_0, ::linkto, self );
|
|
self.linked = var_0;
|
|
var_1 = getentarray( self.target, "targetname" );
|
|
self.path_clip = [];
|
|
|
|
foreach ( var_3 in var_1 )
|
|
{
|
|
switch ( var_3.script_noteworthy )
|
|
{
|
|
case "bottom":
|
|
self.bottom = var_3;
|
|
self.bottom_target = self.bottom common_scripts\utility::get_target_ent();
|
|
break;
|
|
case "path_clip":
|
|
self.path_clip = common_scripts\utility::array_add( self.path_clip, var_3 );
|
|
break;
|
|
}
|
|
}
|
|
|
|
common_scripts\utility::waitframe();
|
|
|
|
foreach ( var_6 in self.path_clip )
|
|
{
|
|
var_6 notsolid();
|
|
var_6 connectpaths();
|
|
}
|
|
|
|
self setcandamage( 1 );
|
|
thread dyn_balloon_bob();
|
|
self waittill( "damage", var_8, var_9, var_10, var_11, var_12 );
|
|
var_13 = common_scripts\utility::spawn_tag_origin();
|
|
var_13.origin = var_11;
|
|
var_13.angles = var_10;
|
|
var_13 linkto( self );
|
|
playfxontag( common_scripts\utility::getfx( "water_bubbles_longlife_lp" ), var_13, "tag_origin" );
|
|
badplace_cylinder( "balloon" + self.balloon_count, 5, self.bottom.origin, 128, 128 );
|
|
|
|
foreach ( var_6 in self.path_clip )
|
|
{
|
|
var_6 solid();
|
|
var_6 disconnectpaths();
|
|
}
|
|
|
|
var_16 = getaiarray( "axis" );
|
|
|
|
foreach ( var_18 in var_16 )
|
|
{
|
|
if ( distance2d( self.origin, var_18.origin ) < 128 )
|
|
{
|
|
var_18 thread maps\_utility::notify_delay( "ai_event", randomfloatrange( 0.2, 0.4 ) );
|
|
var_18.health = 1;
|
|
var_18.baseaccuracy = 0.3;
|
|
var_18 setthreatbiasgroup( "easy_kills" );
|
|
}
|
|
}
|
|
|
|
var_20 = self.origin[2] - self.orig_org[2];
|
|
moveto_speed( self.origin - ( 0, 0, self.bottom.origin[2] - self.bottom_target.origin[2] + var_20 ), 40, 0.3, 0.0 );
|
|
}
|
|
|
|
dyn_balloon_bob()
|
|
{
|
|
self endon( "stop_bob" );
|
|
self endon( "deleted" );
|
|
self endon( "damage" );
|
|
self.orig_org = self.origin;
|
|
var_0 = 3;
|
|
|
|
for (;;)
|
|
{
|
|
var_1 = randomfloatrange( 3, 5 );
|
|
self moveto( self.orig_org + ( 0, 0, var_0 ), var_1, var_1 * 0.5, var_1 * 0.5 );
|
|
self waittill( "movedone" );
|
|
common_scripts\utility::waitframe();
|
|
self moveto( self.orig_org - ( 0, 0, var_0 ), var_1, var_1 * 0.5, var_1 * 0.5 );
|
|
self waittill( "movedone" );
|
|
}
|
|
}
|
|
|
|
shark_go_trig()
|
|
{
|
|
var_0 = getentarray( self.target, "targetname" );
|
|
var_1 = [];
|
|
|
|
foreach ( var_3 in var_0 )
|
|
var_1 = common_scripts\utility::array_add( var_1, var_3 );
|
|
|
|
common_scripts\utility::array_call( var_1, ::hide );
|
|
self waittill( "trigger" );
|
|
common_scripts\utility::array_thread( var_1, ::shark_think );
|
|
common_scripts\utility::array_thread( var_1, maps\_utility::delaythread, randomfloatrange( 0, 1 ), ::shark_kill_think );
|
|
}
|
|
|
|
#using_animtree("animals");
|
|
|
|
shark_think()
|
|
{
|
|
self endon( "death" );
|
|
self notify( "new_directive" );
|
|
self endon( "new_directive" );
|
|
self show();
|
|
self useanimtree( #animtree );
|
|
var_0 = randomfloatrange( 0.7, 1.1 );
|
|
|
|
if ( isdefined( self.script_moveplaybackrate ) )
|
|
var_0 = self.script_moveplaybackrate;
|
|
|
|
self.animname = "shark";
|
|
self setanim( %shark_swim_f, 1, randomfloatrange( 0, 0.5 ), var_0 );
|
|
var_1 = common_scripts\utility::get_target_ent();
|
|
|
|
if ( isdefined( self.script_noteworthy ) && self.script_noteworthy == "real_shark" )
|
|
{
|
|
find_available_collision_model();
|
|
thread shark_think_real();
|
|
}
|
|
|
|
for (;;)
|
|
{
|
|
var_2 = var_1.origin - self.origin;
|
|
self rotateto( vectortoangles( var_2 ), 1 );
|
|
moveto_speed( var_1.origin, 60 * var_0 );
|
|
|
|
if ( isdefined( var_1.target ) )
|
|
{
|
|
var_1 = var_1 common_scripts\utility::get_target_ent();
|
|
continue;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
self delete();
|
|
}
|
|
|
|
shark_think_real()
|
|
{
|
|
self.shark_collision_model setcandamage( 1 );
|
|
self.shark_collision_model waittill( "damage" );
|
|
common_scripts\utility::flag_waitopen( "shark_eating_player" );
|
|
return_collision_model();
|
|
var_0 = getent( "generic_shark_spawner", "targetname" );
|
|
var_1 = var_0 stalingradspawn();
|
|
|
|
if ( maps\_utility::spawn_failed( var_1 ) )
|
|
return;
|
|
|
|
var_1.animname = "shark";
|
|
var_1 maps\_anim::setanimtree();
|
|
var_1 forceteleport( self.origin, self.angles );
|
|
self delete();
|
|
var_1 shark_kill_player();
|
|
}
|
|
|
|
dead_body_spawner()
|
|
{
|
|
var_0 = common_scripts\utility::getstructarray( self.script_noteworthy, "script_noteworthy" );
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
self.origin = var_2.origin;
|
|
self.angles = var_2.angles;
|
|
var_3 = maps\_utility::spawn_ai( 1 );
|
|
var_3 maps\_utility::gun_remove();
|
|
var_4 = level.scr_anim["generic"][var_2.animation];
|
|
|
|
if ( isarray( var_4 ) )
|
|
var_4 = var_4[0];
|
|
|
|
var_3 setcandamage( 0 );
|
|
var_3 notsolid();
|
|
var_3 animscripted( "endanim", var_2.origin, var_2.angles, var_4 );
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
}
|
|
|
|
shark_kill_front( var_0, var_1, var_2 )
|
|
{
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = "shark_attack_4";
|
|
|
|
if ( !isdefined( var_2 ) )
|
|
var_2 = [ 0.6, 1.25, 1.5 ];
|
|
|
|
var_3 = level.player.origin;
|
|
var_4 = anglestoforward( level.player.angles );
|
|
var_5 = anglestoright( level.player.angles );
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
{
|
|
var_0 = spawn( "script_model", var_3 - var_4 * 50 );
|
|
var_0 setmodel( "fullbody_tigershark" );
|
|
var_0.animname = "shark";
|
|
var_0 maps\_anim::setanimtree();
|
|
}
|
|
|
|
var_0 endon( "death" );
|
|
var_0 unlink();
|
|
var_0 notify( "stop_loop" );
|
|
|
|
if ( isdefined( var_0.anim_node ) )
|
|
var_0.anim_node notify( "stop_loop" );
|
|
|
|
var_6 = spawnstruct();
|
|
var_6.origin = var_0.origin;
|
|
var_6.angles = vectortoangles( level.player.origin - var_0.origin );
|
|
|
|
if ( issubstr( var_1, "_L" ) )
|
|
{
|
|
var_7 = anglestoright( var_6.angles );
|
|
var_6.angles = vectortoangles( var_7 );
|
|
}
|
|
else if ( issubstr( var_1, "_R" ) )
|
|
{
|
|
var_7 = anglestoright( var_6.angles );
|
|
var_6.angles = vectortoangles( -1 * var_7 );
|
|
}
|
|
|
|
var_3 = level.player.origin;
|
|
var_4 = anglestoforward( level.player.angles );
|
|
var_5 = anglestoright( level.player.angles );
|
|
var_8 = ( 0, 0, 52 );
|
|
var_9 = maps\_player_rig::get_player_rig();
|
|
var_9.origin = level.player.origin - var_8;
|
|
var_9.angles = level.player.angles;
|
|
var_9 hide();
|
|
var_0 setviewmodeldepth( 1 );
|
|
var_9 setviewmodeldepth( 1 );
|
|
var_10 = common_scripts\utility::spawn_tag_origin();
|
|
var_10.origin = var_9.origin;
|
|
var_10.angles = var_9.angles;
|
|
var_10 linkto( var_9, "tag_player", var_8, ( 0, 0, 0 ) );
|
|
var_6 thread maps\_anim::anim_single( [ var_9, var_0 ], var_1 );
|
|
level.player takeallweapons();
|
|
var_11 = 0.2;
|
|
level.player playerlinktoblend( var_10, "tag_origin", var_11, 0, var_11 * 0.25 );
|
|
thread shark_attack_slomo();
|
|
var_9 common_scripts\utility::delaycall( var_11, ::show );
|
|
level.player common_scripts\utility::delaycall( 0.0, ::playsound, "scn_shipg_shark_bite_plr" );
|
|
wait( var_2[0] );
|
|
var_12 = common_scripts\utility::spawn_tag_origin();
|
|
var_12.origin = level.player geteye();
|
|
var_12 linkto( level.player );
|
|
playfx( common_scripts\utility::getfx( "swim_ai_blood_impact" ), var_12.origin );
|
|
playfxontag( common_scripts\utility::getfx( "swim_ai_death_blood" ), var_12, "tag_origin" );
|
|
level.player thread maps\_gameskill::blood_splat_on_screen( "bottom" );
|
|
level.player playrumbleonentity( "damage_heavy" );
|
|
wait( var_2[1] );
|
|
level.player thread maps\_gameskill::blood_splat_on_screen( "left" );
|
|
level.player playrumbleonentity( "damage_heavy" );
|
|
wait( var_2[2] );
|
|
var_13 = getdvarint( "shpg_killed_by_shark", 0 );
|
|
setdvar( "shpg_killed_by_shark", var_13 + 1 );
|
|
level.player kill();
|
|
}
|
|
|
|
shark_attack_slomo()
|
|
{
|
|
var_0 = 0;
|
|
wait 0.2;
|
|
var_1 = 0.15;
|
|
var_2 = 0.35;
|
|
level.player lerpfov( 50, 0.2 );
|
|
maps\_utility::slowmo_setspeed_slow( 0.1 );
|
|
maps\_utility::slowmo_setlerptime_in( var_1 );
|
|
|
|
if ( var_0 )
|
|
maps\_utility::slowmo_lerp_in();
|
|
|
|
wait( var_1 );
|
|
wait 0.1;
|
|
level.player lerpfov( 65, 0.3 );
|
|
maps\_utility::slowmo_setlerptime_out( var_2 );
|
|
|
|
if ( var_0 )
|
|
maps\_utility::slowmo_lerp_out();
|
|
}
|
|
|
|
shark_vehicle( var_0 )
|
|
{
|
|
var_1 = self;
|
|
var_1.animname = "shark";
|
|
var_2 = maps\_vehicle::spawn_vehicle_from_targetname_and_drive( self.target );
|
|
var_1 forceteleport( var_2.origin, var_2.angles );
|
|
var_1 linkto( var_2, "tag_origin" );
|
|
wait( randomfloatrange( 0, 1 ) );
|
|
var_1.anim_node = var_2;
|
|
var_2 thread maps\_anim::anim_loop_solo( var_1, var_1.animation, "stop_loop", "tag_origin" );
|
|
var_1 thread shark_kill_think();
|
|
}
|
|
|
|
shark_track_bulletwhizby()
|
|
{
|
|
if ( ( greenlight_check() || is_demo_check() ) && ( isdefined( level.start_point ) && level.start_point != "fallon" ) )
|
|
return;
|
|
|
|
self addaieventlistener( "bulletwhizby" );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "ai_event", var_0 );
|
|
|
|
if ( var_0 == "bulletwhizby" )
|
|
{
|
|
if ( level.player maps\_utility::player_looking_at( self.origin, 0.7, 1 ) )
|
|
{
|
|
var_1 = shark_kill_player();
|
|
|
|
if ( var_1 )
|
|
break;
|
|
}
|
|
}
|
|
|
|
wait 0.5;
|
|
}
|
|
}
|
|
|
|
shark_kill_think()
|
|
{
|
|
self endon( "death" );
|
|
self.animname = "shark";
|
|
level.deadly_sharks = common_scripts\utility::array_add( level.deadly_sharks, self );
|
|
|
|
if ( isai( self ) )
|
|
childthread shark_track_bulletwhizby();
|
|
|
|
maps\_utility::ent_flag_init( "shark_busy" );
|
|
|
|
for (;;)
|
|
{
|
|
var_0 = getdvarint( "shpg_killed_by_shark", 0 );
|
|
|
|
if ( var_0 == 0 )
|
|
{
|
|
var_1 = 110;
|
|
var_2 = 90;
|
|
var_3 = 0.75;
|
|
}
|
|
else
|
|
{
|
|
var_1 = 90;
|
|
var_2 = 70;
|
|
var_3 = 0.95;
|
|
}
|
|
|
|
if ( level.start_point == "start_big_wreck_2" && self.origin[0] < 13720 && self.origin[1] > -54848 && self.origin[2] > 200 )
|
|
{
|
|
var_1 = 150;
|
|
var_2 = 130;
|
|
var_3 = 0.75;
|
|
}
|
|
|
|
if ( !level.console && !level.player usinggamepad() )
|
|
var_3 = 1;
|
|
|
|
maps\_utility::ent_flag_waitopen( "shark_busy" );
|
|
common_scripts\utility::flag_waitopen( "shark_eating_player" );
|
|
common_scripts\utility::flag_waitopen( "no_shark_heartbeat" );
|
|
var_4 = getdvarint( "player_swimSpeed", 70 );
|
|
var_4 = var_4 * var_3;
|
|
var_5 = self gettagorigin( "j_jaw" );
|
|
var_6 = self gettagorigin( "j_head" );
|
|
var_7 = self gettagangles( "j_head" );
|
|
var_7 = anglestoright( var_7 );
|
|
var_7 = vectortoangles( var_7 );
|
|
var_8 = 1;
|
|
var_9 = distance( level.player getvelocity(), ( 0, 0, 0 ) );
|
|
|
|
if ( var_9 > var_4 )
|
|
var_8 = var_9 / var_4;
|
|
|
|
if ( distance( level.player.origin, self.origin ) < var_1 * var_8 )
|
|
shark_kill_player();
|
|
else if ( distance( level.player.origin, var_5 ) < var_2 * var_8 )
|
|
shark_kill_player();
|
|
else if ( common_scripts\utility::within_fov( var_6, var_7, level.player.origin, 0.8 ) && distance( level.player.origin, var_6 ) < var_2 * var_8 * 2 )
|
|
shark_kill_player();
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
player_get_closest_node()
|
|
{
|
|
level.player endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
var_0 = getclosestnodeinsight( self.origin );
|
|
|
|
if ( isdefined( var_0 ) )
|
|
{
|
|
if ( var_0.type != "Begin" && var_0.type != "End" && var_0.type != "Turret" )
|
|
self.node_closest = var_0;
|
|
}
|
|
|
|
wait 0.25;
|
|
}
|
|
}
|
|
|
|
shark_kill_player( var_0 )
|
|
{
|
|
if ( ( greenlight_check() || is_demo_check() ) && ( isdefined( level.start_point ) && level.start_point != "fallon" ) )
|
|
return;
|
|
|
|
self endon( "death" );
|
|
thread restore_attack_flag_on_death();
|
|
|
|
if ( common_scripts\utility::flag( "shark_eating_player" ) )
|
|
return 0;
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
{
|
|
var_1 = bullettrace( self.origin, level.player.origin, 0, self );
|
|
|
|
if ( var_1["fraction"] < 0.95 )
|
|
return 0;
|
|
|
|
maps\_utility::radio_dialogue_stop();
|
|
thread maps\_utility::radio_dialogue_interupt( "shpg_shark_attack_0" );
|
|
}
|
|
|
|
self notify( "killing_player" );
|
|
common_scripts\utility::flag_set( "shark_eating_player" );
|
|
wait 0.25;
|
|
|
|
if ( isai( self ) )
|
|
{
|
|
if ( isdefined( self.animnode ) )
|
|
{
|
|
self.animnode notify( "stop_loop" );
|
|
self.animnode notify( "stop_first_frame" );
|
|
self notify( "stop_loop" );
|
|
self notify( "stop_first_frame" );
|
|
}
|
|
|
|
self stopanimscripted();
|
|
self unlink();
|
|
var_2 = 250;
|
|
self.moveplaybackrate = level.shark_attack_playbackrate;
|
|
self.movetransitionrate = self.moveplaybackrate;
|
|
self.goalheight = 150;
|
|
self.goalradius = 64;
|
|
thread shark_chase_player();
|
|
|
|
for (;;)
|
|
{
|
|
var_1 = bullettrace( self.origin, level.player.origin, 0, self );
|
|
|
|
if ( var_1["fraction"] >= 0.95 && distance( level.player.origin, self.origin ) <= var_2 )
|
|
break;
|
|
|
|
wait 0.1;
|
|
}
|
|
}
|
|
|
|
self notify( "chomp" );
|
|
maps\_utility::delaythread( 0.9, common_scripts\utility::flag_set, "no_shark_heartbeat" );
|
|
maps\_utility::delaythread( 0.6, maps\_utility::smart_radio_dialogue_interrupt, "shipg_hsh_adam" );
|
|
var_3 = getdirectionfacing( self.angles, self.origin, level.player.origin );
|
|
shark_kill_front( self, "shark_attack_" + var_3 );
|
|
return 1;
|
|
}
|
|
|
|
getdirectionfacing( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = anglestoforward( var_0 );
|
|
var_4 = vectornormalize( var_3 );
|
|
var_5 = vectortoangles( var_4 );
|
|
var_6 = vectortoangles( var_2 - var_1 );
|
|
var_7 = var_5[1] - var_6[1];
|
|
var_7 = var_7 + 360;
|
|
var_7 = int( var_7 ) % 360;
|
|
|
|
if ( var_7 >= 315 || var_7 <= 45 )
|
|
var_8 = "F";
|
|
else if ( var_7 < 135 )
|
|
var_8 = "R";
|
|
else if ( var_7 < 255 )
|
|
var_8 = "B";
|
|
else
|
|
var_8 = "L";
|
|
|
|
return var_8;
|
|
}
|
|
|
|
restore_attack_flag_on_death()
|
|
{
|
|
self waittill( "death" );
|
|
|
|
if ( isdefined( self ) )
|
|
playfxontag( common_scripts\utility::getfx( "swim_ai_death_blood" ), self, "j_spineupper" );
|
|
|
|
common_scripts\utility::flag_clear( "shark_eating_player" );
|
|
level.shark_attack_playbackrate = level.shark_attack_playbackrate + 1.5;
|
|
}
|
|
|
|
shark_chase_player()
|
|
{
|
|
self endon( "chomp" );
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
self setgoalpos( level.player.node_closest.origin );
|
|
wait 0.25;
|
|
}
|
|
}
|
|
|
|
waittill_goal_or_dist()
|
|
{
|
|
self endon( "death" );
|
|
childthread maps\_utility::notify_delay( "timeout", 0.8 );
|
|
self endon( "goal" );
|
|
self endon( "timeout" );
|
|
|
|
while ( distance( level.player.origin, self.origin ) > self.goalradius )
|
|
wait 0.05;
|
|
}
|
|
|
|
notify_spotted_on_damage()
|
|
{
|
|
self endon( "death" );
|
|
self waittill( "damage", var_0, var_1 );
|
|
|
|
if ( var_1 == level.player )
|
|
common_scripts\utility::flag_set( "_stealth_spotted" );
|
|
}
|
|
|
|
make_swimmer()
|
|
{
|
|
if ( self.team == "allies" )
|
|
return;
|
|
|
|
if ( self.type == "dog" )
|
|
return;
|
|
|
|
if ( !isdefined( self.swimmer ) || self.swimmer == 0 )
|
|
thread maps\_swim_ai::enable_swim();
|
|
}
|
|
|
|
delete_on_notify( var_0 )
|
|
{
|
|
if ( !isdefined( var_0 ) )
|
|
var_0 = "level_cleanup";
|
|
|
|
self endon( "death" );
|
|
level waittill( var_0 );
|
|
|
|
if ( isdefined( self.magic_bullet_shield ) && self.magic_bullet_shield )
|
|
maps\_utility::stop_magic_bullet_shield();
|
|
|
|
self delete();
|
|
}
|
|
|
|
baker_noncombat()
|
|
{
|
|
level.baker clearenemy();
|
|
level.baker.alertlevel = "noncombat";
|
|
level.baker.a.combatendtime = gettime() - 10000;
|
|
}
|
|
|
|
moveto_rotateto( var_0, var_1, var_2, var_3 )
|
|
{
|
|
self moveto( var_0.origin, var_1, var_2, var_3 );
|
|
self rotateto( var_0.angles, var_1, var_2, var_3 );
|
|
self waittill( "movedone" );
|
|
}
|
|
|
|
set_flag_unless_triggered( var_0, var_1 )
|
|
{
|
|
self endon( "trigger" );
|
|
self endon( "death" );
|
|
wait( var_1 );
|
|
common_scripts\utility::flag_set( var_0 );
|
|
}
|
|
|
|
sdv_play_sound_on_entity()
|
|
{
|
|
self vehicle_turnengineoff();
|
|
thread maps\_utility::play_sound_on_entity( "scn_shipg_minisub_passby" );
|
|
}
|
|
|
|
track_hint_up()
|
|
{
|
|
common_scripts\utility::flag_clear( "player_can_rise" );
|
|
level.player notifyonplayercommand( "pressed_up", "+frag" );
|
|
level.player notifyonplayercommand( "pressed_up", "+gostand" );
|
|
level.player waittill( "pressed_up" );
|
|
common_scripts\utility::flag_set( "player_can_rise" );
|
|
}
|
|
|
|
track_hint_down()
|
|
{
|
|
common_scripts\utility::flag_clear( "player_can_fall" );
|
|
level.player notifyonplayercommand( "pressed_down", "+smoke" );
|
|
level.player notifyonplayercommand( "pressed_down", "+toggleprone" );
|
|
level.player notifyonplayercommand( "pressed_down", "+stance" );
|
|
level.player waittill( "pressed_down" );
|
|
common_scripts\utility::flag_set( "player_can_fall" );
|
|
}
|
|
|
|
track_hint_sprint()
|
|
{
|
|
common_scripts\utility::flag_clear( "player_can_sprint" );
|
|
level.player notifyonplayercommand( "pressed_sprint", "+sprint" );
|
|
level.player notifyonplayercommand( "pressed_sprint", "+sprint_zoom" );
|
|
level.player notifyonplayercommand( "pressed_sprint", "+breath_sprint" );
|
|
level.player waittill( "pressed_sprint" );
|
|
common_scripts\utility::flag_set( "player_can_sprint" );
|
|
}
|
|
|
|
hintup_test()
|
|
{
|
|
return common_scripts\utility::flag( "player_can_rise" );
|
|
}
|
|
|
|
hintdown_test()
|
|
{
|
|
return common_scripts\utility::flag( "player_can_fall" );
|
|
}
|
|
|
|
hintsprint_test()
|
|
{
|
|
return common_scripts\utility::flag( "player_can_sprint" );
|
|
}
|
|
|
|
hintflashlight_test()
|
|
{
|
|
return !level.player maps\_utility::ent_flag( "flashlight_on" );
|
|
}
|
|
|
|
sardines_path_sound( var_0, var_1 )
|
|
{
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = "scn_fish_swim_away";
|
|
|
|
var_2 = common_scripts\utility::get_target_ent( var_0 );
|
|
var_2 waittill( "trigger" );
|
|
var_3 = getent( var_0, "target" );
|
|
common_scripts\utility::waitframe();
|
|
var_3.pieces[0] thread maps\_utility::play_sound_on_entity( var_1 );
|
|
}
|
|
|
|
sardines_path_sound_no_trigger( var_0, var_1 )
|
|
{
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = "scn_fish_swim_away";
|
|
|
|
var_2 = getent( var_0, "script_noteworthy" );
|
|
common_scripts\utility::waitframe();
|
|
var_2.pieces[0] thread maps\_utility::play_sound_on_entity( var_1 );
|
|
}
|
|
|
|
delete_fish_in_volume( var_0 )
|
|
{
|
|
var_0 = common_scripts\utility::get_target_ent( var_0 );
|
|
var_1 = getentarray( "interactive_fish_bannerfish", "targetname" );
|
|
|
|
foreach ( var_3 in var_1 )
|
|
{
|
|
if ( isdefined( var_3 ) )
|
|
{
|
|
if ( var_3 istouching( var_0 ) )
|
|
var_3 delete();
|
|
}
|
|
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
}
|
|
|
|
trigger_multiple_fx_volume_off_target()
|
|
{
|
|
wait 1;
|
|
self waittill( "trigger" );
|
|
var_0 = common_scripts\utility::get_target_ent();
|
|
maps\_utility::fx_volume_pause( var_0 );
|
|
}
|
|
|
|
try_to_melee_player( var_0 )
|
|
{
|
|
level endon( var_0 );
|
|
level.player endon( "death" );
|
|
|
|
if ( !common_scripts\utility::flag( var_0 ) )
|
|
{
|
|
level endon( var_0 );
|
|
|
|
for ( var_1 = getaiarray( "axis" ); var_1.size > 0; var_1 = getaiarray( "axis" ) )
|
|
{
|
|
var_1 = sortbydistance( var_1, level.player.origin );
|
|
var_2 = undefined;
|
|
|
|
foreach ( var_4 in var_1 )
|
|
{
|
|
if ( distance( var_4.origin, level.player.origin ) > 200 )
|
|
{
|
|
var_2 = var_4;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( isdefined( var_2 ) )
|
|
{
|
|
var_2 childthread enemy_attempt_melee();
|
|
var_6 = var_2 common_scripts\utility::waittill_any_return( "death", "start_melee" );
|
|
|
|
if ( var_6 == "start_melee" )
|
|
wait 90;
|
|
else
|
|
wait 0.5;
|
|
|
|
continue;
|
|
}
|
|
|
|
wait 2;
|
|
}
|
|
}
|
|
}
|
|
|
|
enemy_attempt_melee()
|
|
{
|
|
level.player endon( "death" );
|
|
self endon( "death" );
|
|
maps\_utility::ent_flag_init( "adjusting_position" );
|
|
self.ignoreme = 1;
|
|
self.favoriteenemy = level.player;
|
|
self setthreatbiasgroup( "ignoring_baker" );
|
|
self.turnrate = 1;
|
|
self.moveplaybackrate = 2;
|
|
self.movetransitionrate = self.moveplaybackrate;
|
|
self.goalradius = 128;
|
|
self.goalheight = 96;
|
|
self setgoalentity( level.player, 50 );
|
|
|
|
for (;;)
|
|
{
|
|
self.goalradius = 128;
|
|
|
|
while ( distance2d( self.origin, level.player.origin ) > self.goalradius + 64 )
|
|
wait 0.05;
|
|
|
|
self.goalradius = 128;
|
|
var_0 = self aiphysicstrace( self.origin, level.player geteye(), undefined, undefined, 1, 1 );
|
|
|
|
if ( var_0["fraction"] < 0.99 )
|
|
{
|
|
thread enemy_melee_readjust();
|
|
wait 0.2;
|
|
continue;
|
|
}
|
|
else if ( distance2d( self.origin, level.player.origin ) <= self.goalradius + 64 )
|
|
break;
|
|
}
|
|
|
|
self notify( "start_melee" );
|
|
self.health = 900;
|
|
thread enemy_melee_front( self );
|
|
}
|
|
|
|
enemy_melee_readjust()
|
|
{
|
|
if ( maps\_utility::ent_flag( "adjusting_position" ) )
|
|
return;
|
|
|
|
self notify( "adjusting_pos" );
|
|
self endon( "start_melee" );
|
|
self endon( "adjusting_pos" );
|
|
self endon( "death" );
|
|
maps\_utility::ent_flag_set( "adjusting_position" );
|
|
maps\_utility::delaythread( 2, maps\_utility::ent_flag_clear, "adjusting_position" );
|
|
var_0 = getnodesinradiussorted( level.player.origin, self.goalradius + 64, 64, self.goalheight );
|
|
|
|
if ( var_0.size > 0 )
|
|
{
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
var_3 = self aiphysicstrace( self.origin, level.player geteye(), undefined, undefined, 1, 1 );
|
|
|
|
if ( var_3["fraction"] > 0.99 )
|
|
{
|
|
self setgoalpos( var_2.origin );
|
|
self waittill( "goal" );
|
|
self setgoalentity( level.player, 50 );
|
|
return;
|
|
}
|
|
else
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
}
|
|
}
|
|
|
|
enemy_melee_front( var_0, var_1 )
|
|
{
|
|
playfxontag( common_scripts\utility::getfx( "rebreather_hose_bubbles" ), var_0.scuba_org, "tag_origin" );
|
|
var_0 unlink();
|
|
var_0 notify( "stop_loop" );
|
|
|
|
if ( isdefined( var_0.anim_node ) )
|
|
var_0.anim_node notify( "stop_loop" );
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = "melee_A";
|
|
|
|
level.player.pre_melee_origin = level.player.origin;
|
|
var_2 = spawnstruct();
|
|
var_2.origin = var_0.origin;
|
|
var_2.angles = vectortoangles( level.player.origin - var_0.origin );
|
|
var_3 = level.player.origin;
|
|
var_4 = anglestoforward( level.player.angles );
|
|
var_5 = anglestoright( level.player.angles );
|
|
var_6 = ( 0, 0, 48 );
|
|
var_7 = maps\_player_rig::get_player_rig();
|
|
var_7.origin = level.player.origin - var_6;
|
|
var_7.angles = level.player.angles;
|
|
var_7 hide();
|
|
var_8 = common_scripts\utility::spawn_tag_origin();
|
|
var_8.origin = var_7.origin;
|
|
var_8.angles = var_7.angles;
|
|
var_8 linkto( var_7, "tag_player", var_6, ( 0, 0, 0 ) );
|
|
var_9 = var_0 gettagorigin( "tag_inhand" );
|
|
var_10 = var_0 gettagangles( "tag_inhand" );
|
|
var_0 attach( "weapon_parabolic_knife", "tag_inhand", 1 );
|
|
level.player thread melee_dof();
|
|
var_0 thread maps\_utility::magic_bullet_shield();
|
|
var_2 thread maps\_anim::anim_single_solo( var_7, var_1 );
|
|
var_2 thread maps\_anim::anim_generic( var_0, var_1 );
|
|
level.player disableweapons();
|
|
level.player enabledeathshield( 1 );
|
|
var_11 = 0.5;
|
|
level.player playerlinktoblend( var_8, "tag_origin", var_11, var_11, 0 );
|
|
var_7 common_scripts\utility::delaycall( var_11, ::show );
|
|
level.player maps\_utility::delaythread( 2, ::player_panic_bubbles );
|
|
wait 2.4;
|
|
|
|
if ( level.player.health < 60 )
|
|
melee_kill_stab( var_0, var_1, var_7, var_2 );
|
|
else
|
|
melee_damage_stab( var_0, var_1, var_7, var_2 );
|
|
}
|
|
|
|
melee_damage_stab( var_0, var_1, var_2, var_3 )
|
|
{
|
|
level.player endon( "melee_button_pressed" );
|
|
level.player thread melee_wait_for_player_input();
|
|
level.player thread melee_hint();
|
|
level.player thread melee_acknowledge_player_input( var_0, var_1, var_2, var_3, 0 );
|
|
var_3 waittill( var_1 );
|
|
level.player notify( "melee_done" );
|
|
level.player thread melee_damage( var_0, var_1, var_2, var_3 );
|
|
}
|
|
|
|
melee_damage( var_0, var_1, var_2, var_3 )
|
|
{
|
|
level.player notify( "melee_win", 0 );
|
|
var_3 thread maps\_anim::anim_generic( var_0, var_1 + "_stab1" );
|
|
var_3 thread maps\_anim::anim_single_solo( var_2, var_1 + "_stab1" );
|
|
level waittill( "stab" );
|
|
var_4 = var_0 gettagorigin( "tag_knife_fx" );
|
|
level.player dodamage( 200, var_4 );
|
|
level.player playrumbleonentity( "damage_heavy" );
|
|
level.player thread maps\_utility::play_sound_on_entity( "generic_death_enemy_1" );
|
|
wait 0.1;
|
|
var_4 = var_0 gettagorigin( "tag_knife_fx" );
|
|
var_3 waittill( var_1 + "_stab1" );
|
|
var_3 thread maps\_anim::anim_generic( var_0, var_1 + "_reset" );
|
|
var_3 thread maps\_anim::anim_single_solo( var_2, var_1 + "_reset" );
|
|
common_scripts\utility::noself_delaycall( 0.2, ::playfxontag, common_scripts\utility::getfx( "knife_stab_blood" ), var_0, "tag_knife_fx" );
|
|
wait 0.65;
|
|
level.player endon( "melee_button_pressed" );
|
|
setslowmotion( 1, 0.4, 0.1 );
|
|
level.player thread melee_wait_for_player_input();
|
|
level.player thread melee_hint();
|
|
level.player thread melee_acknowledge_player_input( var_0, var_1, var_2, var_3, 1 );
|
|
var_3 waittill( var_1 + "_reset" );
|
|
level.player notify( "melee_done" );
|
|
level.player thread melee_lose( var_0, var_1, var_2, var_3 );
|
|
}
|
|
|
|
melee_kill_stab( var_0, var_1, var_2, var_3 )
|
|
{
|
|
level.player endon( "melee_button_pressed" );
|
|
setslowmotion( 1, 0.4, 0.1 );
|
|
level.player thread melee_wait_for_player_input();
|
|
level.player thread melee_hint();
|
|
level.player thread melee_acknowledge_player_input( var_0, var_1, var_2, var_3, 1 );
|
|
var_3 waittill( var_1 );
|
|
level.player notify( "melee_done" );
|
|
level.player thread melee_lose( var_0, var_1, var_2, var_3 );
|
|
}
|
|
|
|
melee_lose( var_0, var_1, var_2, var_3 )
|
|
{
|
|
level.player notify( "melee_win", 0 );
|
|
setslowmotion( 0.4, 1, 0.1 );
|
|
var_3 thread maps\_anim::anim_generic( var_0, var_1 + "_stab2" );
|
|
var_3 thread maps\_anim::anim_single_solo( var_2, var_1 + "_stab2" );
|
|
var_3 waittill( var_1 + "_stab2" );
|
|
var_3 thread maps\_anim::anim_generic( var_0, var_1 + "_lose" );
|
|
var_3 thread maps\_anim::anim_single_solo( var_2, var_1 + "_lose" );
|
|
wait 0.1;
|
|
var_4 = var_0 gettagorigin( "tag_knife_fx" );
|
|
playfx( common_scripts\utility::getfx( "swim_ai_blood_impact" ), var_4 );
|
|
level.player dodamage( 90, var_4 );
|
|
level.player thread maps\_utility::play_sound_on_entity( "generic_death_enemy_1" );
|
|
wait 0.1;
|
|
playfx( common_scripts\utility::getfx( "swim_ai_death_blood" ), level.player geteye() );
|
|
level.player enabledeathshield( 0 );
|
|
level.player kill();
|
|
}
|
|
|
|
melee_acknowledge_player_input( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
level.player endon( "melee_done" );
|
|
level.player waittill( "melee_button_pressed" );
|
|
level.player notify( "melee_win", 1 );
|
|
level.player enabledeathshield( 0 );
|
|
level.player enableinvulnerability();
|
|
var_0 maps\_utility::stop_magic_bullet_shield();
|
|
var_0.allowdeath = 1;
|
|
var_5 = var_2 gettagorigin( "tag_knife_attach" );
|
|
var_6 = var_2 gettagangles( "tag_knife_attach" );
|
|
var_2 attach( "viewmodel_knife", "tag_knife_attach", 0 );
|
|
|
|
if ( var_4 )
|
|
setslowmotion( 0.4, 1, 0.25 );
|
|
|
|
level.player maps\_utility::delaythread( 2.8, ::melee_player_lerp_back, var_2 );
|
|
var_3 thread maps\_anim::anim_generic( var_0, var_1 + "_win" );
|
|
var_3 thread maps\_anim::anim_single_solo( var_2, var_1 + "_win" );
|
|
level waittill( "stab" );
|
|
var_7 = var_2 gettagorigin( "tag_knife_fx" );
|
|
var_0 thread animscripts\death::playdeathsound();
|
|
playfx( common_scripts\utility::getfx( "swim_ai_blood_impact" ), var_7 );
|
|
playfxontag( common_scripts\utility::getfx( "swim_ai_death_blood" ), var_0, "j_spineupper" );
|
|
level.player notify( "melee_dof_adjust" );
|
|
level waittill( "pull_out" );
|
|
playfxontag( common_scripts\utility::getfx( "knife_stab_blood" ), var_2, "tag_knife_fx" );
|
|
var_3 waittill( var_1 + "_win" );
|
|
stopfxontag( common_scripts\utility::getfx( "rebreather_hose_bubbles" ), var_0.scuba_org, "tag_origin" );
|
|
var_0.a.nodeath = 1;
|
|
var_0.nodeathsound = 1;
|
|
var_0 detach( "weapon_parabolic_knife", "tag_inhand" );
|
|
var_0 kill();
|
|
playfxontag( common_scripts\utility::getfx( "swim_ai_death_blood" ), var_0, "j_spineupper" );
|
|
var_2 delete();
|
|
level.player enableweapons();
|
|
level.player disableinvulnerability();
|
|
}
|
|
|
|
melee_player_lerp_back( var_0 )
|
|
{
|
|
var_0 hide();
|
|
var_1 = common_scripts\utility::spawn_tag_origin();
|
|
var_1.origin = level.player.pre_melee_origin;
|
|
var_1.angles = level.player.angles;
|
|
var_2 = 0.75;
|
|
level.player playerlinktoblend( var_1, "tag_origin", var_2, 0.2, 0.2 );
|
|
wait( var_2 );
|
|
common_scripts\utility::waitframe();
|
|
level.player unlink();
|
|
level.player enableweapons();
|
|
level.player disableinvulnerability();
|
|
level.player.pre_melee_origin = undefined;
|
|
var_1 delete();
|
|
}
|
|
|
|
melee_wait_for_player_input()
|
|
{
|
|
level.player endon( "melee_button_pressed" );
|
|
level.player endon( "melee_done" );
|
|
|
|
while ( level.player player_attacked() )
|
|
wait 0.05;
|
|
|
|
while ( !level.player player_attacked() )
|
|
wait 0.05;
|
|
|
|
level.player notify( "melee_button_pressed" );
|
|
}
|
|
|
|
player_attacked()
|
|
{
|
|
return isalive( self ) && self meleebuttonpressed();
|
|
}
|
|
|
|
melee_hint()
|
|
{
|
|
if ( isdefined( self.meleehintelem ) )
|
|
self.meleehintelem maps\_hud_util::destroyelem();
|
|
|
|
self.meleehintelem = maps\_hud_util::createclientfontstring( "default", 3 );
|
|
self.meleehintelem.color = ( 1, 1, 1 );
|
|
self.meleehintelem settext( &"SCRIPT_PLATFORM_DOG_HINT" );
|
|
self.meleehintelem.x = 25;
|
|
self.meleehintelem.y = -30;
|
|
self.meleehintelem.alignx = "center";
|
|
self.meleehintelem.aligny = "middle";
|
|
self.meleehintelem.horzalign = "center";
|
|
self.meleehintelem.vertalign = "middle";
|
|
self.meleehintelem.foreground = 1;
|
|
self.meleehintelem.alpha = 1;
|
|
self.meleehintelem.hidewhendead = 1;
|
|
self.meleehintelem.sort = -1;
|
|
self.meleehintelem endon( "death" );
|
|
self waittill( "melee_win", var_0 );
|
|
thread melee_hint_fade( var_0 );
|
|
}
|
|
|
|
melee_hint_fade( var_0 )
|
|
{
|
|
if ( isdefined( self ) && isdefined( self.meleehintelem ) )
|
|
{
|
|
var_1 = self.meleehintelem;
|
|
|
|
if ( var_0 )
|
|
{
|
|
var_2 = 0.5;
|
|
var_1 changefontscaleovertime( var_2 );
|
|
var_1.fontscale = var_1.fontscale * 1.5;
|
|
var_1.glowcolor = ( 0.3, 0.6, 0.3 );
|
|
var_1.glowalpha = 1;
|
|
var_1 fadeovertime( var_2 );
|
|
var_1.color = ( 0, 0, 0 );
|
|
var_1.alpha = 0;
|
|
wait( var_2 );
|
|
var_1 maps\_hud_util::destroyelem();
|
|
}
|
|
else
|
|
var_1 maps\_hud_util::destroyelem();
|
|
}
|
|
}
|
|
|
|
melee_dof()
|
|
{
|
|
common_scripts\utility::flag_set( "pause_dynamic_dof" );
|
|
maps\_art::dof_enable_script( 0, 10, 10, 70, 100, 10, 0.5 );
|
|
level.player waittill( "melee_dof_adjust" );
|
|
maps\_art::dof_disable_script( 1 );
|
|
wait 1;
|
|
common_scripts\utility::flag_clear( "pause_dynamic_dof" );
|
|
}
|
|
|
|
e3_text_hud( var_0, var_1 )
|
|
{
|
|
var_2 = 27;
|
|
var_3 = newhudelem();
|
|
var_3.alignx = "center";
|
|
var_3.aligny = "middle";
|
|
var_3.horzalign = "center";
|
|
var_3.vertalign = "middle";
|
|
var_3.x = 0;
|
|
var_3.y = 0;
|
|
var_3 settext( var_0 );
|
|
var_3.alpha = 0;
|
|
var_3.font = "objective";
|
|
var_3.foreground = 1;
|
|
var_3.sort = 150;
|
|
var_3.color = ( 0.85, 0.93, 0.92 );
|
|
var_3.fontscale = 1.75;
|
|
var_3 fadeovertime( 0.5 );
|
|
var_3.alpha = 1;
|
|
var_3 fadeovertime( 1 );
|
|
var_3.alpha = 1;
|
|
wait 1;
|
|
wait( var_1 );
|
|
var_3 fadeovertime( 1 );
|
|
var_3.alpha = 0;
|
|
wait 1;
|
|
var_3 destroy();
|
|
}
|
|
|
|
greenlight_check()
|
|
{
|
|
return getdvarint( "e3", 0 );
|
|
}
|
|
|
|
is_demo_check()
|
|
{
|
|
return getdvarint( "demo_mode", 0 );
|
|
}
|
|
|
|
game_is_pc()
|
|
{
|
|
if ( level.xenon )
|
|
return 0;
|
|
|
|
if ( level.ps3 )
|
|
return 0;
|
|
|
|
if ( level.ps4 )
|
|
return 0;
|
|
|
|
if ( level.xb3 )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
cull_trigger_logic()
|
|
{
|
|
if ( !isdefined( self.script_index ) )
|
|
return;
|
|
|
|
for (;;)
|
|
{
|
|
if ( level.player istouching( self ) )
|
|
setculldist( self.script_index );
|
|
|
|
wait 1;
|
|
}
|
|
}
|
|
|
|
shark_collision_setup()
|
|
{
|
|
level.shark_collsions = getentarray( "shark_col", "targetname" );
|
|
|
|
foreach ( var_1 in level.shark_collsions )
|
|
{
|
|
var_1.is_available = 1;
|
|
var_1.original_origin = var_1.origin;
|
|
}
|
|
}
|
|
|
|
find_available_collision_model()
|
|
{
|
|
if ( !isdefined( level.shark_collsions ) )
|
|
return;
|
|
|
|
for ( var_0 = 0; var_0 < level.shark_collsions.size; var_0++ )
|
|
{
|
|
if ( level.shark_collsions[var_0].is_available )
|
|
{
|
|
level.shark_collsions[var_0].is_available = 0;
|
|
level.shark_collsions[var_0].origin = self.origin;
|
|
level.shark_collsions[var_0].angles = self.angles;
|
|
level.shark_collsions[var_0] linkto( self );
|
|
self.shark_collision_model = level.shark_collsions[var_0];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return_collision_model()
|
|
{
|
|
if ( !isdefined( level.shark_collsions ) || !isdefined( self.shark_collision_model ) )
|
|
return;
|
|
|
|
self.shark_collision_model unlink();
|
|
self.shark_collision_model.origin = self.shark_collision_model.original_origin;
|
|
self.shark_collision_model.is_available = 1;
|
|
}
|
|
|
|
go_to_nodes_off_sub()
|
|
{
|
|
self waittill( "jumpedout" );
|
|
|
|
if ( isdefined( self.target ) )
|
|
{
|
|
var_0 = getnode( self.target, "targetname" );
|
|
self setgoalnode( var_0 );
|
|
}
|
|
}
|