IW4-Dump-Files/maps/roadkill_code.gsc

8434 lines
185 KiB
Plaintext
Raw Permalink Blame History

#include maps\_utility;
#include common_scripts\utility;
#include maps\_anim;
#include maps\_vehicle;
#include animscripts\hummer_turret\common;
#include maps\_hud_util;
turret_guy_in_near_humvee()
{
wait( 0.2 );// let _vehicle stuff put him on the turret
vehicle = self.ridingVehicle;
angles = vehicle.angles;
angles = ( 0, angles[ 1 ], 0 );
forward = AnglesToForward( angles );
ent = spawn_tag_origin();
ent.origin = vehicle.origin + forward * 250 + ( 0, 0, 120 );
ent LinkTo( vehicle );
self.ignoreall = true;
turret = self GetTurret();
turret SetMode( "manual" );
turret SetTargetEntity( ent );
/*
for ( ;; )
{
Line( ent.origin, self.origin );
wait( 0.05 );
}
*/
}
player_fails_if_he_kills_me( damage, attacker, direction_vec, point, type, modelName, tagName )
{
if ( !isalive( attacker ) )
return;
if ( attacker != level.player )
return;
vehicle = self.ridingVehicle;
if ( isdefined( vehicle ) )
{
if ( vehicle ent_flag( "can_shoot_the_baddies" ) )
return;
}
wait( 1 );
// Friendly fire will not be tolerated!
SetDvar( "ui_deadquote", &"SCRIPT_MISSIONFAIL_KILLTEAM_AMERICAN" ); // friendly fire will not be tolerated
maps\_utility::missionFailedWrapper();
}
aim_ahead_until_you_get_enemy()
{
self endon( "death" );
for ( ;; )
{
if ( IsDefined( self.ridingVehicle ) )
break;
wait( 0.05 );
}
vehicle = self.ridingVehicle;
add_damage_function( ::player_fails_if_he_kills_me );
// this guy aims at other targets
if ( vehicle.script_index == 0 )
vehicle.target_override = "turret_aim_target_first";
angles = vehicle.angles;
angles = ( 0, angles[ 1 ], 0 );
forward = AnglesToForward( angles );
ent = spawn_tag_origin();
ent.origin = vehicle.origin + forward * 250 + ( 0, 0, 120 );
ent LinkTo( vehicle );
turret = undefined;
for ( ;; )
{
turret = self GetTurret();
if ( IsDefined( turret ) )
break;
if ( !isdefined( self.ridingVehicle ) )
return;
wait( 0.05 );
}
turret SetMode( "manual" );
turret SetTargetEntity( ent );
oldmaxsight = self.maxsightdistsqrd;
self.maxsightdistsqrd = 0;
turret.dontshoot = true;
turret thread gunner_aims_at_targets( ent, self.ridingVehicle );
flag_wait( "humvees_spin_up" );
self.maxsightdistsqrd = oldmaxsight;
thread turret_recovers_shooting_ability( vehicle, turret );
wait( RandomFloat( 1.5 ) );
turret play_sound_on_entity( "minigun_gatling_spinup_npc" );
turret StartBarrelSpin();
turret StartFiring();
vehicle ent_flag_wait( "start_aiming_at_badguys" );
turret notify( "stop_aiming_at_targets" );
}
turret_recovers_shooting_ability( vehicle, turret )
{
turret SetMode( "auto_ai" );
turret ClearTargetEntity();
vehicle ent_flag_wait( "can_shoot_the_baddies" );
//Print3d( turret.origin, "shoot", (1,0,0), 1, 1, 5000 );
turret.dontshoot = undefined;
}
gunner_aims_at_targets( default_target, vehicle )
{
self endon( "stop_aiming_at_targets" );
self endon( "death" );
targetname = "turret_aim_target";
if ( IsDefined( vehicle.target_override ) )
targetname = vehicle.target_override;
targets = GetEntArray( targetname, "targetname" );
foreach ( target in targets )
{
if ( !isdefined( target.script_noteworthy ) )
target.script_noteworthy = "";
}
level.toffset++;
for ( ;; )
{
ents = get_array_of_closest( self.origin, targets, undefined, 5, 2000, 500 );
next_target = default_target;
angles = vehicle.angles;
priority_target = undefined;
foreach ( ent in ents )
{
if ( ent.script_noteworthy == "priority" )
{
dot = get_dot( self.origin, angles, ent.origin );
//Print3d( ent.origin + (0,0,level.toffset*16), dot, (1,1,1), 1, 1.2, 100 );
if ( dot > 0.7 )
{
priority_target = ent;
break;
}
}
}
if ( IsDefined( priority_target ) )
{
next_target = priority_target;
}
else
{
for ( i = 0; i < ents.size; i++ )
{
ent = ents[ i ];
dot = get_dot( self.origin, angles, ent.origin );
//Print3d( ent.origin + (0,0,level.toffset*16), dot, (1,1,1), 1, 1.2, 100 );
if ( dot > 0.8 )
{
next_target = ent;
break;
}
}
}
if ( vehicle == level.crazy_ride_convoy[ "detour" ] )
{
// detour guy does custom aiming once the shot rings out
if ( flag( "shot_rings_out" ) )
return;
}
//thread linder( next_target );
self SetTargetEntity( next_target );
if ( next_target == default_target )
{
wait( 0.15 );
}
else
{
for ( ;; )
{
angles = vehicle.angles;
dot = get_dot( self.origin, angles, next_target.origin );
if ( dot < 0 )
break;
wait( 0.1 );
}
}
}
}
linder( ent )
{
self notify( "stop" );
self endon( "stop" );
for ( ;; )
{
Line( self.origin, ent.origin );
wait( 0.05 );
}
}
hargrove_spawner()
{
self.animname = "hargrove";
self gun_remove();
}
protect_player_while_scene_is_active()
{
timeoutEnt = SpawnStruct();
timeout_time = 10;
if ( getdvarint( "newintro" ) )
timeout_time = 18;
timeoutEnt thread notify_delay( "timeout", timeout_time );
timeoutEnt endon( "timeout" );
for ( ;; )
{
flag_wait( "player_hangs_with_commanders" );
set_player_attacker_accuracy( 0 );
level.player.IgnoreRandomBulletDamage = true;
flag_waitopen( "player_hangs_with_commanders" );
maps\_gameskill::updateAllDifficulty();
level.player.IgnoreRandomBulletDamage = false;
}
}
player_is_protected_near_commanders()
{
protect_player_while_scene_is_active();
maps\_gameskill::updateAllDifficulty();
level.player.IgnoreRandomBulletDamage = false;
}
roadkill_foley_shepherd_intro()
{
waittillframeend;// for heroes to get defined
level.shepherd thread shepherd_roams_battlefield( "shepherd_path" );
thread player_is_protected_near_commanders();
struct = getstruct( "roadkill_shepherd_scene", "targetname" );
guys = [];
guys[ "foley" ] = level.foley;
//guys[ "shepherd" ] = level.shepherd;
/*
struct thread anim_loop_solo( level.foley, "intro_idle" );
struct thread anim_loop_solo( level.shepherd, "intro_idle" );
//flag_wait( "player_enters_riverbank" );
wait( 1 );
if ( !is_default_start() )
return;
struct notify( "stop_loop" );
*/
struct thread anim_first_frame_solo( level.foley, "roadkill_riverbank_intro" );
wait( 1.5 );
struct thread anim_single_solo_run( level.foley, "roadkill_riverbank_intro" );
//struct thread anim_single_solo_run( level.shepherd, "roadkill_riverbank_intro" );
wait( 0.05 );
offset_start = 2;
animation = level.foley getanim( "roadkill_riverbank_intro" );
anim_time = GetAnimLength( animation );
start_time = offset_start / anim_time;
level.foley SetAnimTime( animation, start_time );
//animation = level.shepherd getanim( "roadkill_riverbank_intro" );
//anim_time = GetAnimLength( animation );
//start_time = offset_start / anim_time;
//level.shepherd SetAnimTime( animation, start_time );
//node = GetNode( "shepherd_walk_node", "targetname" );
//level.shepherd.a.movement = "run";
//level.shepherd SetGoalNode( node );
//level.shepherd.goalradius = 16;
//level.shepherd set_run_anim( "walk" );
//level.shepherd thread shepherd_roams_battlefield( "shepherd_path" );
node = GetNode( "foley_walk_node", "targetname" );
level.foley.a.movement = "run";
level.foley SetGoalNode( node );
level.foley.goalradius = 16;
level.foley add_to_allied_riverbank_ai();// makes him move out with convoy
for ( ;; )
{
time = level.foley GetAnimTime( animation );
if ( time >= 0.975 )
break;
wait( 0.05 );
}
level.foley anim_stopanimscripted();
}
ent_flag_set_trigger()
{
for ( ;; )
{
self waittill( "trigger", other );
if ( !first_touch( other ) )
continue;
other ent_flag_set( self.script_flag );
}
}
foley_spawner()
{
AssertEx( !isdefined( level.foley ), "Multiple Foleys!" );
level.foley = self;
self.animname = "foley";
self make_hero();
if ( !flag( "player_rolls_into_town" ) )
{
flag_wait( "player_rolls_into_town" );
self safe_delete();
}
// self gun_remove();
}
safe_delete()
{
if ( !isalive( self ) )
return;
if ( IsDefined( self.magic_bullet_shield ) )
self stop_magic_bullet_shield();
self Delete();
}
dunn_spawner()
{
AssertEx( !isdefined( level.dunn ), "Multiple Dunns!" );
level.dunn = self;
self.animname = "dunn";
// self gun_remove();
}
shepherd_spawner()
{
AssertEx( !isdefined( level.shepherd ), "Multiple Shepherds!" );
level.shepherd = self;
self.animname = "shepherd";
self make_hero();
if ( !flag( "player_rolls_into_town" ) )
{
flag_wait( "player_rolls_into_town" );
self safe_delete();
}
// self gun_remove();
}
player_humvee()
{
self.dontdisconnectpaths = true;
level.player_humvee = self;
level.player_humvee.animname = "player_humvee";
if ( level.start_point == "intro" || level.start_point == "getout" )
{
org = self player_rides_shotgun_in_humvee( 170, 170, 45, 15 );
flag_wait( "slam_hood" );
wait( 1.5 );
org player_leaves_humvee();
level.player AllowCrouch( true );
level.player AllowProne( true );
}
/*
level.player PlayerLinkTo( self, "tag_player", 0 );
turret = self.mgturret[ 0 ];
turret MakeUsable();
turret SetMode( "manual" );
turret UseBy( level.player );
turret MakeUnusable();
// thread player_viewhands_minigun( level.suburbans[ 2 ].mgturret[ 0 ] );
level.player DisableTurretDismount();
*/
}
player_turret_humvee()
{
self.dontdisconnectpaths = true;
level.player_humvee = self;
level.player_humvee.animname = "player_humvee";
self player_gets_on_turret();
}
player_gets_on_turret()
{
thread warn_if_player_shoots_prematurely();
level.player AllowCrouch( true );
level.player AllowProne( true );
//level.player PlayerLinkTo( self, "tag_player", 0 );
level.player PlayerLinkToDelta( self, "tag_player", 0.35, 360, 360, 45, 30, true );
turret = self.mgturret[ 0 ];
turret SetModel( "weapon_suburban_minigun_viewmodel" );
turret MakeUsable();
turret SetMode( "manual" );
turret UseBy( level.player );
turret MakeUnusable();
//turret Hide();
level.player_turret = turret;
level.player SetPlayerAngles( ( 0, level.player_humvee.angles[ 1 ], 0 ) );
// thread player_viewhands_minigun( level.suburbans[ 2 ].mgturret[ 0 ] );
level.player DisableTurretDismount();
thread maps\_minigun_viewmodel::player_viewhands_minigun( turret );
}
front_vehicle()
{
self.dontdisconnectpaths = true;
if ( is_first_start() )
{
flag_wait( "player_humvee_stops_for_officers" );
wait( 3 );
self Vehicle_SetSpeed( 0, 10, 10 );
}
flag_wait( "slam_hood" );
wait( 1.5 );
self vehicle_unload( "passengers" );
}
ending_vehicle()
{
self.dontunloadonend = true;
self.dontdisconnectpaths = true;
self waittill( "reached_end_node" );
level.ending_vehicles[ level.ending_vehicles.size ] = self;
}
shepherd_ending_vehicle()
{
self.dontunloadonend = true;
self.dontdisconnectpaths = true;
self waittill( "reached_end_node" );
self vehicle_unload( "rear_driver_side" );
}
near_vehicle()
{
level.near_vehicle = self;
self.dontunloadonend = true;
self.dontdisconnectpaths = true;
// the humvee right in front of the player
if ( is_first_start() )
{
flag_wait( "player_humvee_stops_for_officers" );
wait( 3 );
}
flag_wait( "slam_hood" );
wait( 1.5 );
self vehicle_unload( "passengers" );
// self Vehicle_SetSpeed( 0, 1, 1 );
}
rear_vehicle()
{
self.dontdisconnectpaths = true;
if ( is_first_start() )
{
flag_wait( "player_humvee_stops_for_officers" );
// the vehicles behind you slow down
for ( ;; )
{
speed = level.player_humvee.veh_speed;
accel = speed;
if ( accel <= 5 )
{
accel = 5;
}
self Vehicle_SetSpeed( speed, accel, accel );
if ( flag( "slam_hood" ) )
break;
wait( 0.05 );
}
}
wait( 1.5 );
self vehicle_unload( "passengers" );
}
intro_convoy()
{
self ent_flag_init( "convoy_stops_for_bridge" );
}
roadkill_bridge_layer( bridge_model )
{
spawner = GetEnt( "bridge_layer_spawner", "targetname" );
spawner.animname = "bridge_layer";
if ( before_bridge_start() )
{
org = getstruct( "bridge_layer_org", "targetname" );
org anim_teleport_solo( spawner, "bridge_driveup" );
}
else
{
org = getstruct( "bridge_layer_org", "targetname" );
org anim_teleport_solo( spawner, "bridge_cross" );
node = GetVehicleNode( "bridge_layer_path_1", "targetname" );
spawner.origin = node.origin;
}
spawner add_spawn_function( ::bridge_layer_think );
spawner spawn_vehicle();
}
intro_rundown_friendly_spawner()
{
self.pathrandompercent = 200;
}
before_bridge_start()
{
if ( level.start_point == "intro" )
return true;
return level.start_point == "riverbank";
}
bridge_layer_think()
{
self.dontdisconnectpaths = true;
level.bridge_layer = self;
self.animname = "bridge_layer";
level.bridge_start_time = GetTime();
org = getstruct( "bridge_layer_org", "targetname" );
self assign_animtree();
bridge_model = self.bridge_model;// comes with the vehicle
bridge_model.animname = "bridge_layer_bridge";
bridge_model assign_animtree();
bridge_clip = GetEnt( "bridge_clip", "targetname" );
bridge_clip add_target_pivot();
bridge_clip.pivot LinkTo( bridge_model, "origin_animate_jnt", ( 0, 0, 0 ), ( 0, 0, 180 ) );
bridge_clip Hide();
thread bridge_layer_is_threatened_by_baddies( bridge_model );
guys = [];
guys[ "vehicle" ] = self;
guys[ "bridge" ] = bridge_model;
if ( before_bridge_start() )
{
bridge_model Unlink();
arm_animation = self getanim( "bridge_arm_lower" );
array_thread( guys, ::slow_down_bridge );
// org anim_first_frame( guys, "bridge_lower" );
org thread anim_single( guys, "bridge_lower" );
wait( 0.05 );
foreach ( guy in guys )
{
animation = guy getanim( "bridge_lower" );
guy SetFlaggedAnim( "single anim", animation, 1, 0, 0 );
}
//self SetAnim( arm_animation, 1, 0, 0 );
// flag_wait( "bridgelayer_starts" );
org thread anim_single( guys, "bridge_lower" );
bridge_anim_rate = 0.62;
self SetFlaggedAnim( "single anim", arm_animation, 1, 0, 1 );
wait( 0.05 );
self SetFlaggedAnim( "single anim", arm_animation, 1, 0, bridge_anim_rate );
// slow down bridgelayer
foreach ( guy in guys )
{
animation = guy getanim( "bridge_lower" );
guy SetFlaggedAnim( "single anim", animation, 1, 0, bridge_anim_rate );
}
//47
bridge_animation = bridge_model getanim( "bridge_lower" );
for ( ;; )
{
if ( bridge_model GetAnimTime( bridge_animation ) >= 0.47 )
break;
wait( 0.05 );
}
self SetFlaggedAnim( "single anim", arm_animation, 1, 0, 0 );
foreach ( guy in guys )
{
animation = guy getanim( "bridge_lower" );
guy SetFlaggedAnim( "single anim", animation, 1, 0, 0 );
}
wait 17.5;
wait 25;
flag_set( "bridge_layer_attacked_by_bridge_baddies" );
start_time = GetTime();
flag_wait( "bridge_baddies_retreat" );
foreach ( guy in guys )
{
animation = guy getanim( "bridge_lower" );
guy SetFlaggedAnim( "single anim", animation, 1, 0, 1 );
}
// get the arm going full speed again
self SetFlaggedAnim( "single anim", arm_animation, 1, 0, 1 );
bridge_animation = bridge_model getanim( "bridge_lower" );
for ( ;; )
{
if ( bridge_model GetAnimTime( bridge_animation ) >= 0.68 )
break;
wait( 0.05 );
}
wait_for_buffer_time_to_pass( start_time, 30 );
flag_set( "riverbank_baddies_retreat" );// controls the guys in the windows
flag_set( "leaving_riverbank" );// controls the guys in the windows
SetSavedDvar( "compass", 1 );
level notify( "tanks_stop_firing" );
for ( ;; )
{
if ( bridge_model GetAnimTime( bridge_animation ) >= 0.98 )
break;
wait( 0.05 );
}
}
else
{
org thread anim_single( guys, "bridge_lower" );
bridge_model Unlink();
// org thread anim_single_solo( bridge_model, "bridge_lower" );
wait( 0.05 );
animation = bridge_model getanim( "bridge_lower" );
bridge_model SetAnimTime( animation, 0.99 );
wait( 1 );
}
player_bridge_clip = GetEnt( "player_bridge_clip", "targetname" );
player_bridge_clip Delete();
flag_set( "bridgelayer_complete" );
level.bridge_total_time = GetTime() - level.bridge_start_time;
delayThread( 4, ::flag_set, "bridgelayer_crosses" );
animation = getanim( "bridge_lower" );
//self ClearAnim( animation, 0 );
self StopAnimScripted();
node = GetVehicleNode( "bridge_layer_path_1", "targetname" );
self StartPath( node );
// self.veh_pathtype = "constrained";
self thread vehicle_paths( node );
if ( !before_bridge_start() )
{
// speed boost
self Vehicle_SetSpeedImmediate( 30, 5, 5 );
wait( 1 );
self ResumeSpeed( 5 );
}
self waittill( "reached_end_node" );
flag_wait( "player_gets_in" );
spawn_vehicles_from_targetname_and_drive( "lead_vehicle_spawner" );
// self vehicleDriveTo( node.origin, 30 );
// org anim_single_solo( self, "bridge_cross" );
}
slow_down_bridge()
{
wait( 0.05 );
animation = self getanim( "bridge_lower" );
// self SetAnim( animation, 1, 0, 2.5 );
}
enemy_bridge_spawner_damage( damage, attacker, direction_vec, point, type, modelName, tagName )
{
if ( !isalive( attacker ) )
return;
if ( attacker != level.player )
return;
flag_set( "player_attacked_bridge_enemy" );
}
enemy_bridge_spawner()
{
startpos = self.origin;
self endon( "death" );
self setthreatbiasgroup( "bridge_attackers" );
add_damage_function( ::enemy_bridge_spawner_damage );
self.attackeraccuracy = 0.05;
self.IgnoreRandomBulletDamage = true;
flag_wait( "bridge_baddies_retreat" );
wait( RandomFloat( 1.5 ) );
node = GetNode( self.target, "targetname" );
self SetGoalNode( node );
self.goalradius = node.radius;
self waittill( "goal" );
self SetGoalPos( startpos );
self.goalradius = 16;
self waittill( "goal" );
self Delete();
}
enemy_bridge_vehicle_spawner()
{
flag_wait( "bridge_truck_waits" );
wait_until_player_ads_on_truck();
flag_set( "bridge_truck_leaves" );
}
wait_until_player_ads_on_truck()
{
/#
flag_assert( "bridge_baddies_retreat" );
#/
level endon( "bridge_baddies_retreat" );
for ( ;; )
{
dot = get_dot( level.player GetEye(), level.player GetPlayerAngles(), self.origin );
if ( dot > 0.998 && level.player PlayerAds() >= 1.0 )
break;
wait( 0.05 );
}
wait( 2.5 );
}
bridge_layer_is_threatened_by_baddies( bridge_model )
{
if ( !is_default_start() )
return;
flag_wait( "bridge_layer_attacked_by_bridge_baddies" );
/*
animation = bridge_model getanim( "bridge_lower" );
for ( ;; )
{
animtime = bridge_model GetAnimTime( animation );
if ( animtime > 0.43 )
break;
wait( 0.05 );
}
*/
array_spawn_function_targetname( "enemy_bridge_vehicle_spawner", ::enemy_bridge_vehicle_spawner );
spawn_vehicles_from_targetname_and_drive( "enemy_bridge_vehicle_spawner" );
wait( 1 );
array_spawn_function_targetname( "bridge_defender_spawner", ::bridge_defender_spawner );
delayThread( 2, ::array_spawn_targetname, "bridge_defender_spawner" );
array_spawn_targetname( "enemy_bridge_spawner" );
wait( 2 );
thread bridge_attack_warning_dialogue();
// add_wait( ::waittill_dead, guys, 3 );
// add_wait( ::bridge_almost_done, bridge_model );
// do_wait_any();
thread fail_if_player_doesnt_defend_bridge();
if ( level.gameskill >= 2 )
{
// higher player threat bias to get their attention.
SetThreatBias( "just_player", "bridge_attackers", 3000 );
}
flag_wait( "player_attacked_bridge_enemy" );
SetThreatBias( "just_player", "bridge_attackers", 0 );
wait( 7 );
flag_set( "bridge_baddies_retreat" );
wait( 2.5 );
// They're retreating, keep hitting 'em!
level.foley thread play_sound_on_entity( "roadkill_fly_keephitting" );
// foley_line( "roadkill_fly_keephitting" );
}
bridge_attack_warning_dialogue()
{
wait( 3 );
// On the bridge, 10 o'clock high! Multiple targets, take em ouuutt!!!
thread foley_line( "roadkill_fly_10oclockhigh" );
wait( 3.2 );
// Up on the bridge, far side!!
dunn_line( "roadkill_cpd_farside" );
if ( flag( "player_attacked_bridge_enemy" ) )
return;
level endon( "player_attacked_bridge_enemy" );
wait( 2.2 );
// Up there! They're making a push for the bridgelayer! Beat 'em back!
thread foley_line( "roadkill_fly_makingapush" );
wait( 2.8 );
// They're going for the bridge-layer!!
dunn_line( "roadkill_cpd_bridgelayer" );
wait( 1.8 );
// Up there on the bridge!!!
foley_line( "roadkill_fly_onthebridge" );
}
fail_if_player_doesnt_defend_bridge()
{
level endon( "player_attacked_bridge_enemy" );
if ( flag( "player_attacked_bridge_enemy" ) )
return;
wait( 20 );
thread bridge_layer_explodes();
}
bridge_layer_explodes()
{
// The bridge layer was destroyed.
SetDvar( "ui_deadquote", &"ROADKILL_BRIDGELAYER_DESTROYED" );
delayThread( 3, ::missionFailedWrapper );
explosion_fx = getfx( "bmp_explosion" );
for ( ;; )
{
vector = randomvector( 200 );
z = vector[ 2 ];
z *= 0.5;
z = abs( z );
vector = set_z( vector, z );
PlayFX( explosion_fx, level.bridge_layer.origin + vector );
timer = RandomFloatRange( 0.4, 0.8 );
wait( timer );
}
}
bridge_defender_spawner()
{
self endon( "death" );
self.attackeraccuracy = 0;
self.IgnoreRandomBulletDamage = 1;
flag_wait( "player_climbs_stairs" );
self Delete();
}
bridge_almost_done( bridge_model )
{
animation = bridge_model getanim( "bridge_lower" );
for ( ;; )
{
animtime = bridge_model GetAnimTime( animation );
if ( animtime > 0.75 )
break;
wait( 0.05 );
}
}
fluorescentFlicker()
{
for ( ;; )
{
self SetLightIntensity( .8 );
wait( RandomFloatRange( 0.1, 1.5 ) );
self SetLightIntensity( RandomFloatRange( 0.6, .9 ) * .8 );
wait( RandomFloatRange( .05, .1 ) );
}
}
lights()
{
lights = GetEntArray( "flickerlight1", "targetname" );
foreach ( light in lights )
light thread fluorescentFlicker();
}
get_orgs_from_ents( ents, dontDelete )
{
orgs = [];
foreach ( ent in ents )
{
struct = SpawnStruct();
struct.origin = ent.origin;
struct.radius = ent.radius;
orgs[ orgs.size ] = struct;
if ( !isdefined( dontDelete ) )
ent Delete();
}
return orgs;
}
riverbank_tank()
{
self endon( "death" );
level endon( "tanks_stop_firing" );
if ( !is_default_start() )
return;
ents = get_linked_ents();
orgs = get_orgs_from_ents( ents );
ent = Spawn( "script_origin", ( 0, 0, 0 ) );
ent.origin = orgs[ 0 ].origin;
self SetTurretTargetEnt( ent );
self.target_ent = ent;
wait( RandomFloat( 4 ) );
firelink = self.script_firelink;
firelink_funcs = [];
firelink_funcs[ "fire_often" ] = ::tank_fires_often;
firelink_funcs[ "fire_rarely" ] = ::tank_fires_rarely;
firelink_funcs[ "fire_never" ] = ::tank_fires_never;
firelink_funcs[ "stryker_fire" ] = ::tank_stryker_fire;
func = firelink_funcs[ firelink ];
[[ func ]]( orgs );
}
tank_fires_never( orgs )
{
ent = self.target_ent;
for ( ;; )
{
orgs = array_randomize( orgs );
foreach ( org in orgs )
{
ent.origin = org.origin;
if ( IsDefined( org.radius ) )
{
ent.origin += randomvector( org.radius );
}
if ( self Vehicle_CanTurretTargetPoint( ent.origin ) )
{
self waittill( "turret_on_target" );
wait( RandomFloatRange( 2, 3 ) );
}
else
{
wait( RandomFloatRange( 3, 5 ) );
}
}
}
}
set_target_org_close( ent )
{
// make the target position be close to where we are but on the same line
my_org = self.origin + ( 0, 0, 60 );
angles = VectorToAngles( ent.origin - my_org );
forward = AnglesToForward( angles );
ent.origin = my_org + forward * 400;
}
tank_fires_rarely( orgs )
{
ent = self.target_ent;
wait( RandomFloat( 10 ) );
for ( ;; )
{
orgs = array_randomize( orgs );
foreach ( org in orgs )
{
ent.origin = org.origin;
if ( IsDefined( org.radius ) )
{
ent.origin += randomvector( org.radius );
}
set_target_org_close( ent );
if ( self Vehicle_CanTurretTargetPoint( ent.origin ) )
{
self waittill( "turret_on_target" );
wait( RandomFloatRange( 0.5, 2 ) );
// 0, 0, 1, or 2 shots
shots = RandomInt( 4 ) - 1;
for ( i = 0; i < shots; i++ )
{
self FireWeapon();
//Line( self.origin, ent.origin, (1,0,0), 1, 0, 500 );
wait( RandomFloatRange( 5, 8 ) );
}
wait( 15 );
}
else
{
wait( RandomFloatRange( 3, 5 ) );
}
}
}
}
tank_stryker_fire( orgs )
{
if ( !is_default_start() )
{
RadiusDamage( level.riverside_bmp.origin, 128, 5000, 5000 );
return;
}
thread tank_fires_often( orgs );
//flag_wait( "player_enters_riverbank" );
wait( 18 );
// 20 second timeout
level.riverside_bmp waittill_player_lookat( 0.98, 0.1, true, 20 );
self notify( "stop_tank_fire" );
stryker_blows_up_riverside_bmp();
// go back to firing at random targets
tank_fires_often( orgs );
}
stryker_blows_up_riverside_bmp()
{
// self SetTurretTargetEnt( self.target_ent );
self.target_ent.origin = level.riverside_bmp.origin + ( 0, 0, 32 );
self waittill( "turret_on_target" );
wait( 0.25 );
// 0, 0, 1, or 2 shots
shots = RandomInt( 4 ) - 1;
for ( ;; )
{
if ( !isalive( level.riverside_bmp ) )
break;
self FireWeapon();
wait( RandomFloatRange( 1, 1.5 ) );
}
}
tank_fires_often( orgs )
{
self endon( "stop_tank_fire" );
ent = self.target_ent;
for ( ;; )
{
orgs = array_randomize( orgs );
foreach ( org in orgs )
{
ent.origin = org.origin;
if ( IsDefined( org.radius ) )
{
ent.origin += randomvector( org.radius );
}
set_target_org_close( ent );
if ( self Vehicle_CanTurretTargetPoint( ent.origin ) )
{
self waittill( "turret_on_target" );
wait( RandomFloatRange( 0.5, 2 ) );
// 0, 0, 1, or 2 shots
shots = RandomInt( 4 ) - 1;
for ( i = 0; i < shots; i++ )
{
self FireWeapon();
//Line( self.origin, ent.origin, (1,0,0), 1, 0, 500 );
wait( RandomFloatRange( 1, 3 ) );
}
wait( 3 );
}
else
{
wait( 0.5 );
//wait( RandomFloatRange( 3, 5 ) );
}
}
}
}
roadkill_officers_walk_up()
{
struct = getstruct( "intro_orders", "targetname" );
guys = get_guys_with_targetname_from_spawner( "intro_friendly_spawner" );
level.roadkill_officers = guys;
foreach ( guy in guys )
{
guy set_run_anim( "walk" );
guy.pathrandompercent = 0;
guy.moveplaybackrate = 1;
guy.goalradius = 8;
guy.walkdist = 0;
guy.disablearrivals = true;
}
if ( is_first_start() )
{
wait( 8 );
// start walking with proper separation
foreach ( guy in guys )
{
target = getstruct( guy.target, "targetname" );
guy thread maps\_spawner::go_to_node( target, "struct" );
}
wait( 5 );
struct anim_reach_together( guys, "roadkill_intro_orders" );
delayThread( 2.950, ::exploder, "intro_boom" );
delayThread( 0.5, ::spawn_vehicle_from_targetname_and_drive, "early_f15_flyby" );
}
struct anim_single( guys, "roadkill_intro_orders" );
}
detach_binocs()
{
if ( IsDefined( self.binoc ) )
self Detach( "weapon_binocular", "tag_inhand" );
self.binoc = undefined;
}
binoc_scene()
{
struct = getstruct( "binoc_scene", "targetname" );
struct thread do_binoc_scene();
struct = getstruct( "binoc_scene_spotter", "targetname" );
struct thread do_binoc_scene();
}
do_binoc_scene()
{
binoc_scene_spawners = GetEntArray( self.target, "targetname" );
guys = array_spawn( binoc_scene_spawners );
guy = guys[ 0 ];
guy.animname = guy.script_noteworthy;
if ( guy.animname == "spotter" )
{
guy Attach( "weapon_binocular", "tag_inhand" );
guy.binoc = true;
guy.convoy_func = ::detach_binocs;
}
guy.doing_looping_anim = true;
guy add_to_allied_riverbank_ai();
self thread play_binoc_scene( guy );
}
play_binoc_scene( guy )
{
self anim_first_frame_solo( guy, "binoc_scene" );
flag_wait( "player_enters_riverbank" );
wait( 0.75 );
self anim_single_solo( guy, "binoc_scene" );
if ( !flag( "player_gets_in" ) )
{
self thread anim_loop_solo( guy, "idle" );
}
flag_wait( "player_gets_in" );
self notify( "stop_loop" );
}
candy_bar_scene()
{
flag_wait( "time_to_go" );
spawners = GetEntArray( self.target, "targetname" );
guys = array_spawn( spawners );
guys[ 0 ].animname = "cover_radio3";
candyMan = guys[ 0 ];
candy = "mil_mre_chocolate01";
candyMan Attach( candy, "tag_inhand" );
foreach ( guy in guys )
{
guy.allowdeath = true;
}
self thread anim_loop( guys, "idle" );
flag_wait( "player_gets_in" );
if ( IsAlive( candyMan ) )
candyMan Delete();
}
cover_scene()
{
spawners = GetEntArray( self.target, "targetname" );
guys = array_spawn( spawners );
waittillframeend;// for auto spawn logic
// remove the ai from the array, only shepherd is an AI
newguys = [];
foreach ( guy in guys )
{
if ( IsSentient( guy ) )
continue;
newguys[ newguys.size ] = guy;
//guy NotSolid();
guy magic_bullet_shield();
guy thread shoot_from_notetrack();
}
guys = newguys;
guys[ 0 ].animname = "cover_attack2";
guys[ 1 ].animname = "cover_attack3";
if ( IsDefined( guys[ 2 ] ) )
guys[ 2 ].animname = "cover_attack1";
/*
foreach ( guy in guys )
{
//guy thread player_line();
guy.allowdeath = true;
}
*/
self.g = 5;
self thread anim_loop( guys, "idle" );
wait( 0.05 );
foreach ( guy in guys )
{
//guy thread player_line();
guy.allowdeath = true;
animation = guy getanim( "idle" )[ 0 ];
guy SetAnimTime( animation, 0.35 );
}
flag_wait( "player_gets_in" );
wait( 3.2 );
foreach ( guy in guys )
{
guy safe_delete();
}
}
shoot_from_notetrack()
{
self endon( "death" );
self.weaponsound = "drone_m4carbine_fire_npc";
for ( ;; )
{
self waittill( "fire" );
thread maps\_drone::drone_shoot_fx();
}
}
player_line()
{
for ( ;; )
{
Line( self.origin, level.player.origin );
wait( 0.05 );
}
}
radio_scene()
{
structs = [];
structs[ "1" ] = getstruct( "radio_scene1", "targetname" );
structs[ "2" ] = getstruct( "radio_scene2", "targetname" );
structs[ "3" ] = getstruct( "radio_scene3", "targetname" );
guys = [];
foreach ( index, struct in structs )
{
spawner = GetEnt( struct.target, "targetname" );
guys[ index ] = spawner spawn_ai();
}
guys[ "1" ].animname = "cover_radio1";
guys[ "2" ].animname = "cover_radio2";
guys[ "3" ].animname = "cover_radio3";
candyMan = guys[ "3" ];
candy = "mil_mre_chocolate01";
candyMan Attach( candy, "tag_inhand" );
candyMan.convoy_func = ::detach_candy;
candyMan.candy = candy;
candyMan.doing_looping_anim = true;
candyMan add_to_allied_riverbank_ai();
non_candy = [];
non_candy[ "1" ] = guys[ "1" ];
non_candy[ "2" ] = guys[ "2" ];
guys[ "2" ] gun_remove();
foreach ( index, struct in structs )
{
struct thread anim_loop_solo( guys[ index ], "idle" );
}
flag_wait( "leaving_riverbank" );
// stop shooting, guy
level.scr_anim[ "cover_radio1" ][ "idle" ][ 0 ] = level.scr_anim[ "cover_radio1" ][ "idle_noshoot" ][ 0 ];
flag_wait( "player_gets_in" );
foreach ( index, struct in structs )
{
struct notify( "stop_loop" );
}
foreach ( guy in non_candy )
{
if ( IsDefined( guy.magic_bullet_shield ) )
guy stop_magic_bullet_shield();
guy Delete();
}
}
detach_candy()
{
self Detach( self.candy, "tag_inhand" );
}
set_dontshootwhilemoving( val )
{
self.dontshootwhilemoving = val;
}
guys_film_explosion()
{
spawner = GetEnt( self.target, "targetname" );
guy = spawner spawn_ai();
guy endon( "death" );
// film1, film2, film3, film4
guy.animname = self.script_noteworthy;
model = level.scr_model[ guy.animname ];
guy Attach( model, "tag_inhand" );
if ( IsDefined( guy.script_delay ) )
{
self anim_first_frame_solo( guy, "video_film_start" );
guy script_delay();
}
self anim_single_solo( guy, "video_film_start" );
/*
if ( guy.animname == "film1" )
{
//animation = guy getanim( "video_film_idle_custom" );
array = [];
array[ 0 ] = guy;
guy thread anim_custom_animmode_loop( array, "gravity", "video_film_idle" );
}
else
{
self thread anim_loop_solo( guy, "video_film_idle" );
}
*/
self thread anim_loop_solo( guy, "video_film_idle" );
flag_wait( "video_tapers_react" );
self notify( "stop_loop" );
start_time = GetTime();
cheer_time = 6.4;// RandomFloatRange( 5.75, 6.75 );
if ( guy.animname == "film4" )
cheer_time = 8.5; // thumb guy can cheer longer
if ( guy.animname == "film3" )
cheer_time = 6.2; // thumb guy can cheer longer
if ( guy.animname == "film2" )
cheer_time = 6.9; // thumb guy can cheer longer
if ( guy.animname == "film1" )
cheer_time = 6.4; // thumb guy can cheer longer
guy.noTeleport = true;
guy disable_pain();
guy.anim_blend_time_override = 0.5;
//self anim_single_solo( guy, "video_film_react" );
if ( guy hasanim( "video_film_end" ) )
{
self thread anim_custom_animmode_solo( guy, "gravity", "video_film_react" );
wait( 4 );
guy.anim_blend_time_override = 1;
guy thread anim_custom_animmode_solo( guy, "gravity", "video_film_end" );
}
else
{
self thread anim_custom_animmode_solo( guy, "gravity", "video_film_react" );
}
wait_for_buffer_time_to_pass( start_time, cheer_time );
guy StopAnimScripted();
guy notify( "killanimscript" );
if ( IsDefined( guy.magic_bullet_shield ) )
guy stop_magic_bullet_shield();
guy.fixednode = false;
node = GetNode( "bridge_delete_node", "targetname" );
guy SetGoalNode( node );
guy.goalradius = 8;
guy waittill( "goal" );
guy Delete();
}
enemy_riverbank_rpg_spawner()
{
self endon( "death" );
bridge_targets = GetEntArray( "bridge_target", "targetname" );
//thread rpgguy();
for ( ;; )
{
target = random( bridge_targets );
target.health = 1;
self SetEntityTarget( target );
timer = RandomFloatRange( 1, 3 );
wait( timer );
}
}
rpgguy()
{
self endon( "death" );
for ( ;; )
{
Print3d( self.origin + ( 0, 0, 64 ), "RPG" );
wait( 0.05 );
}
}
riverside_house_manager( spawners )
{
if ( flag( "riverbank_baddies_retreat" ) )
return;
level endon( "riverbank_baddies_retreat" );
for ( ;; )
{
spawners = array_randomize( spawners );
foreach ( spawner in spawners )
{
for ( ;; )
{
axis = GetAIArray( "axis" );
if ( axis.size < 6 )
{
spawner.count = 1;
spawner spawn_ai();
wait( 2 );
break;
}
wait( 2 );
}
}
}
}
riverside_flood_manager( spawners )
{
if ( flag( "riverbank_baddies_retreat" ) )
return;
level endon( "riverbank_baddies_retreat" );
for ( ;; )
{
spawners = array_randomize( spawners );
foreach ( spawner in spawners )
{
for ( ;; )
{
ai = GetAIArray();
if ( ai.size < 31 )
{
spawner.count = 1;
spawner spawn_ai();
wait( 1 );
break;
}
wait( 1 );
}
}
}
}
riverside_flood_think( delay_min, delay_max )
{
if ( flag( "riverbank_baddies_retreat" ) )
return;
level endon( "riverbank_baddies_retreat" );
self endon( "death" );
wait( RandomFloat( 1 ) );
for ( ;; )
{
self.count = 1;
guy = self spawn_ai();
if ( !isalive( guy ) )
{
wait( 1 );
continue;
}
guy waittill( "death" );
timer = RandomFloatRange( delay_min, delay_max );
wait( timer );
}
}
hide_helper_model()
{
self hide_notsolid();
}
show_helper_model()
{
self show_solid();
}
riverbank_guy_dies_on_retreat()
{
self endon( "death" );
flag_wait( "riverbank_baddies_retreat" );
timer = RandomFloat( 3 );
wait( timer );
self Kill();
}
riverbank_spawner_retreat_think()
{
self endon( "death" );
self.startpos = self.origin;
flag_wait( "riverbank_baddies_retreat" );
timer = RandomFloat( 6 );
wait( timer );
self SetGoalPos( self.startpos );
self.goalradius = 8;
self waittill( "goal" );
self Delete();
}
disable_all_vehicle_mgs()
{
vehicles = GetEntArray( "script_vehicle", "code_classname" );
foreach ( vehicle in vehicles )
{
if ( IsSubStr( vehicle.classname, "technical" ) )
continue;
vehicle mgoff();
}
}
guy_gets_in_player_humvee()
{
if ( !isdefined( self.magic_bullet_shield ) )
self magic_bullet_shield();
//self disable_arrivals();
flag_wait( "convoy_moment" );
// this origin is based on where the vehicle stops, not known until after it stops so we have to manually save it off
// so the guy can run early
wait( 3.9 );
//org = ( -2492, -3826, 178 );
//org = ( -2481, -3786, 178 );// ( -2509, -3742, 176 );
//org = (-2476.36, -3766.86, 178.319);
//org = (-2473.52, -3787.51, 178.106);
//org = ( -2488, -3755, 182 );
//org = ( -2483, -3749, 176 );
org = ( -2474, -3765, 178 );
self SetGoalPos( org );
self.goalradius = 8;
self waittill( "goal" );
//flag_wait( "player_humvee_stops" );
thread guy_runtovehicle_load( self, level.player_humvee );
if ( IsDefined( self.magic_bullet_shield ) )
self stop_magic_bullet_shield();
wait( 0.4 );
PrintLn( "goalpos " + self.goalpos );
}
jeep_rider_spawner_think()
{
self.qSetGoalPos = false;
guy_runtovehicle_load( self, level.friendly_open_humvee );
}
humvee_rider_spawner()
{
spawner = GetEnt( "humvee_rider_spawner", "script_noteworthy" );
spawner waittill( "drone_spawned", guy );
spawner Delete();
AssertEx( IsAlive( guy ), "No waver!" );
guy thread humvee_rider_waver();
}
humvee_rider_waver()
{
self endon( "death" );
self gun_remove();
wait( 0.05 );
self Attach( "weapon_m16", "tag_weapon_chest" );
self.ridingVehicle anim_generic_first_frame( self, "help_player_getin", "tag_guy0" );
flag_wait( "convoy_moment" );
wait( 1.3 );
self.ridingVehicle anim_generic( self, "help_player_getin", "tag_guy0" );
self notify( "animontagdone", "end" );
flag_wait( "player_gets_in" );
wait( 3 );
if ( IsDefined( self.magic_bullet_shield ) )
self stop_magic_bullet_shield();
self Delete();
}
player_ride_vehicle()
{
level.player_humvee = self;
self.dontdisconnectpaths = true;
chairModel = "vehicle_hummer_seat_rb_obj";
self HidePart( "tag_seat_rb_hide" );
chair = Spawn( "script_model", ( 0, 0, 0 ) );
level.chair = chair;
chair SetModel( chairModel );
chair LinkTo( self, "tag_seat_rb_attach", ( 0, 0, 0 ), ( 0, 0, 0 ) );
chair MakeUsable();
// Press and hold^3 &&1 ^7to board.
//chair SetHintString( &"ROADKILL_HOLD_TO_BOARD" );
flag_wait( "convoy_moment" );
self thread gopath();
// self MakeUsable();
//time = GetTime();
//self waittill( "speed_zero_path_disconnect" );
//println( GetTime() - time );
wait( 1.3 );
self.animname = "player_humvee";
door_open_animation = self getanim( "roadkill_player_door_open" );
self SetFlaggedAnim( "other_anim_flag", door_open_animation, 1, 0, 1 );
level thread maps\_anim::start_notetrack_wait( self, "other_anim_flag" );
/*
Glowing seat model:
Use model => ( vehicle_hummer_seat_rb_obj ) as glowing seat.
I didn't set any glowing attributes for it yet, you'll have to set that
up.
To hide regular seat:
Use ( tag_seat_rb_hide ).
To attach glowing seat to regular:
Attach ( tag_seat_rb , from vehicle_hummer_seat_rb_obj) to (
tag_seat_rb_attach )
*/
//self Attach( chairModel, "tag_seat_rb_attach" );
player_rig = spawn_anim_model( "player_rig" );
player_rig LinkTo( self, "tag_body", ( 0, 0, 0 ), ( 0, 0, 0 ) );
player_rig Hide();
self anim_first_frame_solo( player_rig, "player_getin", "tag_body" );
flag_set( "player_humvee_stops" );
level.player_humvee waittill( "vehicle_flag_arrived" );
chair thread chair_waits_for_close();
chair waittill( "trigger" );
level.player DisableWeapons();
thread player_fov_zooms_in_for_turret();
/*
for ( ;; )
{
self waittill( "touch", other );
if ( !isalive( other ) )
continue;
if ( other == level.player )
break;
}
*/
self ShowPart( "tag_seat_rb_hide" );
chair Delete();
//self Detach( chairModel, "tag_seat_rb_attach" );
flag_set( "player_gets_in" );
turret = self.mgturret[ 0 ];
turret.animname = "turret";
turret assign_animtree();
guys = [];
guys[ "player" ] = player_rig;
guys[ "turret" ] = turret;
level.player SetStance( "stand" );
level.player AllowCrouch( false );
level.player AllowProne( false );
level.player PlayerLinkToBlend( player_rig, "tag_player", 0.4, 0.2, 0.2 );
player_rig delayCall( 0.2, ::Show );
turret delayThread( 1, ::lerp_out_drop_pitch, 1.5 );
player_rig delaythread( 0.0, ::play_sound_on_entity, "scn_roadkill_enter_humvee_plr" );
self anim_single( guys, "player_getin", "tag_body" );
player_rig Delete();
self ClearAnim( door_open_animation, 1, 0, 1 );
// level.player PlayerLinkTo( self, "tag_player", 0 );
level.player EnableWeapons();
player_gets_on_turret();
// reset the fov
wait( 0.1 );
SetSavedDvar( "cg_fov", 65 );
/*
turret = self.mgturret[ 0 ];
turret MakeUsable();
turret SetMode( "manual" );
turret UseBy( level.player );
turret MakeUnusable();
// thread player_viewhands_minigun( level.suburbans[ 2 ].mgturret[ 0 ] );
level.player DisableTurretDismount();
*/
}
chair_waits_for_close()
{
if ( flag( "player_gets_in" ) )
return;
level endon( "player_gets_in" );
self endon( "death" );
for ( ;; )
{
if ( Distance( self.origin, level.player.origin ) < 80 )
self notify( "trigger" );
wait( 0.05 );
}
}
player_fov_zooms_in_for_turret()
{
wait( 1 );
lerp_fov_overtime( 2, 55 );
}
ride_vehicle()
{
self.dontdisconnectpaths = true;
flag_wait( "player_gets_in" );
self thread gopath();
}
ride_vehicle_starts_moving()
{
thread ride_parameters_check();
thread common_ride_vehicle_init();
flag_wait( "convoy_moment" );
self thread gopath();
}
common_ride_vehicle_init()
{
self.dontdisconnectpaths = true;
}
ride_parameters_check()
{
if ( !isdefined( self.script_parameters ) )
return;
switch( self.script_parameters )
{
case "picks_up_riders":
level.npc_ride_vehicles[ level.npc_ride_vehicles.size ] = self;
break;
}
}
get_vehicle_from_spawner()
{
if ( !isdefined( self.target ) )
return;
// get the vehicle spawner so we'll know the vehicle after it spawns
node = GetNode( self.target, "targetname" );
spawner = GetEnt( node.script_linkto, "script_linkname" );
spawner waittill( "spawned", vehicle );
node.vehicle = vehicle;
}
best_friendly_to_run( array )
{
// player sees the scope glint if the dot is within a certain range
player_angles = level.player GetPlayerAngles();
player_forward = AnglesToForward( player_angles );
end = level.player GetEye();
foreach ( guy in array )
{
start = guy GetEye();
angles = VectorToAngles( start - end );
forward = AnglesToForward( angles );
dot = VectorDot( forward, player_forward );
if ( dot < 0.75 )
continue;
animating_guy = IsDefined( guy._animActive ) && guy._animActive;
if ( animating_guy && dot >= 0.85 )
continue;
return guy;
}
return undefined;
}
allies_leave_riverbank()
{
if ( flag( "player_gets_in" ) )
return;
level endon( "player_gets_in" );
array = [];
foreach ( guy in level.allied_riverbank_ai )
{
array[ guy.unique_id ] = guy;
}
for ( ;; )
{
foreach ( guy in array )
{
if ( !isalive( guy ) )
array[ guy.unique_id ] = undefined;
}
//guy = get_closest_to_player_view( array, level.player, true, 0.85 );
guy = best_friendly_to_run( array );
if ( IsAlive( guy ) )
{
array[ guy.unique_id ] = undefined;
guy thread run_to_convoy();
if ( level.runnings_to_convoy_count >= level.guy_gets_in_vehicle_targets.size )
return;
wait( 4 );
}
if ( !array.size )
break;
wait( 0.15 );
}
// staircase_org = getstruct( "staircase_org", "targetname" );
// array = get_array_of_closest( staircase_org.origin, level.allied_riverbank_ai );
/*
wait( 3 );// let the car guys go first
count = 0;
got_in = 0;
for ( i = array.size - 1; ; i-- )
{
if ( got_in >= level.guy_gets_in_vehicle_targets.size )
break;
if ( i < 0 )
break;
guy = array[ i ];
AssertEx( IsAlive( guy ), "Dead, but how?" );
guy ent_flag_set( "go_to_convoy" );
wait( 0.75 );
count++;
got_in++;
while ( count >= 3 )
{
count -= 3;
wait( 0.5 );
}
}
*/
}
get_in_moving_vehicle()
{
self.get_in_moving_vehicle = true;
}
add_to_allied_riverbank_ai()
{
level.allied_riverbank_ai[ level.allied_riverbank_ai.size ] = self;
add_riverbank_flags();
}
add_riverbank_flags()
{
ent_flag_init( "go_to_convoy" );
ent_flag_init( "got_in_vehicle" );
}
allied_riverbank_spawner()
{
self endon( "death" );
add_to_allied_riverbank_ai();
flag_wait( "time_to_go" );
self.ignoreall = true;
//ent_flag_wait( "go_to_convoy" );
//self.ignoreall = false;
/*
while ( index >= 3 )
{
index -= 3;
wait( 2.0 );
}
wait( index * 0.15 );
*/
/*
flag_wait( "time_to_go" );
if ( self.script_index >= 7 )
run_to_convoy();
*/
}
run_to_convoy()
{
level.runnings_to_convoy_count++;
/*
AssertEx( IsDefined( self.script_index ), "Guy with export " + self.export + " had no script_index" );
wait_table = [];
wait_table[ 0 ] = 0.05; // 2 guys to the front right
wait_table[ 1 ] = 0.25; // 2 guys to the front right
wait_table[ 2 ] = 2.8; // 3 guys doing radio scene
wait_table[ 3 ] = 0.5; // 3 guys doing radio scene
wait_table[ 4 ] = 0.4; // 3 guys doing radio scene
wait_table[ 5 ] = 1.8; // guy forward left
wait_table[ 6 ] = 1.9; // 2 doing binoc scene
wait_table[ 7 ] = 0.4; // 2 doing binoc scene
wait_table[ 8 ] = 1.5; // guy in the hut
wait_table[ 9 ] = 0.5; // guy on the truck
timer = 0;
for ( i = 0; i <= self.script_index; i++ )
{
timer += wait_table[ i ];
}
wait( timer );
*/
self anim_stopanimscripted();
if ( IsDefined( self.doing_looping_anim ) )
{
self.remove_from_animloop = true;
}
if ( IsDefined( self.convoy_func ) )
{
// a one time cleanup func a few guys runself.convoy_func = GetEnt( "self.convoy_func", "targetname" );
self thread [[ self.convoy_func ]]();
self.convoy_func = undefined;
}
//self.dontavoidplayer = true;
//self PushPlayer( true );
self.moveplaybackrate = 1;
self.pathrandompercent = 0;
riverbank_run_node = GetNode( "riverbank_run_node", "targetname" );
self.fixednode = false;
// trigger with targetname guy_gets_in_vehicle will grab us
self SetGoalNode( riverbank_run_node );
self.goalradius = 16;
}
trigger_guy_gets_in_vehicle()
{
level.ally_convoy_trigger = self;
// target a bunch of structs that target nodes that ai will run to
level.guy_gets_in_vehicle_targets = GetNodeArray( self.target, "targetname" );
foreach ( node in level.guy_gets_in_vehicle_targets )
{
node thread get_vehicle_from_spawner();
}
/#
used = [];
foreach ( node in level.guy_gets_in_vehicle_targets )
{
AssertEx( IsDefined( node.script_index ), "Node at " + node.origin + " has no script_index" );
AssertEx( !isdefined( used[ node.script_index ] ), "Reused script_index " + node.script_index + " at " + node.origin );
used[ node.script_index ] = true;
}
#/
level.guy_gets_in_vehicle_targets = array_index_by_script_index( level.guy_gets_in_vehicle_targets );
self.index = 0;
trigger_handles_guys_running_up_stairs_to_get_in_vehicles();
level.allied_riverbank_ai = remove_dead_from_array( level.allied_riverbank_ai );
// catch up for the guys that didn't get in fast enough
foreach ( guy in level.allied_riverbank_ai )
{
guy thread goalspam();
if ( IsDefined( guy.gets_in_vehicle ) )
continue;
// delete extra guys
if ( self.index >= level.guy_gets_in_vehicle_targets.size )
{
if ( IsDefined( guy.magic_bullet_shield ) )
guy stop_magic_bullet_shield();
guy Delete();
continue;
}
struct = level.guy_gets_in_vehicle_targets[ self.index ];
self.index++;
guy thread guy_gets_in_convoy( struct );
}
}
goalspam()
{
self endon( "death" );
for ( i = 0; i < 5; i++ )
{
self notify( "goal" );
wait( 0.05 );
}
}
trigger_handles_guys_running_up_stairs_to_get_in_vehicles()
{
if ( flag( "player_gets_in" ) )
return;
level endon( "player_gets_in" );
touched = [];
for ( ;; )
{
self waittill( "trigger", other );
if ( !isalive( other ) )
continue;
if ( IsDefined( touched[ other.unique_id ] ) )
continue;
touched[ other.unique_id ] = true;
struct = level.guy_gets_in_vehicle_targets[ self.index ];
self.index++;
AssertEx( self.index <= level.guy_gets_in_vehicle_targets.size, "Too many guys!" );
other thread guy_gets_in_convoy( struct );
/*
foreach ( vehicle in level.npc_ride_vehicles )
{
if ( vehicle.riders.size >= 3 )
continue;
thread guy_runtovehicle_load( other, vehicle );
break;
}
*/
}
}
guy_gets_in_convoy( mynode )
{
/*
mynode = undefined;
foreach ( struct in level.guy_gets_in_vehicle_targets )
{
if ( IsDefined( struct.taken ) )
continue;
mynode = struct;
mynode.taken = true;
level.ride_nodes_taken++;
break;
}
if ( !isdefined( mynode ) )
return;
*/
self.fixednode = true;
self.gets_in_vehicle = true;
self.attackeraccuracy = 0;
if ( !isdefined( self.magic_bullet_shield ) )
self magic_bullet_shield();
self SetGoalNode( mynode );
self.goalradius = 16;
if ( !flag( "convoy_moment" ) )
{
level add_wait( ::waittill_msg, "player_got_in" );
self add_wait( ::waittill_msg, "goal" );
level add_endon( "convoy_moment" );
do_wait_any();
flag_wait( "convoy_moment" );
}
if ( !flag( "guys_get_in_convoy_vehicles" ) )
{
flag_wait( "guys_get_in_convoy_vehicles" );
wait_for_index( mynode.script_index );
}
if ( !isdefined( mynode.target ) )
{
flag_wait( "player_gets_in" );
self safe_delete();
return;
}
node = GetNode( mynode.target, "targetname" );
self SetGoalNode( node );
self.disablearrivals = true;
level add_wait( ::waittill_msg, "player_got_in" );
self add_wait( ::waittill_msg, "goal" );
do_wait_any();
self.script_startingposition = node.script_startingposition;
thread guy_runtovehicle_load( self, node.vehicle );
self waittill( "boarding_vehicle" );
self ent_flag_set( "got_in_vehicle" );
if ( self.script_startingposition == 4 )
self thread convoy_gunner_think();
// thread guy_runtovehicle_load( other, vehicle );
}
wait_for_index( index )
{
if ( flag( "player_gets_in" ) )
return;
level endon( "player_gets_in" );
wait( index * 0.35 );
}
/*
airstrike_spawner()
{
if ( !isdefined( self.magic_bullet_shield ) )
self magic_bullet_shield();
self.dontavoidplayer = true;
self.interval = 0;
self.disableexits = true;
flag_wait( "convoy_moment" );
ent = getstruct( self.target, "targetname" );
self maps\_spawner::go_to_node( ent, "struct" );
if ( !isdefined( self.script_noteworthy ) )
return;
switch( self.script_noteworthy )
{
case "croucher":
self waittill( "goal" );
self AllowedStances( "crouch" );
break;
case "get_in_car_guy":
flag_wait( "time_to_pull_out" );
wait( 1 );
guy_runtovehicle_load( self, level.friendly_open_humvee );
break;
}
}
*/
friendly_open_humvee()
{
level.friendly_open_humvee = self;
self waittill( "reached_end_node" );
house_node = GetNode( "house_node", "targetname" );
foreach ( guy in self.riders )
{
if ( !isalive( guy ) )
continue;
if ( !isai( guy ) )
continue;
guy SetGoalPos( house_node.origin );
}
}
vehicle_break()
{
touched = [];
brake_time = self.script_timer;
if ( !isdefined( brake_time ) )
brake_time = 0.3;
brake_amount = self.script_brake;
if ( !isdefined( brake_amount ) )
brake_amount = 0.3;
for ( ;; )
{
self waittill( "trigger", other );
if ( IsDefined( touched[ other.unique_id ] ) )
continue;
touched[ other.unique_id ] = true;
other thread break_awhile ( brake_time, brake_amount );
}
}
break_awhile ( brake_time, brake_amount )
{
self.veh_brake = brake_amount;
wait( brake_time );
self.veh_brake = 0;
}
spark_preset()
{
target = getstruct( self.target, "targetname" );
angles = VectorToAngles( target.origin - self.origin );
level.spark_presets[ self.script_parameters ] = angles;
}
vehicle_spark_trigger()
{
targ = GetEnt( self.target, "targetname" );
targ_targ = GetEnt( targ.target, "targetname" );
/*
// move it forward to compensate for high speed
angles = VectorToAngles( targ_targ.origin - targ.origin );
forward = AnglesToForward( angles );
vec = forward * -250;
self.origin += vec;
targ.origin += vec;
targ_targ.origin += vec;
*/
org1 = targ.origin;
org2 = targ_targ.origin;
targ Delete();
targ_targ Delete();
touched = [];
technical_only = false;
if ( IsDefined( self.script_noteworthy ) )
{
switch( self.script_noteworthy )
{
case "technical_only":
technical_only = true;
break;
}
}
preset = undefined;
if ( IsDefined( self.script_parameters ) )
{
preset = level.spark_presets[ self.script_parameters ];
}
for ( ;; )
{
self waittill( "trigger", other );
if ( IsDefined( touched[ other.unique_id ] ) )
continue;
if ( technical_only )
{
if ( IsDefined( level.traffic_jam_truck ) )
{
if ( other != level.traffic_jam_truck )
continue;
}
else
continue;
}
touched[ other.unique_id ] = true;
other thread vehicle_sparks( org1, org2, preset );
}
}
vehicle_sparks( org1, org2, preset )
{
fx = getfx( "vehicle_scrape_sparks" );
no_spark_frame = RandomInt( 4 );
technical = IsDefined( level.traffic_jam_truck ) && self == level.traffic_jam_truck;
angles = preset;
for ( ;; )
{
my_org = self.origin;
if ( IsDefined( self.spark_offset ) )
{
my_org += self.spark_offset;
}
spark_org = PointOnSegmentNearestToPoint( org1, org2, my_org );
if ( spark_org == org2 )
return;
no_spark_frame--;
if ( no_spark_frame && spark_org != org1 )
{
angle_range = RandomFloatRange( -85, -55 );
if ( !isdefined( preset ) )
{
angles = VectorToAngles( spark_org - self.origin );
angles = ( angle_range, angles[ 1 ], 0 );
}
//Line( spark_org, self.origin, (1,0,0), 1, 1, 500 );
up = AnglesToUp( angles );
forward = AnglesToForward( angles );
fast_enough = technical || self.veh_speed > 2;
if ( fast_enough )
{
//Line( spark_org, spark_org + forward * 100, (1,0,0), 1, 1, 500 );
PlayFX( fx, spark_org, forward, up );
}
}
if ( !no_spark_frame )
no_spark_frame = get_next_no_spark_frame();
wait( 0.05 );
}
}
get_next_no_spark_frame()
{
if ( getdvarint( "r_roadkill_less_sparks" ) )
{
return RandomInt( 2 ) + 1;
}
return RandomInt( 3 ) + 4;
}
humvee_gunner_idle_until_player_gets_in( owner, turret )
{
level endon( "player_gets_in" );
anims = [];
anims[ "humvee_turret_bounce" ] = true;
// anims[ "humvee_turret_idle_lookback" ] = %humvee_turret_idle_lookback;
anims[ "humvee_turret_idle_lookbackB" ] = true;
anims[ "humvee_turret_idle_signal_forward" ] = true;
anims[ "humvee_turret_idle_signal_side" ] = true;
anims[ "humvee_turret_radio" ] = true;
anims[ "humvee_turret_flinchA" ] = true;
anims[ "humvee_turret_flinchB" ] = true;
//anims[ "humvee_turret_rechamber" ] = %humvee_turret_rechamber;
foreach ( anime, _ in anims )
{
wait( 2 );
level.anime = anime;
owner turret_gunner_custom_anim( turret, anime );
if ( flag( "shot_rings_out" ) )
return;
}
}
detour_vehicle_driver_animates()
{
owner = undefined;
turret = undefined;
turret = self.mgturret[ 0 ];
for ( ;; )
{
owner = turret GetTurretOwner();
if ( IsAlive( owner ) )
break;
wait( 0.05 );
}
owner endon( "death" );
level.detour_gunner = owner;
if ( !isdefined( owner.magic_bullet_shield ) )
{
owner magic_bullet_shield();
}
if ( !flag( "player_gets_in" ) )
{
humvee_gunner_idle_until_player_gets_in( owner, turret );
wait( 1.5 );
}
if ( !flag( "100ton_bomb_goes_off" ) )
{
owner thread turret_gunner_custom_anim( turret, "humvee_turret_rechamber" );
flag_wait( "100ton_bomb_goes_off" );
wait( 3.5 );
owner notify( "special_anim", "end" );
owner turret_gunner_custom_anim( turret, "humvee_turret_flinchA" );
}
thread turret_gunner_cycles_custom_anims( owner, turret );
flag_wait( "shot_rings_out" );
struct = getstruct( "frantic_look_target_struct", "targetname" );
ent = Spawn( "script_origin", struct.origin );
turret SetTargetEntity( ent );
/#
if ( GetDebugDvarInt( "showline" ) )
turret thread entline( ent );
#/
count = 0;
/*
times = [];
times[ 0 ] = 0.5;
times[ 1 ] = 3.25;
times[ 2 ] = 2.55;
times[ 3 ] = 2.75;
times[ 4 ] = 3.15;
times[ 5 ] = 2.55;
times[ 6 ] = 1.75;
times[ 7 ] = 1.75;
*/
for ( ;; )
{
owner notify( "special_anim", "end" );
//self notify( "do_custom_anim" );
struct = getstruct( struct.target, "targetname" );
dist = Distance( ent.origin, struct.origin );
time = dist / 5000;
movetime = GetTime();
ent MoveTo( struct.origin, time, time * 0.2, time * 0.2 );
// Line( turret.origin, struct.origin, (0,1,0), 1, 1, 1000 );
// wait( times[ count ] );
// count++;
if ( !isdefined( struct.target ) )
break;
level waittill_notify_or_timeout( "shot_rings_out", 1.5 );
wait_for_buffer_time_to_pass( movetime, 2 );
wait( 0.1 );
}
ent Delete();
}
entline( ent )
{
ent endon( "death" );
for ( ;; )
{
Line( ent.origin, self.origin );
wait( 0.05 );
}
}
turret_gunner_cycles_custom_anims( owner, turret )
{
// level endon( "shot_rings_out" );
anims = [];
anims[ "humvee_turret_bounce" ] = true;
// anims[ "humvee_turret_idle_lookback" ] = %humvee_turret_idle_lookback;
anims[ "humvee_turret_idle_lookbackB" ] = true;
anims[ "humvee_turret_idle_signal_forward" ] = true;
anims[ "humvee_turret_idle_signal_side" ] = true;
anims[ "humvee_turret_radio" ] = true;
anims[ "humvee_turret_flinchA" ] = true;
anims[ "humvee_turret_flinchB" ] = true;
//anims[ "humvee_turret_rechamber" ] = %humvee_turret_rechamber;
foreach ( anime, _ in anims )
{
wait( 2 );
level.anime = anime;
owner turret_gunner_custom_anim( turret, anime );
if ( flag( "shot_rings_out" ) )
return;
}
}
// gets the turret doing a looping anim in anticipation of an AI getting on it later
turret_preload_animate()
{
turret = self.mgturret[ 0 ];
turret SetDefaultDropPitch( 0 );
turret animscripts\hummer_turret\minigun_stand::setup_turret_anims();
turret animscripts\hummer_turret\common::turret_animfirstframe( turret.passenger2turret_anime );
}
player_personal_convoy()
{
switch( self.script_index )
{
case 0:
level.crazy_ride_convoy[ "lead" ] = self;
break;
case 1:
level.crazy_ride_convoy[ "player" ] = self;
break;
case 2:
level.crazy_ride_convoy[ "rear" ] = self;
self thread turret_preload_animate();
break;
case 3:
level.crazy_ride_convoy[ "detour" ] = self;
self thread turret_preload_animate();
thread detour_vehicle_driver_animates();
thread gunner_becomes_invul();
break;
default:
AssertMsg( "err err!" );
break;
}
self ent_flag_init( "can_shoot_the_baddies" );
self ent_flag_init( "start_aiming_at_badguys" );
level.crazy_ride_convoy[ self.script_index ] = self;
waittillframeend;// wait for the array to fill in
flag_wait( "player_gets_in" );
/*
node = GetVehicleNode( self.target, "targetname" );
self Vehicle_SetSpeedImmediate( node.speed, 2, 2 );
wait( 0.05 );
self ResumeSpeed( 5 );
*/
// flag_wait( "player_rolls_into_town" );
flag_wait( "start_runner" );
if ( level.crazy_ride_convoy[ "player" ] == self )
{
self Vehicle_SetSpeed( 8.79, 1, 1 );
}
if ( level.crazy_ride_convoy[ "rear" ] == self )
{
self Vehicle_SetSpeed( 8.79, 1, 1 );
}
/*
if ( level.crazy_ride_convoy[ "lead" ] == self )
{
self Vehicle_SetSpeed( 8, 1, 1 );
}
if ( level.crazy_ride_convoy[ "detour" ] == self )
{
self Vehicle_SetSpeed( 8, 1, 1 );
}
*/
flag_wait( "player_closes_gap" );
self ResumeSpeed( 5 );
flag_wait( "ambush_auto_adjust_speed" );
self ResumeSpeed( 5 );
if ( self != level.crazy_ride_convoy[ "rear" ] )
return;
in_front_index = self.script_index - 1;
near_car = level.crazy_ride_convoy[ in_front_index ];
vehicles_maintain_distance_until_traffic( near_car );
/*
for ( ;; )
{
if ( Distance( near_car.origin, self.origin ) < 280 )
{
self.veh_brake = 0.5;
break;
}
wait( 0.05 );
}
*/
}
vehicles_maintain_distance_until_traffic( near_car )
{
following = false;
// level endon( "traffic_jam" );
for ( ;; )
{
/*
if ( flag( "lead_vehicle_speeds_up" ) && self == level.crazy_ride_convoy[ "player" ] )
{
self Vehicle_SetSpeed( 11, 5, 5 );
wait( 3 );
self ResumeSpeed( 5 );
flag_clear( "lead_vehicle_speeds_up" );
}
*/
if ( Distance( near_car.origin, self.origin ) < 300 )
{
self Vehicle_SetSpeed( near_car.veh_speed, 5, 5 );
following = true;
}
else
if ( following )
{
following = false;
self ResumeSpeed( 5 );
}
wait( 0.05 );
}
}
/*
lead_vehicle_func()
{
level.lead_vehicle = self;
}
vehicle_ride_think()
{
if ( self == level.lead_vehicle )
return;
for ( ;; )
{
lead_speed = level.lead_vehicle.veh_speed;
// if ( self.veh_speed > lead_speed )
if ( Distance( self.origin, level.lead_vehicle.origin ) < 200 )
self Vehicle_SetSpeed( lead_speed, 5, 5 );
wait( 0.05 );
}
}
*/
convoy_gunner_think()
{
level.convoy_gunners[ self.unique_id ] = self;
thread aim_ahead_until_you_get_enemy();
self waittill( "death" );
wait( 1.5 );
if ( !isdefined( self ) )
return;
self StartRagdoll();
self Unlink();
}
convoy_gunners_pick_targets()
{
array_thread( level.convoy_gunners, ::convoy_gunner_shoot_protection );
}
convoy_gunner_shoot_protection()
{
if ( !isalive( self ) )
return;
self endon( "death" );
for ( ;; )
{
self cant_die_unless_player_sees_me();
self avoid_shooting_through_player();
wait( 0.05 );
}
}
cant_die_unless_player_sees_me()
{
in_danger = within_fov_2d( level.player GetEye(), level.player GetPlayerAngles(), self.origin, 0.85 );
if ( in_danger )
{
self.IgnoreRandomBulletDamage = false;
self.attackeraccuracy = 1;
if ( self.health > 100 )
self.health = 100;
}
else
{
self.IgnoreRandomBulletDamage = true;
self.attackeraccuracy = 0;
self.health = 5000;
}
}
avoid_shooting_through_player()
{
// adjust the threatbias on the convoy gunners target so he doesn't shoot through the player excessively
enemy = self.enemy;
if ( !isalive( enemy ) )
return;
if ( enemy.ignoreme )
return;
angles = VectorToAngles( level.player.origin - self.origin );
if ( enemy within_fov_2d( level.player.origin, angles, enemy.origin, 0.85 ) )
{
enemy.ignoreme = true;
enemy delayThread( 1, ::set_ignoreme, 0 );
}
}
ent_line( ent1, ent2 )
{
ent1 endon( "death" );
ent2 endon( "death" );
timer = 5;
frames = timer * 20;
for ( i = 0; i < frames; i++ )
{
Line( ent1.origin, ent2.origin );
wait( 0.05 );
}
}
enemy_ai_accuracy_effected_by_player_humvee()
{
level endon( "player_knocked_down" );
for ( ;; )
{
ai = GetAIArray( "axis" );
foreach ( guy in ai )
{
if ( !isalive( guy ) )
continue;
if ( guy.weapon == "rpg" )
continue;
if ( within_fov_2d( level.player.origin, level.player_humvee.angles, guy.origin, 0.8 ) )
{
guy.baseaccuracy = 0.2;
}
else
{
guy.baseaccuracy = 0;
}
wait( 0.02 );
}
wait( 0.05 );
}
}
traffic_jam_truck()
{
level.traffic_jam_truck = self;
self.vehicle_keeps_going_after_driver_dies = true;
self.dontunloadonend = true;
self.spark_offset = ( -64, 0, 0 );
self godon();
self.vehicle_stays_alive = true;
}
setup_ride_path_targets( noteworthy )
{
spawners = GetEntArray( "ride_vehicle_spawner", "targetname" );
foreach ( spawner in spawners )
{
nodes = spawner getLinkedVehicleNodes();
found_node = false;
foreach ( node in nodes )
{
if ( node.script_noteworthy != noteworthy )
continue;
found_node = true;
// remap target to this node so we still spawn our riders
if ( IsDefined( spawner.target ) )
remap_targets( spawner.target, node.targetname );
spawner.target = node.targetname;
break;
}
//AssertEx( found_node, "Didn't find a node with noteworthy " + noteworthy );
}
}
remap_targets( ent_targetname, new_targetname )
{
// remap them so the guys riding in the vehicle come along too
ents = GetEntArray( ent_targetname, "targetname" );
foreach ( ent in ents )
{
ent.targetname = new_targetname;
}
}
spawn_more_street_baddies()
{
spawners = level.more_street_spawners;
wait( 7.5 );
foreach ( spawner in spawners )
{
spawner.count = 1;
spawner spawn_ai();
}
}
ride_killer()
{
level.ride_killer = self;
self disable_pain();
self.ignoreme = true;
self magic_bullet_shield();
/*
player_vehicle = level.crazy_ride_convoy[ 1 ];
//eye = spawn_tag_origin();
//eye.origin = level.player GetEye();
//eye LinkTo( level.player );
//self SetEntityTarget( level.player );
ai = GetAIArray( "allies" );
foreach ( guy in ai )
guy.ignoreme = true;
*/
missile_target = GetEnt( "missile_target", "targetname" );
self SetEntityTarget( missile_target );
flag_wait( "player_knocked_down" );
self stop_magic_bullet_shield();
ai = GetAIArray( "axis" );
foreach ( guy in ai )
{
if ( IsDefined( guy.magic_bullet_shield ) )
guy stop_magic_bullet_shield();
if ( !isdefined( guy.dont_ride_kill ) )
guy Kill();
}
}
friendly_crash_think()
{
// self.flashEndTime = GetTime() + 2500;
//timer = RandomFloatRange( 2, 3 );
//self flashBangStart( timer );
level.crash_friendly[ level.crash_friendly.size ] = self;
self magic_bullet_shield();
self SetThreatBiasGroup( "ally_with_player" );
self disable_pain();
self.ignoreSuppression = true;
self endon( "death" );
self.animname = self.animation;
self thread anim_custom_animmode_solo( self, "gravity", "flashed" );
wait( 0.05 );
animtimes = [];
animtimes[ "exposed_flashbang_v2" ] = 0.245;
animtimes[ "exposed_flashbang_v3" ] = 0.36;
animtimes[ "exposed_flashbang_v5" ] = 0.13;
animlimits = [];
animlimits[ "exposed_flashbang_v2" ] = 0.72;
animlimits[ "exposed_flashbang_v3" ] = 0.79;
animlimits[ "exposed_flashbang_v4" ] = 0.65;
animlimits[ "exposed_flashbang_v5" ] = 0.65;
animation = self getanim( "flashed" );
animtime = animtimes[ self.animation ];
if ( IsDefined( animtime ) )
{
self SetAnimTime( animation, animtime );
}
limit = animlimits[ self.animation ];
if ( IsDefined( limit ) )
{
for ( ;; )
{
if ( self GetAnimTime( animation ) >= limit )
break;
wait( 0.05 );
}
self notify( "killanimscript" );
}
wait( 10 );
flag_wait( "player_enters_ambush_house" );
self enable_pain();
// green guys can get killed and are replaced by cyan guys
if ( self.script_forcecolor == "g" )
{
if ( !self is_hero() )
{
self stop_magic_bullet_shield();
self thread replace_on_death();
}
}
flag_wait( "eyes_on_school" );
self.ignoreSuppression = false;
}
move_flashed_spawner_and_spawn()
{
if ( IsDefined( self.script_linkTo ) )
{
struct = getstruct( self.script_linkto, "script_linkname" );
self.origin = struct.origin;
self.angles = struct.angles;
}
wait( 0.25 );
self spawn_ai();
}
/*
0.36 exposed_flashbang_v3
0.245 exposed_flashbang_v2
0.2 exposed_flashbang_v5
*/
blocker_driver()
{
level.blocker_driver = self;
}
roadkill_ride_kill_drones()
{
flag_wait( "kill_drones" );
angry_drones = GetEntArray( "angry_drone", "script_noteworthy" );
foreach ( drone in angry_drones )
{
if ( IsAlive( drone ) )
drone Kill();
else
drone Delete();
}
}
die_after_awhile ()
{
self endon( "death" );
timer = RandomFloatRange( 25, 35 );
wait( timer );
self Kill();
}
resumeslowly()
{
self endon( "death" );
time = 1.0;
frames = time * 20;
speed = 1;
for ( i = 0; i < frames; i++ )
{
self Vehicle_SetSpeedImmediate( speed, 2, 2 );
speed += 0.6;
wait( 0.05 );
}
self ResumeSpeed( 1 );
}
crash_physics_explosion()
{
struct = getstruct( "crash_physics_struct", "targetname" );
physics_spawner = getstruct( "physics_spawner", "targetname" );
targ = getstruct( physics_spawner.target, "targetname" );
index = 0;
models = [];
models[ 0 ] = "com_soup_can";
models[ 1 ] = "com_bottle1";
models[ 2 ] = "com_soup_can";
models[ 3 ] = "com_bottle1";
models[ 4 ] = "me_plastic_crate1";
angles = VectorToAngles( targ.origin - physics_spawner.origin );
right = AnglesToRight( angles );
for ( i = 0; i < 14; i++ )
{
org = targ.origin + randomvector( 200 );
angles = VectorToAngles( org - physics_spawner.origin );
forward = AnglesToForward( angles );
force = forward * RandomFloatRange( 4000, 8500 );
// force = randomvector( 160000 );
model = models[ index ];
index++;
if ( index >= models.size )
index = 0;
ent = Spawn( "script_model", physics_spawner.origin );
ent.origin += right * RandomFloatRange( -40, 40 );;
ent SetModel( model );
ent PhysicsLaunchClient( ent.origin, force );
}
PhysicsExplosionSphere( struct.origin, struct.radius, struct.radius, 0.4 );
}
goes_to_hell( vehicle_hell )
{
self AttachPath( vehicle_hell );
wait( 0.1 );
self godoff();
foreach ( rider in self.riders )
{
if ( !IsAlive( rider ) )
continue;
rider safe_delete();
}
RadiusDamage( self.origin, 128, 5000, 5000 );
}
run_away_die()
{
self endon( "death" );
self waittill( "goal" );
wait( 3 );
struct = getstruct( self.script_linkto, "script_linkname" );
self SetGoalPos( struct.origin );
self.goalradius = 4;
self waittill( "goal" );
self Kill();
}
player_doesnt_die_in_red_flashing()
{
level endon( "ride_ends" );
for ( ;; )
{
// a reasonable amount of spammity-spam, it's for a good cause.
if ( level.player ent_flag( "player_has_red_flashing_overlay" ) )
level.player.attackeraccuracy = 0;
wait( 0.05 );
}
}
school_guy_targets_school()
{
if ( flag( "shepherd_moves_out" ) )
return;
level endon( "shepherd_moves_out" );
targets = GetEntArray( "school_target", "targetname" );
for ( ;; )
{
targets = array_randomize( targets );
foreach ( target in targets )
{
self SetEntityTarget( target );
timer = RandomFloatRange( 3, 6 );
wait( timer );
}
}
}
ambush_ally_spawner_think()
{
level.ambush_allies_outside_vehicle++;
self endon( "death" );
//self.threatbias = 750; // they really want to shoot these guys more.
self SetThreatBiasGroup( "ally_outside_school" );
self magic_bullet_shield();
flag_wait( "friendlies_suppress_school" );
self.suppressionwait = 0;
thread school_guy_targets_school();
flag_wait( "shepherd_moves_out" );
vehicle = getClosest( self.origin, level.ambushed_hummers );
guy_runtovehicle_load( self, vehicle );
self stop_magic_bullet_shield();
level.ambush_allies_outside_vehicle--;
if ( !level.ambush_allies_outside_vehicle )
flag_set( "shepherd_vehicles_leave" );
flag_wait( "the_end" );
safe_delete();
//flag_wait( "ambush_house_player_goes_upstairs" );
//self stop_magic_bullet_shield();
}
join_school_threatbias_group_and_damage_func()
{
unreachable = false;
if ( IsDefined( self.script_noteworthy ) )
{
unreachable = self.script_noteworthy == "school_unreachable_spawner";
}
if ( unreachable )
{
self SetThreatBiasGroup( "axis_school_unreachable" );
}
else
{
self SetThreatBiasGroup( "axis_school" );
}
self add_damage_function( ::remove_player_from_threatbias_group );
}
remove_player_from_threatbias_group( amt, attacker, force, b, c, d, e )
{
if ( !isalive( attacker ) )
return;
if ( attacker != level.player )
return;
wait( 3 );
// player shot me, put him in a threatbias group that I can fight him in
level.player SetThreatBiasGroup( "allies" );
}
ambush_house_spawner_think()
{
self SetThreatBiasGroup( "axis_ambush_house" );
}
friendlies_traverse_school()
{
for ( i = 1; i <= 20; i++ )
{
// "roadkill_school_1", "roadkill_school_2", "roadkill_school_3",
// "roadkill_school_4", "roadkill_school_5", "roadkill_school_6"
msg = "roadkill_school_" + i;
trigger = GetEnt( msg, "targetname" );
if ( flag_exist( msg ) )
{
flag_wait( msg );
if ( msg == "roadkill_school_10" )
{
//flag_wait( "backend_baddies_spawned" );
flag_wait_either( "school_back_baddies_dead", "roadkill_near_crossroads" );
}
volume = trigger get_color_volume_from_trigger();
if ( IsDefined( volume ) )
volume waittill_volume_dead_or_dying();
trigger activate_trigger();
}
}
}
dunn_says_clear_on_room_clear()
{
flag_wait( "hidden_guy_opens_fire" );
wait 1.3;
volume = getent( "dunn_clear_volume", "targetname" );
volume waittill_volume_dead();
// Clear!
dunn_line( "roadkill_cpd_clear" );
wait 1;
guys = [];
guys[ "player" ] = level.player;
guys[ "foley" ] = level.foley;
guys[ "dunn" ] = level.dunn;
touchers = 0;
foreach ( guy in guys )
{
if ( guy istouching( volume ) )
touchers++;
}
if ( touchers == 2 )
{
// Two comin' out!
dunn_line( "roadkill_cpd_2cominout" );
}
else
if ( touchers == 3 )
{
// Three comin' out!
dunn_line( "roadkill_cpd_3cominout" );
}
}
hidden_room_spawner()
{
self endon( "death" );
self set_force_cover( true );
add_wait( ::can_see_player );
add_wait( ::flag_wait, "hidden_guy_opens_fire" );
do_wait_any();
self set_force_cover( false );
}
can_see_player()
{
self endon( "death" );
for ( ;; )
{
if ( self CanSee( level.player ) )
return;
wait( 0.05 );
}
}
cutting_history_class_dialogue()
{
flag_wait( "cutting_through_history" );
for ( ;; )
{
waittillframeend;
if ( !level.dialogue_function_stack_struct.function_stack.size )
break;
wait 0.05;
}
// I'm cutting through history class.
dunn_line( "roadkill_cpd_historyclass" );
// Roger that.
foley_line( "roadkill_fly_rogerthat" );
}
ambush_house_slowbie()
{
self.moveplaybackrate = 0.76;
self.attackeraccuracy = 1000;
}
player_impact_earthquake()
{
Earthquake( 0.25, 0.8, level.player.origin, 5000 );
level.player PlayRumbleOnEntity( "damage_heavy" );
level.player PlayRumbleLoopOnEntity( "damage_light" );
flag_wait( "player_goes_in_reverse" );
level.player StopRumble( "damage_light" );
}
traffic_truck_pushed()
{
struct = getstruct( "truck_contact_point", "targetname" );
targ = getstruct( struct.target, "targetname" );
vec = VectorNormalize( targ.origin - struct.origin );
vec *= 2;
level.traffic_jam_truck VehPhys_Launch( vec, ( 0, 0, 0 ), targ.origin );
}
force_player_vehicle_speed( speed )
{
level notify( "new_force_player_speed" );
level endon( "new_force_player_speed" );
player_vehicle = level.crazy_ride_convoy[ 1 ];
level endon( "stop_updating_player_vehicle_speed" );
for ( ;; )
{
player_vehicle Vehicle_SetSpeedImmediate( speed, 2, 2 );
wait( 0.05 );
}
}
radius_damage_in_front()
{
level endon( "stop_updating_player_vehicle_speed" );
flag_wait( "push_hurts_technical" );
level.traffic_jam_truck godoff();
damage = 60;
for ( ;; )
{
// forward = AnglesToForward( self.angles );
// org = self.origin + forward * 140 + (0,0,40);
// Print3d( level.traffic_jam_truck.origin, "x", (1,0,0), 1, 2 );
RadiusDamage( level.traffic_jam_truck.origin, 25, damage, damage, level.player );
if ( level.traffic_jam_truck.health < 18000 )
{
level.traffic_jam_truck.health = 18000;
}
wait( 0.05 );
}
}
lead_vehicle_starts_going_again()
{
wait( 0.75 );
self Vehicle_SetSpeed( 16, 2, 2 );
self.veh_brake = 0;
}
player_pushes_truck_down_alley()
{
player_vehicle = level.crazy_ride_convoy[ 1 ];
rear_vehicle = level.crazy_ride_convoy[ 2 ];
lead_vehicle = level.crazy_ride_convoy[ 0 ];
for ( ;; )
{
self waittill( "trigger", other );
if ( !isdefined( level.traffic_jam_truck ) )
continue;
if ( other == level.traffic_jam_truck )
break;
}
flag_set( "we're cut off" );
queue = GetTime();
player_vehicle.veh_brake = 1.0;
player_vehicle Vehicle_SetSpeed( 8, 1, 1 );
wait( 0.25 );
rear_vehicle.veh_brake = 0.5;
lead_vehicle delayThread( 2, ::set_brakes, 0.5 );
level.traffic_jam_truck.veh_brake = 0.5;
//wait( 2 );
// 0.8 dot
// 0.5 time spent looking at it
// 10 seconds until timeout
level.traffic_jam_truck waittill_player_lookat( 0.6, 0.5, undefined, 8 );
delayThread( 0, ::technical_pushed_animation );
wait( 0.2 );
flag_set( "push_through" );
//level.traffic_jam_truck thread dump_vehicle_bones();
wait( 0.5 );
player_vehicle.veh_brake = 0;
player_vehicle Vehicle_SetSpeed( 24, 10, 10 );
rear_vehicle.veh_brake = 0;
lead_vehicle thread lead_vehicle_starts_driving_again();
wait( 0.65 );
flag_set( "resume_the_path" );
// brakes cleared by main thread
// level.traffic_jam_truck.veh_brake = 0;
tech_target_org = getstruct( "tech_target_org", "targetname" );
level.traffic_jam_truck vehicleDriveTo( tech_target_org.origin, 25 );
level.traffic_jam_truck.veh_brake = 0;
wait( 1.1 );
timer = 3;
frames = timer * 20;
for ( ;; )
{
level.traffic_jam_truck Vehicle_SetSpeedImmediate( 6, 1, 1 );
frames -= 1;
if ( frames <= 0 )
break;
wait( 0.05 );
}
level.traffic_jam_truck Vehicle_SetSpeedImmediate( 0, 1, 1 );
level.traffic_jam_truck.veh_brake = 1.0;// 0.1;
wait_for_buffer_time_to_pass( queue, 5.5 );
level.traffic_jam_truck.vehicle_stays_alive = undefined;
}
lead_vehicle_starts_driving_again()
{
wait( 3.5 );
self.veh_brake = 0;
self Vehicle_SetSpeed( 12, 1, 1 );
//lead_vehicle delayThread( 3.5, ::set_brakes, 0.0 );
}
dump_vehicle_bones()
{
start_time = GetTime();
for ( ;; )
{
tag_origin_pos = self GetTagOrigin( "tag_origin" );
tag_origin_ang = self GetTagAngles( "tag_origin" );
tag_body_pos = self GetTagOrigin( "tag_body" );
tag_body_ang = self GetTagAngles( "tag_body" );
time = GetTime() - start_time;
PrintLn( "Time: " + time + " tag_origin: " + tag_origin_pos + " " + tag_origin_ang + " tag_body:" + tag_body_pos + " " + tag_body_ang );
wait( 0.05 );
}
}
/*
axis_flee_riverbank()
{
flag_set( "riverbank_baddies_retreat" ); // controls the guys in the windows
volumes = GetEntArray( "riverbank_building_volume", "script_noteworthy" );
nodes = GetNodeArray( "enemy_riverbank_flee_node", "targetname" );
index = 0;
ai = GetAIArray( "axis" );
foreach ( guy in ai )
{
if ( !isalive( guy ) )
continue;
touching_house = false;
foreach ( vol in volumes )
{
if ( guy IsTouching( vol ) )
{
touching_house = true;
break;
}
}
if ( touching_house )
{
timer = RandomFloat( 3.2 );
guy delayCall( timer, ::Kill );
}
else
{
node = nodes[ index ];
index++;
index %= nodes.size;
guy SetGoalNode( node );
guy.goalradius = 64;
guy.ignoreall = true;
guy thread delete_on_goal();
timer = RandomFloat( 1.2 );
wait( timer );
}
}
}
*/
delete_on_goal()
{
self endon( "death" );
self waittill( "goal" );
self Delete();
}
player_learned_javelin()
{
return level.player GetCurrentWeapon() == "javelin";
}
detect_player_switched_to_javelin()
{
for ( ;; )
{
if ( level.player GetCurrentWeapon() == "javelin" )
break;
wait( 0.05 );
}
flag_set( "player_switched_to_javelin" );
}
remind_player_to_switch_to_javelin()
{
lines = [];
// Brodsky, switch to your Javelin!
lines[ 0 ] = "roadkill_fly_switchtojavelin";
// Brodsky, use your Javelin to take out the armor!
lines[ 1 ] = "roadkill_fly_takeoutarmor";
index = 0;
for ( ;; )
{
timer = 9 + RandomIntRange( 2, 5 );
frames = timer * 20;
for ( i = 0; i < frames; i++ )
{
if ( level.player GetCurrentWeapon() == "javelin" )
return;
wait( 0.05 );
}
theLine = lines[ index ];
index++;
index %= lines.size;
// wait until everybody stops talking
while ( level.dialogue_function_stack_struct.function_stack.size )
wait( 0.05 );
if ( level.player GetCurrentWeapon() == "javelin" )
return;
foley_line( theLine );
}
}
/*
foley_javelin_reminders()
{
remind_player_to_switch_to_javelin();
remind_player_to_shoot_targets();
}
*/
/*
detect_player_missile_fire()
{
level endon( "bmps_destroyed" );
level.last_missile_fire_time = GetTime() - 5000; // bias the time he starts complaining if you dont shoot
count = 0;
for ( ;; )
{
level.player waittill( "missile_fire" );
count++;
// missile_fire_1 missile_fire_2 missile_fire_3
flag_set( "missile_fire_" + count );
level.last_missile_fire_time = GetTime();
if ( count >= 3 )
return;
}
}
remind_player_to_shoot_targets()
{
if ( flag( "bmps_destroyed" ) )
return;
level endon( "bmps_destroyed" );
level.last_missile_fire_time = GetTime() - 5000; // bias the time he starts complaining if you dont shoot
lines = [];
// Target that armored vehicle with your Javelin!
lines[ 0 ] = "roadkill_fly_targetvehicle";
// Engage that armored vehicle across the river!
lines[ 1 ] = "roadkill_fly_acrossriver";
// Brodsky, use your Javelin to take out the armor!
lines[ 2 ] = "roadkill_fly_takeoutarmor";
index = 0;
for ( ;; )
{
// wait until everybody stops talking
if ( foley_should_talk() )
{
theLine = lines[ index ];
index++;
index %= lines.size;
foley_line( theLine );
level.last_missile_fire_time = GetTime();
}
wait( 0.05 );
}
}
*/
foley_should_talk()
{
if ( GetTime() <= level.last_missile_fire_time + 19000 )
return false;
return !level.dialogue_function_stack_struct.function_stack.size;
}
enter_riverbank_foley_shepherd_dialogue()
{
wait( 11 );
thread autosave_by_name( "riverbank" );
wait( 3 );
// Hunter Two! Keep up the pressure on those RPG teams! If that bridgelayer gets hit, we're swimming, huah?
foley_line( "roadkill_fly_wereswimming" );
wait( 1 );
flag_set( "intro_lines_complete" );
}
introlines_delay()
{
//flag_wait( "intro_lines_complete" );
wait( 6 );
}
airstrike_call_in_dialogue()
{
if ( !is_default_start() )
return;
wait( 0.74 );
// Warlord, Warlord, this is Hunter 2-1, requesting air strike at grid 2-5-2, 1-7-1! Target is a white,
// twelve story apartment building occupied by hostile forces, over!
// Warlord, Warlord, this is
//
shepherd_line( "roadkill_cpd_airstrike" );
// Hunter 2-1, this is Warlord, solid copy, uh, I have Devil 1-1, flight of two F-15s, on the line, standby for relay.
radio_line( "roadkill_auc_ontheline" );
wait( 0.9 );
// Hunter 2-1 this is Devil 1-1, flight of two F-15s, time on station, one-five mikes,
// holding at three-Sierra, northwest, holding area Knife, carrying two JDAMs and two HARMs, over.
radio_line( "roadkill_fp1_devil11" );
// Devil 1-1, this is Hunter 2-1, solid copy on check-in, standby.
// dunn_line( "roadkill_cpd_checkin" );
// Standing by.
radio_line( "roadkill_fp1_standingby" );
// Devil 1-1, target is a white, twelve story apartment building at grid 2-5-2, 1-7-1. I need you to
// level that building, how copy over?
shepherd_line( "roadkill_cpd_levelbuilding" );
// Solid copy Hunter 2-1. Rolling in now... Target acquired.
radio_line( "roadkill_fp1_targetacquired" );
}
ambushed_hummer()
{
level.ambushed_hummers[ level.ambushed_hummers.size ] = self;
self VehPhys_DisableCrashing();
self.dontdisconnectpaths = true;
flag_wait( "shepherd_vehicles_leave" );
node = GetVehicleNode( self.target, "targetname" );
dist = Distance( self.origin, node.origin );
time = dist * 0.005;
wait( time );
self gopath();
}
put_noteworthy_in_magic_chatter()
{
level.convoy_dialogue_guy[ self.script_noteworthy ] = self;
}
get_convoy_dialogue_guy( name )
{
if ( IsAlive( level.convoy_dialogue_guy[ name ] ) )
return level.convoy_dialogue_guy[ name ];
index = 0;
ai = GetAIArray( "allies" );
guys = [];
foreach ( guy in ai )
{
if ( !isalive( guy ) )
continue;
if ( guy is_hero() )
continue;
if ( IsDefined( guy.convoy_guy ) )
continue;
guy.convoy_guy = true;
level.convoy_dialogue_guy[ name ] = guy;
return guy;
}
}
magic_dialogue_queue( msg, name )
{
guy = get_convoy_dialogue_guy( name );
AssertEx( IsAlive( guy ), "Couldn't find a guy to do line " + msg );
//guy thread printer();
guy generic_dialogue_queue( msg );
wait( 0.25 );
}
printer()
{
frames = Int( 2.5 * 20 );
for ( i = 0; i < frames; i++ )
{
Print3d( self GetEye(), "*" );
wait( 0.05 );
}
}
south( dist )
{
return level.player.origin + ( 0, dist * -1, 0 );
}
charpos( guy )
{
org = level.player.origin;
if ( flag( "100ton_bomb_goes_off" ) )
org = level.locked_player_position;
unit = 128;
switch( guy )
{
case "ar1":
return org + ( unit, 0, 0 );
case "ar2":
return org + ( unit, unit, 0 );
case "ar3":
return org + ( unit * -1, 0, 0 );
case "ar4":
return org + ( unit * -1, unit * - 0.5, 0 );
case "ar5":
return org + ( unit, unit * -0.5, 0 );
case "farguy":
return org + ( unit * 15, unit * 15, 0 );
case "left":
return org + ( unit * -2, 0, 0 );
case "left_back":
return org + ( unit * -2, -1000, 0 );
case "left_back_more":
return org + ( unit * -2, -3000, 0 );
case "right_forward":
return org + ( unit * 2, 1000, 0 );
case "right_forward_more":
return org + ( unit * 2, 1500, 0 );
case "right_rear_back":
return org + ( unit * 2, -3800, 0 );
case "cpd":
return org + ( unit * 0.5, unit * 0.5, unit * -0.2 );
default:
return org + ( 0, 0, 0 );
}
}
airstrike_completion_dialogue_and_exploder()
{
time = 2.5;
// 10 seconds!!
delayThread( time, ::play_sound_in_space, "roadkill_ar1_10seconds", south( 5000 ) );
time += 1.1;
// 10 seconds!!
delayThread( time, ::play_sound_in_space, "roadkill_ar2_10seconds", south( 3500 ) );
time += 0.8;
// 10 seconds!!
delayThread( time, ::play_sound_in_space, "roadkill_ar3_10seconds", south( 1200 ) );
time += 2.9;
// Which building is it sir?
delayThread( time, ::play_sound_in_space, "roadkill_ar1_whichbuilding", charpos( "ar1" ) );
time += 1.6;
// The tall one at 1 o'clock.
delayThread( time, ::play_sound_in_space, "roadkill_ar2_tallone", charpos( "ar2" ) );
time += 1.4;
// Hey dawg, which building?
delayThread( time, ::play_sound_in_space, "roadkill_ar3_heydawg", charpos( "left" ) );
time += 1.4;
/*
////////////////////////////////
// How long will it record for?
delayThread( time + 2, ::play_sound_in_space, "roadkill_ar1_howlong", charpos( "right_rear_back" ) );
// I dunno, till it runs out man.
delayThread( time + 3.75, ::play_sound_in_space, "roadkill_ar2_runsout", charpos( "right_rear_back" ) );
////////////////////////////////
*/
// The one at 1 o'clock, the tall - hey Dave, which one is it? Is it the one of the left or the right?
delayThread( time, ::play_sound_in_space, "roadkill_ar4_whichone", charpos( "left_back" ) );
time += 4.6;
// The one on the left.
delayThread( time, ::play_sound_in_space, "roadkill_ar5_oneonleft", charpos( "left_back_more" ) );
time += 1.2;
/*
// You gonna tape this one? You got enough memory left?
delayThread( time, ::play_sound_in_space, "roadkill_ar4_memoryleft", charpos( "right_forward" ) );
time += 2.5;
// Huah, should be good.
delayThread( time, ::play_sound_in_space, "roadkill_ar5_shouldbegood", charpos( "right_forward_more" ) );
time += 1.5;
*/
/*
// What's goin' on.
// What's the hold up?
//roadkill_ar4_goinon broken
delayThread( time, ::play_sound_in_space, "roadkill_ar3_holup", charpos( "right_rear_back" ) );
time += 1.5;
// Shepherd called in a major fire mission.
delayThread( time, ::play_sound_in_space, "roadkill_ar5_majorfire", charpos( "right_rear_back" ) );
time += 3.5;
*/
/*
// Hey isn't this danger close for the task force?
delayThread( time, ::magic_dialogue_queue, "roadkill_ar3_dangerclose", "ar3" );
level.scr_sound[ "generic" ][ "roadkill_ar3_dangerclose" ] = "roadkill_ar3_dangerclose";
// Since when does Shepherd care about danger close?
level.scr_sound[ "generic" ][ "roadkill_cpd_sincewhen" ] = "roadkill_cpd_sincewhen";
// Cleared hot!
// delayThread( time + 2, ::dunn_line, "roadkill_cpd_clearedhot" );
// Devil 1-1 off safe. Bombs away bombs away.
delayThread( time + 5.5, ::radio_line, "roadkill_fp1_offsafe" );
time += 2;
// What's the hold up?
delayThread( time, ::magic_dialogue_queue, "roadkill_ar3_holup", "ar3" );
time += 1.5;
// Shepherd called in a major fire mission!
delayThread( time, ::magic_dialogue_queue, "roadkill_cpd_majorfiremission", "cpd" );
time += 2.5;
*/
delayThread( time, ::spawn_vehicle_from_targetname_and_drive, "bomber_spawner" );
time += 0.7;
// Hey isn't this danger close for the task force?
delayThread( time, ::play_sound_in_space, "roadkill_ar3_dangerclose", charpos( "ar3" ) );
time += 2.1;
// Since when does Shepherd care about danger close?
delayThread( time, ::play_sound_in_space, "roadkill_cpd_sincewhen", charpos( "cpd" ) );
time += 1.8;
video_taper_offset = 0.75;
wait( time - video_taper_offset );
flag_set( "video_tapers_react" );
wait( video_taper_offset );
//exploder( "town_bombed" );
//exploder( "white_bomb" );
exploder( "100ton_bomb" );
thread roadkill_bomb_physics_explosion();
thread collapsing_building();
thread collapse_earthquake();
thread fence_rattle();
level.player delayThread( 3.6, maps\_gameskill::grenade_dirt_on_screen, "left" );
level.locked_player_position = level.player.origin;
flag_set( "100ton_bomb_goes_off" );
start_time = GetTime();
wait( 0.25 );
// Look! Look! The building's goin' down! (ad lib)
delayThread( 8.85, ::play_sound_in_space, "roadkill_cpd_looklook", charpos( "cpd" ) );
/*
// Huah!! Get some!
delayThread( 0.9, ::magic_dialogue_queue, "roadkill_cpd_getsome", "cpd" );
// Huah! Hell yea!
delayThread( 0.95, ::magic_dialogue_queue, "roadkill_ar1_huahyeah", "ar1" );
// Yeah!
delayThread( 1.0, ::magic_dialogue_queue, "roadkill_ar1_yeah", "ar3" );
// Woo! Yeah!
// delayThread( 1.25, ::magic_dialogue_queue, "roadkill_ar2_wooyeah", "ar2" );
// Whoa!
delayThread( 1.8, ::magic_dialogue_queue, "roadkill_ar1_whoa", "dunn" );
*/
time = 1.3;
// BOOM!
delayThread( time, ::play_sound_in_space, "roadkill_ar1_boom", charpos( "ar1" ) );
//delayThread( time, ::play_sound_in_space, "roadkill_ar2_wooyeah", charpos( "ar1" ) );
delayThread( time, ::play_sound_in_space, "roadkill_ar3_woo", charpos( "ar1" ) );
delayThread( time, ::play_sound_in_space, "roadkill_ar1_yeah", charpos( "ar4" ) );
time += 0.2;
// --ck yeah!
delayThread( time, ::play_sound_in_space, "roadkill_ar2_catcalls", charpos( "ar2" ) );
time += 1.1;
delayThread( time, ::play_sound_in_space, "roadkill_ar3_catcalls", charpos( "ar3" ) );
time += 0.9;
delayThread( time, ::play_sound_in_space, "roadkill_cpd_getsome", charpos( "cpd" ) );
time += 0.2;
delayThread( time, ::play_sound_in_space, "roadkill_ar2_yeah", charpos( "ar2" ) );
time += 0.8;
// That was hot man...
delayThread( time, ::play_sound_in_space, "roadkill_ar5_hotman", charpos( "right_rear_back" ) );
time += 0.4;
// delayThread( time, ::play_sound_in_space, "roadkill_ar1_huahyeah", charpos( "ar5" ) );
// time += 0.2;
// Wooo!!!
//delaythread( time, ::play_sound_in_space, "roadkill_ar3_woo", charpos( "ar3" ) );
//time += 0.2;
// Yeah!!!
// delayThread( time, ::play_sound_in_space, "roadkill_ar4_yeah", charpos( "ar4" ) );
time += 0.5;
// You don't get this on the 4th of July!
delayThread( time, ::play_sound_in_space, "roadkill_ar1_4thofjuly", charpos( "right_rear_back" ) );
time += 2.05;
// Battalion is oscar mike!!! // roadkill_ar1_battalionom is misspronounced!
delayThread( time, ::play_sound_in_space, "roadkill_ar4_oscarmike", charpos( "ar1" ) );
time += 1.0;
delayThread( time, ::flag_set, "convoy_oscar_mike_after_explosion" );
// All right, we're oscar miiike!!!
delayThread( time, ::play_sound_in_space, "roadkill_cpd_oscarmike", charpos( "cpd" ) );
time += 0.9;
// We're on the move!!!
delayThread( time, ::play_sound_in_space, "roadkill_ar3_onthemove", charpos( "right_rear_back" ) );
time += 1.15;
// Roger that!!
delayThread( time, ::play_sound_in_space, "roadkill_ar4_rogerthat", charpos( "right_rear_back" ) );
time += 2.0;
// The networks are gonna pay big for this one!
delayThread( time, ::play_sound_in_space, "roadkill_cpd_paybig", charpos( "left_back" ) );
time += 1.8;
// Keep dreamin video boy!
delayThread( time, ::play_sound_in_space, "roadkill_ar2_keepdreamin", charpos( "left_back" ) );
time += 1.1;
// No man, seriously, that was extreme!
delayThread( time, ::play_sound_in_space, "roadkill_cpd_extreme", charpos( "left_back" ) );
// // Look! Look! The building's goin' down! (ad lib)
// level.scr_sound[ "generic" ][ "roadkill_cpd_looklook" ] = "roadkill_cpd_looklook";
// Whoa!
// delayThread( 2.4, ::magic_dialogue_queue, "roadkill_ar2_yeahcough", "fly" );
// cough
// delayThread( 3, ::magic_dialogue_queue, "roadkill_gar_cough1", "ar1" );
// allies = GetAIArray( "allies" );
// get_array_of_closest( level.player.origin, allies );
// origins = [];
// for ( i = 0; i < allies.size; i++ )
// {
// origins[ i ] = allies[ i ].origin;
// }
//
// delayThread( 3.1, ::play_sound_in_space, "roadkill_gar_cough1", origins[ 0 ] );
// delayThread( 3.3, ::play_sound_in_space, "roadkill_gar_cough2", origins[ 1 ] );
// delayThread( 3.5, ::play_sound_in_space, "roadkill_gar_cough3", origins[ 2 ] );
// delayThread( 3.8, ::play_sound_in_space, "roadkill_gar_cough4", origins[ 3 ] );
// delayThread( 4.1, ::play_sound_in_space, "roadkill_gar_cough5", origins[ 4 ] );
// delayThread( 4.5, ::play_sound_in_space, "roadkill_gar_cough6", origins[ 5 ] );
/*
// Huah!
delayThread( time, ::magic_dialogue_queue, "roadkill_ar2_huah", "ar2" );
time += 0.3;
*/
//roadkill_ar1_whoa
wait_for_buffer_time_to_pass( start_time, 7.15 );
/*
// The networks are gonna pay big for this one!
magic_dialogue_queue( "roadkill_cpd_paybig", "network_chatter_spawner1" );
// Keep dreamin video boy!
magic_dialogue_queue( "roadkill_ar2_keepdreamin", "network_chatter_spawner2" );
// No man, seriously, that was extreme!
magic_dialogue_queue( "roadkill_cpd_extreme", "network_chatter_spawner1" );
*/
}
convoy_moves_out_dialogue()
{
if ( !is_default_start() )
return;
// Hunter Two! Bridge complete, we're oscar mike! Move out!!
foley_line( "roadkill_fly_bridgecomplete" );
// We're movin' out!!
dunn_line( "roadkill_cpd_movinout" );
// Get your ass back in the vehicle!
time = 0.05;
delayThread( time, ::magic_dialogue_queue, "roadkill_ar3_backinvehicle", "ar3" );
time += 1.3;
// Battalion is oscar mike!!!
delayThread( time, ::magic_dialogue_queue, "roadkill_ar4_oscarmike", "ar4" );
time += 1.2;
wait( time );
/*
// Hu-ahh!! What was that, a 1000 pounder?
guys[ "chat_ar3" ] generic_dialogue_queue( "roadkill_ar3_whatwasthat" );
time = 0.05;
// I dunno but damn that was kick ass, huah?
guys[ "chat_ar4" ] delayThread( time, ::generic_dialogue_queue, "roadkill_ar4_idunno" );
time += 1.2;
*/
// We're oscar mike, move it!
delayThread( time, ::magic_dialogue_queue, "roadkill_fly_oscarmike", "fly" );
time += 0.6;
// We're oscar mike!
delayThread( time, ::magic_dialogue_queue, "roadkill_ar2_oscarmike", "ar2" );
time += 0.6;
// If you have to do #2 go now because once I start the car I am not stoppin', huah?
delayThread( time, ::magic_dialogue_queue, "roadkill_cpd_notstoppin", "cpd" );
time += 3.2;
wait( time );
if ( flag( "player_gets_in" ) )
return;
level endon( "player_gets_in" );
// We're moving out now!
thread magic_dialogue_queue( "roadkill_fly_movingout", "fly" );
wait( 1.2 );
// Mount up!
thread magic_dialogue_queue( "roadkill_fly_mountup", "fly" );
wait( 0.5 );
// We're oscar mike!
thread magic_dialogue_queue( "roadkill_ar2_oscarmike", "ar2" );
}
random_ai_line( msg )
{
ai = GetAIArray( "allies" );
ai = get_array_of_closest( level.player.origin, ai, undefined, 5 );
guy = random( ai );
if ( !isalive( guy ) )
return;
guy generic_dialogue_queue( msg );
}
warn_if_player_shoots_prematurely()
{
if ( flag( "ambush_spawn" ) )
return;
level endon( "ambush_spawn" );
lines = [];
// Allen, what are you shooting at, there's nothing there! Cease fire!
lines[ lines.size ] = "roadkill_fly_nothingthere";
// Allen, stand down! The ROE dictates we can<61>t fire unless fired upon!
// lines[ lines.size ] = "roadkill_fly_standdown";
// Allen! Cease fire!
lines[ lines.size ] = "roadkill_fly_ceasefire";
index = 0;
//thread fail_player_for_excessive_firing();
for ( ;; )
{
if ( player_shoots_at_non_enemy() )
{
wait( 1.5 );
}
if ( player_shoots_at_non_enemy() )
{
theLine = lines[ index ];
index++;
index %= lines.size;
foley_line( theLine );
wait( 1 );
}
wait( 0.05 );
}
}
player_shoots_at_non_enemy()
{
if ( !level.player AttackButtonPressed() )
return false;
ai = GetAIArray( "axis" );
angles = level.player GetPlayerAngles();
dotforward = AnglesToForward( angles );
start = level.player GetEye();
foreach ( guy in ai )
{
angles = VectorToAngles( guy.origin - start );
forward = AnglesToForward( angles );
dot = VectorDot( dotforward, forward );
if ( dot > 0.86 )
return false;
}
return true;
}
fail_player_for_excessive_firing()
{
if ( flag( "ambush_spawn" ) )
return;
level endon( "ambush_spawn" );
count = 0;
time = 5;
sustained_firing_frames = time * 20;
for ( ;; )
{
if ( level.player AttackButtonPressed() )
{
count += 1;
}
else
{
// penality wears off slower than it gains so you can't just fire little bursts overand over
count -= 0.25;
}
if ( count <= 0 )
count = 0;
if ( count > sustained_firing_frames )
break;
wait( 0.05 );
}
// An unsanctioned discharge will not be tolerated.
SetDvar( "ui_deadquote", &"ROADKILL_SHOT_TOO_MUCH" );
missionFailedWrapper();
}
stryker_think()
{
self.veh_pathtype = "constrained";
flag_wait( "player_gets_in" );
self.veh_pathtype = "follow";
}
fence_rattle()
{
pivot = GetEnt( "animated_bridge_fence_pivot", "targetname" );
//pivot thread maps\_debug::drawOrgForever();
wait( 3.25 );
animated_bridge_fences = GetEntArray( "animated_bridge_fence", "targetname" );
foreach ( piece in animated_bridge_fences )
{
piece NotSolid();
piece SetContents( 0 );
piece LinkTo( pivot );
}
start_angles = pivot.angles;
amount = -25;
for ( ;; )
{
time = abs( amount ) * 0.0475;
if ( time < 0.75 )
time = 0.75;
pivot RotateTo( ( 0, 90, amount ), time, time * 0.5, time * 0.5 );
amount *= -0.65;
wait( time );
if ( abs( amount ) <= 2 )
break;
}
pivot RotateTo( start_angles, 0.2 );
wait( 0.5 );
pivot Delete();
}
collapse_earthquake()
{
wait( 1.1 );
level.player PlayRumbleOnEntity( "collapsing_building" );
Earthquake( 0.3, 2, ( -2556.2, -702.2, 1446 ), 15000 );
wait( 2.4 );
Earthquake( 0.15, 0.6, ( -2556.2, -702.2, 1446 ), 15000 );
}
collapsing_building()
{
building = GetEnt( "collapsing_building", "targetname" );
wait( 7.5 );
time = 10;
ent = Spawn( "script_origin", building.origin );
ent.angles = building.angles;
ent AddPitch( -30 );
ent AddYaw( 60 );
ent.origin += ( 0, 0, -2000 );
building MoveTo( ent.origin, time, 6, 0 );
building RotateTo( ent.angles, time, 6, 0 );
building thread play_sound_on_entity( "scn_roadkill_building_collapse" );
exploder( "building_collapse" );
}
roadkill_bomb_physics_explosion()
{
wait( 1.3 );
start = GetEnt( "physics_explosion_line", "targetname" );
end = getstruct( start.target, "targetname" );
dest = getstruct( end.target, "targetname" );
radius = start.radius;
dist = Distance( start.origin, end.origin );
segments = dist / radius;
time = 3;
start MoveTo( dest.origin, time, 2, 0 );
end_time = GetTime() + time * 1000;
segment_vec = end.origin - start.origin;
segment_vec /= segments;
force_vec = ( -45, -55, 72 );
angles = VectorToAngles( force_vec );
forward = AnglesToForward( angles );
force_vec = forward * 0.14;
count = 0;
for ( ;; )
{
if ( GetTime() > end_time )
break;
org = start.origin;
for ( i = 0; i < segments; i++ )
{
count++;
if ( count <= 3 )
{
PhysicsExplosionCylinder( org, radius, radius, 0.3 );
// Print3d( org, "x", (0,0,1), 1, 2, 150 );
}
else
{
PhysicsJolt( org, radius, radius, force_vec );
// Print3d( org, "x", (1,0,0), 1, 2, 150 );
count = 0;
}
org += segment_vec;
}
wait( 0.05 );
}
}
street_walk_scene()
{
array_spawn_function_targetname( "street_walk_scene", ::street_walk_guy );
// flag_wait( "100ton_bomb_goes_off" );
flag_wait( "convoy_oscar_mike_after_explosion" );
wait( 12.5 - 4 );
array_spawn_targetname( "street_walk_scene" );
}
street_walk_guy()
{
self endon( "death" );
self.ignoreall = true;
self.ignoreme = true;
self SetGoalPos( self.origin );
self.moveplaybackrate = 1;
self.pathrandompercent = 0;
struct = getstruct( self.script_linkto, "script_linkname" );
delays = [];
delays[ "street_walk_scene1" ] = 1.7;
delays[ "street_walk_scene2" ] = 0.9;
delays[ "street_walk_scene3" ] = 0;
delay = delays[ struct.targetname ];
delay *= 1.3;
wait( delay );
// flag_wait( "building_face_falloff" );
self enable_cqbwalk();
// struct anim_generic_first_frame( self, "combat_walk" );
struct anim_generic_reach( self, "combat_walk" );
struct thread anim_generic_gravity( self, "combat_walk" );
animation = self getGenericAnim( "combat_walk" );
for ( ;; )
{
if ( self GetAnimTime( animation ) >= 0.96 )
break;
wait( 0.05 );
}
self notify( "killanimscript" );
node = GetNode( self.target, "targetname" );
self SetGoalNode( node );
self.fixednode = false;
self.goalradius = 8;
self waittill( "goal" );
self safe_delete();
}
ps3_hide()
{
if ( !level.console )
return;
if ( !level.ps3 )
return;
ents = getentarray( "ps3_hide", "script_noteworthy" );
foreach ( ent in ents )
{
ent hide();
}
flag_wait( "roadkill_town_dialogue" );
foreach ( ent in ents )
{
ent show();
}
}
broken_wall()
{
// this wall breaks/slides a bit
models = GetEntArray( self.target, "targetname" );
foreach ( model in models )
{
model LinkTo( self );
}
pivot = GetEnt( self.script_linkto, "script_linkname" );
self add_target_pivot( pivot );
start_ent = GetEnt( "broken_wall_start_org", "targetname" );
end_origin = pivot.origin;
end_angles = pivot.angles;
pivot.origin = start_ent.origin;
pivot.angles = start_ent.angles;
flag_wait( "roadkill_town_dialogue" );
flag_wait( "building_face_falloff" );
pivot thread play_sound_on_entity( "scn_roadkill_building_crumble" );
//wait( 1.5 );
moveTime = 4;
pivot RotateTo( end_angles, moveTime, 3, 1 );
pivot MoveTo( end_origin, moveTime, 3, 1 );
exploder( "building_crumble" );
}
roadkill_riverbank_objective()
{
thread detect_player_switched_to_javelin();
/*
idle_commanders = GetEntArray( "idle_commander", "targetname" );
commander = idle_commanders[ 0 ];
origin = commander.origin;
radio_scene = getstruct( "radio_scene", "targetname" );
origin = radio_scene.origin;
*/
// Protect the bridge layer.
waittillframeend;
// Protect the bridge layer.
Objective_Add( obj( "bridge_layer" ), "current", &"ROADKILL_OBJECTIVE_BRIDGELAYER", ( 0, 0, 0 ) );
Objective_Current( obj( "bridge_layer" ) );
Objective_OnEntity( obj( "bridge_layer" ), level.foley );
Objective_SetPointerTextOverride( obj( "bridge_layer" ), &"SCRIPT_WAYPOINT_TARGETS" );
//SetSavedDvar( "compass", 1 );
// flag_wait( "player_enters_riverbank" );
//flag_wait( "riverbank_scene_starts" );
Objective_Position( obj( "bridge_layer" ), (0,0,0) );
flag_wait( "bridge_layer_attacked_by_bridge_baddies" );
wait 4.5;
Objective_Position( obj( "bridge_layer" ), (-2519, -2457, 288) );
setsaveddvar( "compass", 1 );
flag_wait( "bridge_baddies_retreat" );
setsaveddvar( "compass", 0 );
flag_wait( "bridgelayer_crosses" );
objective_complete( obj( "bridge_layer" ) );
wait( 1.5 );
origin = ( -2488, -3755, 182 );
// Get in your Humvee.
Objective_Add( obj( "convoy" ), "current", &"ROADKILL_OBJECTIVE_HUMVEE", origin );
Objective_Current( obj( "convoy" ) );
for ( ;; )
{
if ( IsDefined( level.chair ) )
break;
wait( 0.05 );
}
Objective_OnEntity( obj( "convoy" ), level.chair );
flag_wait( "player_gets_in" );
objective_position( obj( "convoy" ), (0,0,0) );
// Standby for airstrike.
Objective_String( obj( "convoy" ), &"ROADKILL_OBJECTIVE_AIRSTRIKE" );
flag_wait( "convoy_oscar_mike_after_explosion" );
objective_complete( obj( "convoy" ) );
}
roadkill_ride_objective()
{
// Scan for hostile activity. Do not fire unless fired upon.
Objective_Add( obj( "ride" ), "current", &"ROADKILL_OBJECTIVE_SCAN", ( 0, 0, 0 ) );
Objective_Current( obj( "ride" ) );
flag_wait( "shot_rings_out" );
wait( 4.5 );
// Destroy targets of opportunity.
Objective_Add( obj( "ride" ), "current", &"ROADKILL_OBJECTIVE_TARGETS", ( 0, 0, 0 ) );
Objective_Current( obj( "ride" ) );
flag_wait( "player_knocked_down" );
}
roadkill_dismount_objective()
{
if ( !is_default_start() )
{
// Destroy targets of opportunity.
Objective_Add( obj( "ride" ), "current", &"ROADKILL_OBJECTIVE_TARGETS", ( 0, 0, 0 ) );
}
wait( 0.5 );
for ( ;; )
{
if ( IsAlive( level.foley ) )
break;
wait( 0.05 );
}
Objective_OnEntity( obj( "ride" ), level.foley );
flag_wait( "sweep_dismount_building" );
node = GetNode( "dismount_obj_node", "targetname" );
// Get eyes on the school.
Objective_String( obj( "ride" ), &"ROADKILL_OBJECTIVE_DISMOUNT" );
Objective_Position( obj( "ride" ), node.origin );
flag_wait( "friendlies_suppress_school" );
objective_complete( obj( "ride" ) );
}
roadkill_school_objective()
{
trigger = getEntWithFlag( "roadkill_school_14" );
// Terminate the enemy presence in the school.
Objective_Add( obj( "school" ), "current", &"ROADKILL_OBJECTIVE_SCHOOL", trigger.origin );
for ( ;; )
{
if ( IsAlive( level.foley ) )
break;
wait( 0.05 );
}
AssertEx( IsAlive( level.foley ), "No foley no gamey" );
Objective_OnEntity( obj( "school" ), level.foley );
flag_wait( "roadkill_school_14" );
}
roadkill_exfil_objective()
{
objective_complete( obj( "school" ) );
// node = GetNode( "outside_node", "targetname" );
flag_wait( "final_objective" );
// Terminate the enemy presence in the school.
struct = getstruct( "roadkill_shepherd_ending_scene", "targetname" );
// Report to General Shepherd at the rally point.
Objective_Add( obj( "exfil" ), "current", &"ROADKILL_OBJECTIVE_REPORT", struct.origin );
Objective_Current( obj( "exfil" ) );
}
roadkill_mortars()
{
level endon( "time_to_go" );
mortar = self;
mortars = [];
mortars[ mortars.size ] = mortar;
for ( ;; )
{
if ( !isdefined( mortar.target ) )
break;
mortar = getstruct( mortar.target, "targetname" );
mortars[ mortars.size ] = mortar;
}
waits = [];
waits[ 0 ] = 0.3;
waits[ 1 ] = 1.1;
waits[ 2 ] = 0.5;
waits[ 3 ] = 0.0;
waits[ 4 ] = 1.3;
waits[ 5 ] = 2.3;
waits[ 6 ] = 1.6;
waits[ 7 ] = 0.0;
wait( 2.85 - 2.5 );
foreach ( mortar in mortars )
{
mortar.water = IsDefined( mortar.script_noteworthy ) && mortar.script_noteworthy == "water";
}
mortar_fx = getfx( "mortar_large" );
water_fx = getfx( "mortar_water" );
level.building_mortars = get_exploder_array( "building_mortar" );
for ( i = 0; ; i++ )
{
i %= mortars.size;
mortar = mortars[ i ];
if ( mortar.water )
{
mortar.fx = water_fx;
mortar.sound = "mortar_explosion_water";
}
else
{
mortar.fx = mortar_fx;
mortar.sound = "mortar_explosion_dirt";
}
thread roadkill_mortar_goes_off( mortar );
mod = i % waits.size;
wait( waits[ mod ] );
waits[ mod ] += 0.75;// next time we do this one, wait longer
}
}
roadkill_mortar_goes_off( mortar )
{
building_mortar = random( level.building_mortars );
building_mortar activate_individual_exploder();
wait( 2 );
thread play_sound_in_space( "artillery_incoming", mortar.origin );
wait( 0.5 );
PlayFX( mortar.fx, mortar.origin );
RadiusDamage( mortar.origin, 200, 300, 50 );
thread play_sound_in_space( mortar.sound, mortar.origin );
}
detect_if_player_tries_to_cross_bridge()
{
level endon( "player_gets_in" );
flag_wait( "player_tries_to_cross_bridge" );
thread player_dies_to_attackers();
}
player_dies_to_attackers()
{
wait( 2 );
level.player endon( "death" );
level.player delayCall( 3, ::EnableHealthShield, false );
eyepos = level.player GetEye();
org = undefined;
SetDvar( "ui_deadquote", &"ROADKILL_GOT_SNIPED" );
// try to find an org that could see the player
foreach ( org in level.player_killer_orgs )
{
if ( BulletTracePassed( eyepos, org, true, undefined ) )
break;
}
assertex( isdefined( org ), "Impossible!" );
for ( ;; )
{
thread play_sound_in_space( "weap_dragunovsniper_fire_npc", org );
level.player DoDamage( 45 / level.player.damagemultiplier, org );
timer = RandomFloatRange( 0.4, 0.7 );
wait( timer );
}
}
setup_player_killer_orgs()
{
level.player_killer_orgs = [];
orgs = GetEntArray( "attack_point", "script_noteworthy" );
foreach ( org in orgs )
{
level.player_killer_orgs[ level.player_killer_orgs.size ] = org.origin;
}
}
bmp_becomes_javelin_targettable()
{
if ( IsDefined( self.script_noteworthy ) && self.script_noteworthy == "delayed_targeting" )
{
if ( level.start_point != "move_out" )
wait( 10 );
}
wait( 1 );
OFFSET = ( 0, 0, 60 );
Target_Set( self, OFFSET );
Target_SetAttackMode( self, "top" );
Target_SetJavelinOnly( self, true );
self thread set_javelin_targettable_var();
self.health = 20000;
self godon();
self riverbank_bmp_is_shot_at();
if ( IsDefined( self ) )
{
Target_Remove( self );
}
}
set_javelin_targettable_var()
{
self endon( "death" );
wait( 1.5 );
// used for start points
self.javelin_targettable = true;
}
bmp_gets_killed()
{
level.riverside_bmp = self;
}
riverbank_bmp()
{
bmp_destroyed = GetEnt( "bmp_destroyed", "targetname" );
bmp_destroyed thread bmp_destroyed();
//array_spawn_function_targetname( "riverbank_bmp", ::bmp_becomes_javelin_targettable );
array_spawn_function_targetname( "riverbank_bmp", ::bmp_gets_killed );
bmp = spawn_vehicle_from_targetname( "riverbank_bmp" );
bmp waittill( "death" );
exploder( "bmp_explosion" );
wait( 0.5 );
bmp_destroyed notify( "destroyed" );
bmp Delete();
exploder( "bmp" );
}
riverbank_bmp_is_shot_at()
{
self endon( "death" );
for ( ;; )
{
if ( !isalive( self ) )
{
break;
}
oldHealth = self.health;
self waittill( "damage", dmg, attacker, one, two, weapType );
if ( IsDefined( attacker.classname ) && !isplayer( attacker ) )
{
self.health = oldHealth;
continue;
}
if ( weapType != "MOD_PROJECTILE" )
continue;
if ( dmg < 800 )
continue;
// if ( !player_has_javelin() )
// continue;
// level.javelin_helper delayThread( 1, ::anim_single_queue, level.javelin_helper, "hit_target_" + level.bmps_killed_by_player );
self godoff();
RadiusDamage( self.origin, 150, self.health + 500, self.health + 500 );
}
}
bmp_destroyed()
{
self Hide();
targ = GetEnt( self.target, "targetname" );
angles = targ.angles;
origin = targ.origin;
targ Delete();
self waittill( "destroyed" );
self Show();
wait( 5 );
movetime = 8;
self MoveTo( origin, movetime, 0, 2 );
self RotateTo( angles, movetime, 0, 2 );
}
intro_orders()
{
spawners = GetEntArray( self.target, "targetname" );
guys = array_spawn( spawners );
guys[ 0 ].animname = "hargrove";
guys[ 1 ].animname = "foley";
self thread anim_single( guys, "roadkill_intro_orders" );
wait( 0.05 );
guy = undefined;
foreach ( guy in guys )
{
animation = guy getanim( "roadkill_intro_orders" );
guy SetAnim( animation, 1, 0, 0 );
guy SetAnimTime( animation, 0.25 );
}
flag_wait( "player_climbs_stairs" );
foreach ( guy in guys )
{
animation = guy getanim( "roadkill_intro_orders" );
guy SetAnim( animation, 1, 0, 1 );
}
for ( ;; )
{
animation = guy getanim( "roadkill_intro_orders" );
if ( guy GetAnimTime( animation ) >= 0.78 )
break;
wait( 0.05 );
}
foreach ( guy in guys )
{
guy anim_stopanimscripted();
}
}
ai_invulnerable()
{
if ( IsDefined( self.script_drone ) )
return;
if ( IsDefined( self.script_godmode ) )
return;
if ( !isdefined( self.magic_bullet_shield ) )
self magic_bullet_shield();
self.attackeraccuracy = 0;
self.IgnoreRandomBulletDamage = true;
}
extra_bmp_blows_up()
{
// wait( 12.15 );
flag_wait( "100ton_bomb_goes_off" );
wait( 1 );
RadiusDamage( self.origin, 128, 5000, 5000 );
}
player_fights_bmps()
{
bridge_targets = GetEntArray( "bridge_target", "targetname" );
orgs = get_orgs_from_ents( bridge_targets, true );
// array_spawn_function_targetname( "extra_bmp", ::bmp_targets_bridge, orgs );
// spawn_vehicles_from_targetname_and_drive( "extra_bmp" );
// flag_wait( "missile_fire_3" );
flag_wait( "leaving_riverbank" );
flag_wait( "bridgelayer_crosses" );
/*
foreach ( guy in level.stair_block_guys )
{
guy Delete();
}
*/
foreach ( guy in level.stair_block_guys )
{
guy thread run_to_convoy();
}
player_stair_blocker = GetEnt( "player_stair_blocker", "targetname" );
player_stair_blocker Delete();
flag_clear( "player_climbs_stairs" );
}
bmp_targets_bridge( orgs )
{
self endon( "death" );
self waittill( "reached_end_node" );
self endon( "death" );
ent = Spawn( "script_origin", ( 0, 0, 0 ) );
ent.origin = orgs[ 0 ].origin;
self SetTurretTargetEnt( ent );
self.target_ent = ent;
self tank_fires_often( orgs );
}
idle_commander()
{
self magic_bullet_shield();
// self.ignoreall = true;
// self.team = "neutral";
// self disable_pain();
// self.grenadeawareness = 0;
// self.disableBulletWhizbyReaction = true;
}
dismount_foley()
{
level.foley = self;
self make_hero();
}
dismount_dunn()
{
level.dunn = self;
self make_hero();
}
foley_line( msg )
{
level.dialogue_function_stack_struct function_stack( ::foley_line_proc, msg );
}
foley_line_proc( msg )
{
if ( !flag( "player_gets_in" ) )
{
level.foley generic_dialogue_queue( msg );
return;
}
if ( !flag( "player_enters_ambush_house" ) )
{
if ( IsDefined( level.crazy_ride_convoy[ "lead" ] ) && !flag( "player_is_dismounted" ) )
{
level.crazy_ride_convoy[ "lead" ] generic_dialogue_queue( msg );
}
else
{
if ( IsAlive( level.foley ) )
{
level.foley generic_dialogue_queue( msg );
}
else
{
level.player generic_dialogue_queue( msg );
}
}
return;
}
level.foley generic_dialogue_queue( msg );
}
driver_line( msg )
{
level.dialogue_function_stack_struct function_stack( ::driver_line_proc, msg );
}
driver_line_proc( alias )
{
play_line_at_offset_on_player_vehicle( alias, ( -100, 100, -80 ) );
}
passenger_line( msg )
{
level.dialogue_function_stack_struct function_stack( ::passenger_line_proc, msg );
}
passenger_line_proc( alias )
{
play_line_at_offset_on_player_vehicle( alias, ( -100, 0, -80 ) );
}
play_line_at_offset_on_player_vehicle( alias, offset )
{
player_vehicle_angles = level.crazy_ride_convoy[ "player" ].angles;
angles = ( 0, player_vehicle_angles[ 1 ], 0 );
ent = Spawn( "script_origin", ( 0, 0, 0 ) );
ent LinkTo( level.crazy_ride_convoy[ "player" ], "tag_body", offset, ( 0, 0, 0 ) );
ent play_sound_on_entity( alias );
ent Delete();
}
dunn_line( msg )
{
level.dialogue_function_stack_struct function_stack( ::dunn_line_proc, msg );
}
dunn_line_proc( msg )
{
if ( !flag( "player_gets_in" ) )
{
if ( isalive( level.dunn ) )
{
level.dunn generic_dialogue_queue( msg );
}
else
{
magic_dialogue_queue( msg, "ar3" );
}
return;
}
if ( !flag( "player_enters_ambush_house" ) )
{
if ( IsDefined( level.crazy_ride_convoy[ "player" ] ) && !flag( "player_is_dismounted" ) )
{
level.crazy_ride_convoy[ "player" ] generic_dialogue_queue( msg );
}
else
{
if ( IsAlive( level.dunn ) )
{
level.dunn generic_dialogue_queue( msg );
}
else
{
level.player generic_dialogue_queue( msg );
}
}
return;
}
level.dunn generic_dialogue_queue( msg );
}
shepherd_line( msg )
{
level.dialogue_function_stack_struct function_stack( ::shepherd_line_proc, msg );
}
shepherd_line_proc( msg )
{
if ( IsAlive( level.shepherd ) )
{
level.shepherd generic_dialogue_queue( msg );
}
else
{
if ( !isdefined( level.scr_radio[ msg ] ) )
level.scr_radio[ msg ] = level.scr_sound[ "generic" ][ msg ];
radio_dialogue( msg );
}
}
player_is_safe()
{
for ( ;; )
{
axis = GetAIArray( "axis" );
guy = getClosest( level.player.origin, axis, 600 );
if ( !isalive( guy ) )
break;
wait( 0.2 );
}
wait( 0.75 );
}
respawn_dead_school_window_guys()
{
// find which guys are currently alive, respawn the spawners that aren't currently alive
used_exports = [];
ai = GetAIArray( "axis" );
foreach ( guy in ai )
{
used_exports[ guy.export ] = true;
}
foreach ( spawner in level.school_ambush_spawners )
{
if ( !isdefined( used_exports[ spawner.export ] ) )
{
spawner.count = 1;
spawner spawn_ai();
}
}
}
radio_line( msg )
{
level.dialogue_function_stack_struct function_stack( ::radio_dialogue, msg );
}
pistol_killer_spawner()
{
level.pistol_killer = self;
self endon( "death" );
self magic_bullet_shield();
node = GetNode( self.target, "targetname" );
node thread anim_generic( self, "exposed_reload" );
wait( 0.05 );
animation = getGenericAnim( "exposed_reload" );
self SetAnim( animation, 1, 0, 0 );
self SetAnimTime( animation, 0.3 );
flag_wait( "player_rounds_end_corner" );
self SetAnim( animation, 1, 0, 1 );
self.a.pose = "crouch";
for ( ;; )
{
if ( self GetAnimTime( animation ) > 0.90 )
break;
wait( 0.05 );
}
self.a.pose = "stand";
self notify( "killanimscript" );
/*
self.bulletsinclip = 0;
wait( 2.7 );
*/
node = GetNode( "outside_node", "targetname" );
self SetGoalNode( node );
self disable_cqbwalk();
}
roadkill_pistol_guy()
{
self.flashBangImmunity = true;
self.ignoreall = true;
self.ignoreme = true;
self endon( "death" );
//self.allowdeath = true;
self disable_pain();
self.health = 10000;
self forceUseWeapon( "glock", "primary" );
self add_damage_function( ::bloody_pain_reverse );
thread shoot_randomly();
struct = getstruct( "backwards_struct", "targetname" );
struct thread anim_generic_custom_animmode( self, "gravity", "pistol_walk_back" );
self set_generic_deathanim( "pistol_death" );
waittill_notify_or_timeout( "damage", 1.5 );
thread fire_bullets_at_guy();
wait( 0.15 );
self thread anim_generic_custom_animmode( self, "gravity", "pistol_death" );
animation = self getGenericAnim( "pistol_death" );
time = GetAnimLength( animation );
self delayThread( 0.5, animscripts\shared::DropAIWeapon );
//wait( time - 0.05 );
wait( 0.9 );
self.a.nodeath = true;
self Kill();
}
shoot_randomly()
{
self endon( "death" );
self.baseaccuracy = 0;
wait( 0.4 );
self Shoot();
wait( 0.8 );
self Shoot();
wait( 0.2 );
self Shoot();
wait( 0.45 );
self Shoot();
wait( 2 );
self Shoot();
}
bloody_pain_reverse( damage, attacker, direction_vec, point, type, modelName, tagName )
{
angles = direction_vec + ( 0, 180, 0 );
forward = AnglesToForward( angles );
up = AnglesToUp( angles );
fx = getfx( "headshot" );
PlayFX( fx, point, forward, up );
//Line( point, point + forward * 500, (1,0,0), 1, 1, 5000 );
}
fire_bullets_at_guy()
{
struct = getstruct( "pistol_bullet_spawner", "targetname" );
targ = getstruct( struct.target, "targetname" );
vector = struct.origin - targ.origin;
waits = [];
waits[ 0 ] = 0.1;
waits[ 1 ] = 0.1;
waits[ 2 ] = 0.1;
waits[ 3 ] = 0.2;
waits[ 4 ] = 0.1;
waits[ 5 ] = 0.1;
waits[ 6 ] = 0.1;
waits[ 7 ] = 0.25;
count = 12;
for ( i = 0; i < count; i++ )
{
dest_org = targ.origin + randomvector( 40 );
MagicBullet( "m4m203_eotech", struct.origin, dest_org, level.player );
if ( IsDefined( waits[ i ] ) )
{
wait( waits[ i ] );
}
else
{
wait( 0.1 );
}
}
}
player_shoot_detection_trigger()
{
wait_for_player_to_force_flee();
flag_set( "retreaters_run" );
level.player.threatbias = 5000;
wait( 2 );
level.player.threatbias = 150;
}
wait_for_player_to_force_flee()
{
if ( flag( "roadkill_school_9" ) )
return;
level endon( "roadkill_school_9" );
add_wait( ::flag_wait, "player_forces_enemy_to_flee" );// means player can see down the hall
add_wait( ::player_shoots_at_enemies_in_school );
do_wait();
}
player_shoots_at_enemies_in_school()
{
for ( ;; )
{
self waittill( "trigger", other );
if ( !isalive( other ) )
continue;
if ( other == level.player )
break;
}
}
retreat_spawner()
{
self endon( "death" );
self.neverEnableCQB = true;
flag_wait( "retreaters_run" );
// look at the player then make a break for it
self SetLookAtEntity( level.player );
time = RandomFloatRange( 0.3, 0.9 );
wait( time );
self delayCall( 3, ::SetLookAtEntity );
school_flee_struct = getstruct( "school_flee_struct", "targetname" );
self maps\_spawner::go_to_node( school_flee_struct, "struct" );
}
school_spawner_think()
{
self disable_cqbwalk();
self.neverEnableCQB = true;
if ( !flag( "detour_convoy_slows_down" ) )
{
self endon( "death" );
self.ignoreall = true;
self.ignoreme = true;
flag_wait( "detour_convoy_slows_down" );
self.ignoreall = false;
self.ignoreme = false;
return;
}
self.attackeraccuracy = 0.2;
level.school_baddies[ level.school_baddies.size ] = self;
// used the second time these guys spawn
self waittill( "death" );
level notify( "school_spawner_death" );
}
school_spawner_flee_node()
{
level waittill( "school_spawner_death" );
guys = level.school_baddies;
guys = array_removeDead( guys );
node = GetNode( "class_flee_node", "targetname" );
guy = getClosest( node.origin, guys );
if ( IsAlive( guy ) )
{
guy.combatMode = "cover";
guy endon( "death" );
guy SetGoalNode( node );
guy.goalradius = 64;
guy waittill( "goal" );
guy.goalradius = 2000;
}
}
fleeing_baddie_spawner()
{
self endon( "death" );
self.attackeraccuracy = 0;
self.IgnoreRandomBulletDamage = true;
old_dist = self.pathenemyfightdist;
old_look = self.pathenemylookahead;
self.pathenemyfightdist = 0;
self.pathenemylookahead = 0;
self.maxfaceenemydist = 32;
self enable_sprint();
self waittill( "goal" );
wait( 1.5 );
self.attackeraccuracy = 1;
self.IgnoreRandomBulletDamage = false;
self.pathenemyfightdist = old_dist;
self.pathenemylookahead = old_look;
}
stop_sprinting_trigger()
{
for ( ;; )
{
self waittill( "trigger", other );
if ( !isalive( other ) )
continue;
if ( first_touch( other ) )
{
other delayThread( 1.4, ::disable_heat_behavior );
}
}
}
damage_targ_trigger_think()
{
for ( ;; )
{
self waittill( "damage", damage, attacker, direction_vec, point, type, modelName, tagName );
if ( !isalive( attacker ) )
continue;
// if ( attacker != level.player )
// continue;
if ( Distance( attacker.origin, self.origin ) > 940 )
continue;
targ = getstruct( self.target, "targetname" );
RadiusDamage( targ.origin, 30, 5000, 5000 );
}
self Delete();
}
extra_retreat_spawner()
{
// if ( !isdefined( self.target ) )
// thread retreat_spawner();
self.neverEnableCQB = true;
level.forced_bcs_callouts++;
if ( level.forced_bcs_callouts == 1 )
{
self play_sound_on_entity( "AB_2_order_action_suppress" );
}
else
if ( level.forced_bcs_callouts == 2 )
{
wait( 0.15 );
self play_sound_on_entity( "AB_3_order_action_coverme" );
}
}
wave_right_trigger()
{
for ( ;; )
{
self waittill( "trigger", other );
if ( !isalive( other ) )
continue;
if ( other == level.foley )
break;
}
// I think I saw one run into that classroom.
thread foley_line( "roadkill_fly_sawone" );
if ( flag( "roadkill_near_crossroads" ) )
{
add_wait( ::flag, "school_back_baddies_dead" );
add_wait( ::flag, "roadkill_school_12" );
do_wait_any();
if ( flag( "roadkill_school_12" ) )
{
flag_set( "roadkill_school_11" );
return;
}
}
// other endon( "death" );
targ = getstruct( self.target, "targetname" );
targ anim_generic_reach( other, "cqb_wave" );
if ( IsAlive( other ) )
targ thread anim_generic( other, "cqb_wave" );
wait( 0.9 );
other enable_ai_color();
flag_set( "roadkill_school_11" );
// switches tracks so he doesn't go into the room he signaled
/*
if ( IsAlive( other ) )
other set_force_color( "b" );
// turn the green guy to a purple guy
ai = GetAIArray( "allies" );
foreach ( guy in ai )
{
if ( !isdefined( guy.script_forcecolor ) )
continue;
if ( guy.script_forcecolor != "g" )
continue;
guy set_force_color( "p" );
break;
}
*/
}
staircase_grenade()
{
flag_wait( "staircase_grenade" );
trigger = getEntWithFlag( "staircase_grenade" );
start = getstruct( trigger.target, "targetname" );
end = getstruct( start.target, "targetname" );
vector = end.origin - start.origin;
angles = VectorToAngles( vector );
forward = AnglesToForward( angles );
velocity = forward * 450;
MagicGrenadeManual( "fraggrenade", start.origin, velocity, 5 );
}
detach_my_scr_model()
{
self Detach( level.scr_model[ self.animname ], "tag_inhand" );
}
stair_block_guy()
{
level.stair_block_guys[ level.stair_block_guys.size ] = self;
self add_riverbank_flags();
self endon( "death" );
struct = getstruct( self.script_linkto, "script_linkname" );
self.animname = struct.targetname;
self gun_remove();
self.doing_looping_anim = true;
// electronics_pda
if ( IsDefined( level.scr_model[ self.animname ] ) )
{
self Attach( level.scr_model[ self.animname ], "tag_inhand" );
self.convoy_func = ::detach_my_scr_model;
}
struct thread anim_loop_solo( self, "sit_around" );
flag_wait( "time_to_go" );
self gun_recall();
struct notify( "stop_loop" );
}
rooftop_drone()
{
struct = getstruct( self.script_linkto, "script_linkname" );
self.animname = "generic";
offset = ( 0, 0, 100 );
struct.origin -= offset;
ent = spawn_tag_origin();
ent.origin = struct.origin;
ent.angles = struct.angles;
self LinkTo( ent, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) );
ent MoveTo( ent.origin + offset, 1, 0.5, 0.5 );
struct anim_generic( self, "rooftop_turn" );
ent Delete();
self Delete();
}
wobbly_fans()
{
fans = GetEntArray( "destructible_toy", "targetname" );
foreach ( fan in fans )
{
if ( fan.destructible_type == "toy_ceiling_fan" )
fan thread fan_wobbles();
}
}
fan_wobbles()
{
self endon( "death" );
//self endon( "exploded" );
action_v = level.destructible_type[ self.destuctableInfo ].parts[ 0 ][ 0 ].v;
animation = action_v[ "animation" ][ 0 ][ "anim" ];
for ( ;; )
{
rate = RandomFloatRange( 0.01, 0.04 );// go slow for awhile
self SetAnim( animation, 1, 0, rate );
timer = RandomFloatRange( 1.0, 2.5 );
wait( timer );
rate = RandomFloatRange( 0.01, 0.15 );// go a random speed
self SetAnim( animation, 1, 0, rate );
timer = RandomFloatRange( 1.0, 3 );
wait( timer );
rate = RandomFloatRange( 0.05, 0.2 );// go a random speed
self SetAnim( animation, 1, 0, rate );
timer = RandomFloatRange( 1.0, 3 );
wait( timer );
}
}
friendlies_get_on_exit_convoy_trigger()
{
for ( ;; )
{
self waittill( "trigger", other );
if ( !isalive( other ) )
continue;
if ( !first_touch( other ) )
continue;
if ( !isdefined( other.running_loader ) )
continue;
other thread friendly_gets_on_vehicle();
}
}
friendly_gets_on_vehicle()
{
self endon( "death" );
vehicle = undefined;
level.ending_vehicles = array_randomize( level.ending_vehicles );
foreach ( ending_vehicle in level.ending_vehicles )
{
used_positions = 0;
foreach ( pos in ending_vehicle.usedpositions )
{
if ( !pos )
used_positions++;
}
if ( used_positions )
{
vehicle = ending_vehicle;
break;
}
}
if ( !isdefined( vehicle ) )
return;
thread guy_runtovehicle_load( self, vehicle );
}
friendly_ending_runner_spawner()
{
self.running_loader = true;
self.fixednode = false;
node = GetNode( "friendly_exit_node", "targetname" );
self SetGoalNode( node );
self.goalradius = 64;
}
shepherd_ending_spawner()
{
level.shepherd = self;
thread player_loses_gun_at_close_range();
self.animname = "shepherd";
self.disablearrivals = true;
self.disableexits = true;
self gun_remove();
// Transport the wounded directly to the shock trauma unit! Use my helicopter! I'll take the next one out!
thread shepherd_line( "roadkill_shp_shocktrauma" );
struct = getstruct( "roadkill_shepherd_ending_scene", "targetname" );
struct anim_first_frame_solo( self, "ending" );
Objective_OnEntity( obj( "exfil" ), self );
flag_wait( "start_shepherd_end" );
// flag_wait( "the_end" );
thread roadkill_ending_dialogue();
//thread maps\roadkill_anim::point_start( self );
node = GetNode( "shepherd_lookout_node", "targetname" );
self SetGoalNode( node );
self.goalradius = 8;
self set_generic_run_anim( "walk" );
scene = "ending";
animation = self getanim( scene );
time = getanimlength( animation );
self delaythread( time * 0.332, maps\roadkill_anim::point_start, self );
//struct anim_single_solo( self, "ending" );
struct anim_custom_animmode_solo( self, "gravity", scene );
}
player_loses_gun_at_close_range()
{
self endon( "death" );
level.player endon( "death" );
for ( ;; )
{
if ( distance( level.player.origin, self.origin ) < 200 )
break;
wait( 0.05 );
}
for ( ;; )
{
eyepos = self geteye();
if ( level.player WorldPointInReticle_Circle( eyepos, 65, 75 ) )
break;
wait( 0.05 );
}
level.player DisableWeapons();
}
roadkill_ending_dialogue()
{
wait( 9.8 );
// Battalion is oscar mike!!!
thread random_ai_line( "roadkill_ar4_oscarmike" );
wait( 0.4 );
// Anybody got a spare MRE?
//thread random_ai_line( "roadkill_ar1_sparemre" );
wait( 0.3 );
}
ending_hangout_spawner()
{
self set_generic_run_anim( "walk" );
}
ride_adjust_convoy_speed_trigger()
{
/*
// give the lead vehicle some distance
trigger = GetEnt( "ride_adjust_convoy_speed_trigger", "targetname" );
trigger waittill( "trigger", other );
other Vehicle_SetSpeed( 10, 1, 1 );
wait( 12 );
other ResumeSpeed( 1 );
*/
}
ignore_and_delete()
{
self endon( "death" );
self.ignoreme = true;
self.ignoreall = true;
self waittill( "goal" );
wait( 0.5 );
self waittill( "goal" );
self Delete();
}
wait_for_empty_queue()
{
if ( !isdefined( self.function_stack ) )
return;
while ( self.function_stack.size > 0 )
{
wait( 0.05 );
}
}
dunn_credits_player_with_kill( max_time )
{
level endon( "dunn_no_commento" );
wait( max_time + 0.1 );
level.dialogue_function_stack_struct wait_for_empty_queue();
if ( !flag( "jumper_died" ) )
return;
// Nevermind, Allen handled it
dunn_line( "roadkill_cpd_handledit" );
}
look_forward_nag()
{
if ( flag( "ride_looking_forward" ) )
return;
level endon( "ride_looking_forward" );
wait( 3 );
// Eyes forward, Allen. Look alive.
foley_line( "roadkill_fly_eyesforward" );
}
gunner_becomes_invul()
{
turret = self.mgturret[ 0 ];
for ( ;; )
{
gunner = turret GetTurretOwner();
if ( IsAlive( gunner ) )
{
if ( !isdefined( gunner.magic_bullet_shield ) )
gunner magic_bullet_shield();
return;
}
wait( 0.05 );
}
}
get_gunner_from_vehicle()
{
foreach ( guy in self.riders )
{
if ( !isalive( guy ) )
continue;
if ( !issentient( guy ) )
continue;
if ( IsDefined( guy GetTurret() ) )
return guy;
}
}
structorama()
{
for ( ;; )
{
struct = getstruct( "mortar_school_chain", "targetname" );
struct delayThread( 1, ::struct_mortar );
struct = getstruct( struct.target, "targetname" );
struct delayThread( 1.3, ::struct_mortar );
struct = getstruct( struct.target, "targetname" );
struct delayThread( 1.6, ::struct_mortar );
wait( 5 );
}
}
struct_mortar()
{
thread play_sound_in_space( "artillery_incoming_loud", self.origin );
wait( 1 );
mortar_fx = getfx( "mortar_large" );
PlayFX( mortar_fx, self.origin );
RadiusDamage( self.origin, 100, 500, 500, level.player );
thread play_sound_in_space( "mortar_explosion_dirt", self.origin );
PhysicsExplosionSphere( self.origin, 100, 100, 2 );
}
smoke_degrades()
{
wait( 2.5 );
self.degrade_time += 0.05;
wait( 1 );
self.degrade_time += 0.05;
wait( 1 );
self.degrade_time += 0.05;
wait( 1 );
//self.degrade_time += 0.05;
self notify( "done" );
}
turret_burns_out()
{
// ent delayThread( 4.5, ::send_notify, "done" );
ent = SpawnStruct();
ent endon( "done" );
ent.degrade_time = 0;
ent thread smoke_degrades();
level endon( "kaboom_to_detour_vehicle" );
fx = getfx( "minigun_burnout" );
for ( ;; )
{
PlayFXOnTag( fx, self, "j_spin" );
timer = 0;
if ( ent.degrade_time > 0 )
{
timer += RandomFloat( ent.degrade_time );
}
timer += 0.035;
wait( timer );
}
}
vehicle_resumespeed_trigger()
{
if ( flag( "convoy_slows_down_again" ) )
return;
level endon( "convoy_slows_down_again" );
for ( ;; )
{
self waittill( "trigger", other );
if ( !first_touch( other ) )
continue;
other Vehicle_SetSpeed( 8.2, 5, 5 );
}
}
player_convoy_encounters_baddies()
{
trigger = GetEnt( "vehicle_resumespeed_trigger", "targetname" );
trigger thread vehicle_resumespeed_trigger();
player_vehicle = level.crazy_ride_convoy[ "player" ];
detour_vehicle = level.crazy_ride_convoy[ "detour" ];
lead_vehicle = level.crazy_ride_convoy[ "lead" ];
rear_vehicle = level.crazy_ride_convoy[ "rear" ];
gunner = detour_vehicle get_gunner_from_vehicle();
flag_wait( "shot_rings_out" );
wait( 1.5 );
faster = 10.2;
lead_vehicle delayCall( 0, ::Vehicle_SetSpeed, faster, 10, 10 );
detour_vehicle delayCall( 0.45, ::Vehicle_SetSpeed, faster, 10, 10 );
rear_vehicle delayCall( 0.8, ::Vehicle_SetSpeed, faster, 10, 10 );
player_vehicle delayCall( 1.2, ::Vehicle_SetSpeed, faster, 10, 10 );
flag_wait( "haggerty_rechambers" );
level.timer = GetTime();
delayThread( 1.1, ::rpg_hits_hydrant );
vehicle = detour_vehicle;
node = GetVehicleNode( "detour_vehicle_path", "targetname" );
// veers off to the left
vehicle thread vehicle_paths( node );
vehicle StartPath( node );
node = GetVehicleNode( "player_detour_vehicle_path", "targetname" );
player_vehicle thread vehicle_paths( node );
player_vehicle StartPath( node );
level notify( "convoy_continues_to_ambush" );
// flag_wait( "trappers_run" );
// array_spawn_noteworthy( "rpg_ambush_spawner" );
flag_wait( "detour_convoy_slows_down" );
rear_vehicle delayCall( 2.5, ::Vehicle_SetSpeed, 0, 10, 10 );
lead_vehicle delayCall( 2.5, ::Vehicle_SetSpeed, 0, 10, 10 );
attractor = Missile_CreateAttractorEnt( level.crazy_ride_convoy[ "detour" ], 25000, 1024 );
slower = 6;
// threadoff() <- and threadoff was born
detour_vehicle Vehicle_SetSpeed( slower, 10, 10 );
wait( 0.1 );
player_vehicle Vehicle_SetSpeed( slower, 10, 10 );
// flag_wait( "rpg_ambush" );
flag_wait( "gunner_dies" );
if ( IsAlive( gunner ) )
{
if ( IsDefined( gunner.magic_bullet_shield ) )
gunner stop_magic_bullet_shield();
eye = gunner GetEye();
MagicBullet( "ak47", eye + ( 0, 0, 35 ), eye + ( 0, 0, -35 ) );
}
flag_wait( "rpg_super_ambush" );
ai = GetAIArray( "axis" );
foreach ( guy in ai )
{
// no more rpgs fire like crazy
guy.a.rockets = 0;
}
trigger = getEntWithFlag( "rpg_ambush" );
start = GetEnt( trigger.target, "targetname" );
end = GetEnt( start.target, "targetname" );
//array_spawn_function_targetname( "rpg_vehicle", ::rpg_vehicle );
//spawn_vehicle_from_targetname_and_drive( "rpg_vehicle" );
//detour_vehicle Vehicle_SetSpeed( 9, 10, 10 );
timer = GetTime();
//wait( 0.5 );
rear_vehicle.veh_brake = 0.1;
rear_vehicle delayThread( 1.5, ::set_brakes, 1 );
angles = detour_vehicle.angles;
forward = AnglesToForward( angles );
right = AnglesToRight( angles );
struct = getstruct( "ambush_impact_vector", "targetname" );
target = getstruct( struct.target, "targetname" );
velocity_angles = VectorToAngles( target.origin - struct.origin );
velocity_forward = AnglesToForward( velocity_angles );
velocity = velocity_forward * 1;
// LOTS OF EXPLOSIONS
contact_point = right * -30 + forward * - 30 + ( 0, 0, -10 );
//Print3d( detour_vehicle.origin + contact_point, "x", (1,0,0), 1, 1.2, 500 );
//detour_vehicle VehPhys_Launch( velocity, (0,0,0), contact_point );
PhysicsExplosionSphere( detour_vehicle.origin + contact_point, 48, 32, 3 );
level notify( "kaboom_to_detour_vehicle" );
mortar_fx = getfx( "mortar_large" );
PlayFX( mortar_fx, detour_vehicle.origin + contact_point );
//detour_vehicle Vehicle_SetSpeed( 0, 10, 10 );
detour_vehicle godoff();
RadiusDamage( detour_vehicle.origin, 64, 50000, 50000 );
Earthquake( 0.7, 1.2, level.player.origin, 5000 );
level.player PlayRumbleOnEntity( "damage_heavy" );
level.player ShellShock( "default", 5 );
detour_vehicle.veh_brake = 0.15;
thread vision_set_fog_changes( "roadkill_ambush", 0.8 );
flag_set( "ambush" );
Missile_DeleteAttractor( attractor );
// keep other missiles away
repulsor = Missile_CreateRepulsorEnt( level.player, 700, 1500 );
wait( 0.7 );
player_vehicle.veh_brake = 0.05;// player starts to brake
wait( 0.5 );
//rear_vehicle Vehicle_SetSpeed( 0, 10, 10 );
//rear_vehicle.veh_brake = 1;
// player brakes
player_vehicle delayThread( 0.7, ::set_brakes, 1 );
wait_around_time = 3.2;
// rpg flies by
delayThread( 2.00 + wait_around_time, ::rpg_flies_by_view );
lead_vehicle delayCall( 5.0, ::resumespeed, 5 );
wait( 1.25 + wait_around_time );
player_vehicle.veh_transmission = "reverse";
player_vehicle.veh_pathdir = "reverse";
player_vehicle Vehicle_SetSpeed( 16, 5, 5 );
player_vehicle.veh_brake = 0;
wait( 1.8 );
player_vehicle.veh_brake = 1;
wait( 0.7 );
player_vehicle.veh_brake = 0;
player_vehicle.veh_transmission = "forward";
player_vehicle.veh_pathdir = "forward";
// player gets back on path
node = GetVehicleNode( "player_gets_back_on_path", "targetname" );
player_vehicle thread vehicle_paths( node );
player_vehicle StartPath( node );
player_vehicle ResumeSpeed( 5 );
// rear_vehicle delayCall( 0.65, ::resumespeed, 5 );
rear_vehicle ResumeSpeed( 5 );
// player_vehicle Vehicle_SetSpeed( 24, 5, 5 );
noself_delayCall( 2, ::Missile_DeleteAttractor, repulsor );
wait( 0.8 );
// rear_vehicle Vehicle_SetSpeed( 24, 5, 5 );
rear_vehicle.veh_brake = 0;
}
rpg_hits_hydrant()
{
array_spawn_function_targetname( "window_rpg_hydrant", ::rpg_vehicle );
vehicle = spawn_vehicle_from_targetname_and_drive( "window_rpg_hydrant" );
vehicle waittill( "death" );
thread hydrant_hit();
}
rpg_flies_by_view()
{
array_spawn_function_targetname( "window_rpg_vehicle", ::rpg_vehicle );
vehicle = spawn_vehicle_from_targetname_and_drive( "window_rpg_vehicle" );
vehicle waittill( "death" );
struct = getstruct( "dyn_explosion_struct", "targetname" );
// PhysicsExplosionSphere( struct.origin, 350, 350, 3 );
level.player delayThread( 3, maps\_gameskill::grenade_dirt_on_screen, "left" );
struct = getstruct( "dyn_spawner_struct", "targetname" );
targ = getstruct( struct.target, "targetname" );
models = [];
models[ 0 ] = "me_woodcrateclosed";
models[ 1 ] = "com_cardboardboxshortclosed_2";
offsets = [];
offsets[ 0 ] = ( 0, 0, 8 );
offsets[ 1 ] = ( 0, 0, 4.5 );
forcemult = [];
forcemult[ 0 ] = 4;
forcemult[ 1 ] = 1;
fx = getfx( "rocket_explode" );
PlayFX( fx, struct.origin );
thread play_sound_in_space( "rocket_explode_dirt", struct.origin, true );
PhysicsExplosionSphere( struct.origin, 320, 280, 4 );
RadiusDamage( struct.origin, 320, 50, 50 );
for ( i = 0; i < 14; i++ )
{
end = targ.origin + randomvector( 128 );
vec = end - struct.origin;
angles = VectorToAngles( vec );
forward = AnglesToForward( angles );
index = RandomInt( models.size );
ent = Spawn( "script_model", struct.origin );
ent SetModel( models[ index ] );
force = forward;
force *= 18000;
force *= forcemult[ index ];
force *= RandomFloatRange( 0.9, 1.6 );
offset = offsets[ index ] + randomvector( 1.2 );
ent PhysicsLaunchClient( ent.origin + offset, force );
}
}
vehicle_physics_explosion()
{
rpg_physics = GetEnt( "rpg_physics", "targetname" );
targ = GetEnt( rpg_physics.target, "targetname" );
rpg_physics_dest = GetEnt( "rpg_physics_dest", "targetname" );
targ_dest = GetEnt( rpg_physics_dest.target, "targetname" );
time = 0.3;
rpg_physics MoveTo( rpg_physics_dest.origin, time );
targ MoveTo( targ_dest.origin, time );
start_time = GetTime();
time *= 1000;
power = 6.25;
vec = targ.origin - rpg_physics.origin;
angles = VectorToAngles( vec );
forward = AnglesToForward( angles );
vec = forward * power;
power *= 0.35;
level.crazy_ride_convoy[ "detour" ] VehPhys_Launch( vec, 1.0 );
/*
delayThread( 0.25, ::reverse_force );
for ( ;; )
{
vec = targ.origin - rpg_physics.origin;
angles = VectorToAngles( vec );
forward = AnglesToForward( angles );
vec = forward * power;
power *= 0.35;
// PhysicsExplosionSphere( rpg_physics.origin, rpg_physics.radius, rpg_physics.radius, 30 );
PhysicsJolt( rpg_physics.origin, rpg_physics.radius, rpg_physics.radius, vec );
Line( rpg_physics.origin, targ.origin, (1,0,0), 1, 0, 50 );
wait( 0.05 );
if ( GetTime() > start_time + time )
break;
}
*/
// PhysicsExplosionCylinder( rpg_physics.origin, rpg_physics.radius, rpg_physics.radius, 30 );
//Print3d( rpg_physics.origin, "30" );
//wait( 0.05 );
//}
}
reverse_force()
{
reverse_force = GetEnt( "reverse_force", "targetname" );
targ = GetEnt( reverse_force.target, "targetname" );
vec = targ.origin - reverse_force.origin;
angles = VectorToAngles( vec );
forward = AnglesToForward( angles );
vec = forward * 3.5;
PhysicsJolt( reverse_force.origin, 350, 350, vec );
Line( reverse_force.origin, targ.origin, ( 0, 0, 1 ), 1, 0, 500 );
}
rpg_vehicle()
{
self SetModel( "projectile_rpg7" );
fx = getfx( "rpg_trail" );
PlayFXOnTag( fx, self, "tag_origin" );
fx = getfx( "rpg_muzzle" );
PlayFXOnTag( fx, self, "tag_origin" );
self waittill( "reached_end_node" );
flag_set( "rpg_end" );
self Delete();
}
ride_scenes()
{
//thread street_runner_scene();
thread favela_flee_alley();
thread roof_backup_scene();
thread civ_balcony();
thread garage_scene();
thread window_waver();
thread alley_runners();
//thread corner_hider();
array_spawn_function_noteworthy( "flee_if_seen", ::flee_if_seen );
array_spawn_function_noteworthy( "run_and_delete", ::run_and_delete );
}
run_and_delete()
{
self.ignoreme = true;
self.ignoreall = true;
self endon( "death" );
if ( IsDefined( self.script_delay ) )
{
self SetGoalPos( self.origin );
self.goalradius = 8;
script_delay();
self thread maps\_spawner::go_to_node();
}
self waittill( "reached_path_end" );
self Delete();
}
flee_if_seen()
{
self.ignoreme = true;
self.ignoreall = true;
self endon( "death" );
start_pos = self.origin;
self waittill( "goal" );
wait( 0.5 );
add_wait( ::player_looks_at_me );
add_wait( ::_wait, 4 );
do_wait_any();
self SetGoalPos( start_pos );
self.goalradius = 8;
self waittill( "goal" );
self Delete();
}
player_looks_at_me()
{
self endon( "death" );
for ( ;; )
{
if ( within_fov_of_players( self.origin, 0.75 ) )
return;
wait( 0.05 );
}
}
corner_hider()
{
array_spawn_function_noteworthy( "corner_hider_spawner", ::corner_hider_spawner );
//array_spawn_noteworthy( "corner_hider_spawner" );
}
bloody_pain( amount, attacker, dir, point, type, a, b )
{
fx = getfx( "headshot" );
forward = AnglesToForward( dir );
up = AnglesToUp( dir );
PlayFX( fx, point, forward, up );
//Line( point, point + forward * 500, (1,0,0), 1, 1, 5000 );
}
corner_hider_spawner()
{
self endon( "death" );
self set_generic_deathanim( "facedown_death" );
self add_damage_function( ::bloody_pain_reverse );
self.health = 5000;
// targets this guy so he is looking back
//turret_alley_target = GetEnt( "turret_alley_target", "targetname" );
turret = level.crazy_ride_convoy[ "detour" ].mgturret[ 0 ];
turret SetMode( "manual" );
turret SetTargetEntity( self );
turret.dontshoot = true;
owner = turret GetTurretOwner();
if ( IsAlive( owner ) )
owner.ignoreall = true;
trigger = GetEnt( "detour_shoots_alley_guy_trigger", "targetname" );
for ( ;; )
{
trigger waittill( "trigger", other );
if ( other == level.crazy_ride_convoy[ "detour" ] )
break;
wait( 0.05 );
}
//wait( 1.35 );
flag_set( "trapper_spawners_ignoreme" );
turret.dontshoot = undefined;
wait( 0.5 );
//self waittill( "damage" );
struct = getstruct( "run_death_facedown", "targetname" );
struct thread anim_generic_gravity( self, "facedown_death" );
wait( 1 );
self.a.nodeath = true;
self Kill();
/*
node = GetNode( self.script_linkto, "script_linkname" );
struct = getstruct( self.target, "targetname" );
self.ignoreme = true;
self.ignoreall = true;
self endon( "death" );
self.animname = "flee_alley";
self.favoriteenemy = level.player;
self.goalradius = 8;
self SetGoalNode( node );
self SetLookAtEntity( level.player );
self disable_long_death();
//wait( 2.34 );
flag_wait( "ambush_guy_attacks" );
// next node
node = GetNode( node.script_linkto, "script_linkname" );
self SetGoalNode( node );
self.goalradius = 8;
self.a.pose = "stand";
self.a.movement = "run";
// increase the time over which he blends in anim custom animmode
self.anim_blend_time_override = 1;
thread jumper_shoots_car_fx();
struct anim_custom_animmode_solo( self, "gravity", "flee_shooting" );
self SetLookAtEntity();
self waittill( "goal" );
level notify( "jumper_reached_goal" );
self Delete();
*/
}
jumper_shoots_car_fx()
{
self endon( "death" );
struct = getstruct( "jumper_fx", "targetname" );
dirt_fx = getfx( "car_dirt" );
spark_fx = getfx( "car_spark" );
count = 0;
for ( ;; )
{
self waittillmatch( "custom_animmode", "fire_spray" );// whatever
count++;
link = getstruct( struct.script_linkto, "script_linkname" );
angles = VectorToAngles( link.origin - struct.origin );
forward = AnglesToForward( angles );
fx = dirt_fx;
alias = "bullet_large_dirt";
if ( count > 6 )
{
fx = spark_fx;
alias = "bullet_large_metal";
//Line( struct.origin, struct.origin + forward * 50, (1,1,0), 1, 0, 150 );
}
else
{
//Line( struct.origin, struct.origin + forward * 50, (1,0,0.5), 1, 0, 150 );
}
thread play_sound_in_space( alias, struct.origin );
PlayFX( fx, struct.origin, forward );
if ( !isdefined( struct.target ) )
break;
struct = getstruct( struct.target, "targetname" );
if ( count > 9 )
level.player DoDamage( 20 / level.player.damageMultiplier, self.origin, self, self );
}
for ( ;; )
{
level.player DoDamage( 20 / level.player.damageMultiplier, self.origin, self, self );
self waittillmatch( "custom_animmode", "fire_spray" );// whatever
}
}
alley_runners()
{
array_spawn_function_noteworthy( "alley_runner_spawner_first", ::alley_runner_spawner_first );
array_spawn_function_noteworthy( "alley_runner_spawner", ::alley_runner_spawner );
// array_spawn_noteworthy( "alley_runner_spawner_first" );
// array_spawn_noteworthy( "alley_runner_spawner" );
}
alley_runner_spawner_first()
{
self endon( "death" );
self.ignoreme = true;
self.ignoreall = true;
struct = getstruct( self.target, "targetname" );
scene = struct.animation;
struct anim_generic( self, scene );
self Delete();
}
wall_climber_ragdolls_on_pain( amt, attacker, force, b, c, d, e )
{
if ( attacker != level.player )
return;
//self.allowdeath = true;
//self Kill();
self StartRagdoll();
self remove_damage_function( ::wall_climber_ragdolls_on_pain );
}
alley_runner_spawner()
{
self endon( "death" );
self add_damage_function( ::wall_climber_ragdolls_on_pain );
self disable_pain();
// self magic_bullet_shield();
self.ignoreall = true;
self.ignoreme = true;
self.disableBulletWhizbyReaction = true;
self.ignoreSuppression = true;
self.ignoreall = true;
pauses = [];
pauses[ "unarmed_climb_wall" ] = 1.2;
pauses[ "unarmed_climb_wall_v2" ] = 0;
struct = getstruct( self.target, "targetname" );
scene = struct.animation;
pause = pauses[ scene ];
wait( pause );
struct anim_generic_reach( self, scene );
struct anim_generic( self, scene );
node = GetNode( "alley_runner_node", "targetname" );
self SetGoalNode( node );
self.goalradius = 8;
self waittill( "goal" );
// self stop_magic_bullet_shield();
self Delete();
}
favela_flee_alley()
{
// rounds a corner
array_spawn_function_targetname( "favela_hide_spawner", ::favela_hide_spawner );
flag_wait( "start_runner" );
array_spawn_targetname( "favela_hide_spawner" );
}
favela_hide_spawner()
{
self endon( "death" );
self.animname = "flee_alley";
struct = getstruct( self.target, "targetname" );
struct thread anim_loop_solo( self, "idle" );
wait( 5 );
struct notify( "stop_loop" );
struct thread anim_custom_animmode_solo( self, "gravity", "round_corner" );
animation = self getanim( "round_corner" );
for ( ;; )
{
if ( self GetAnimTime( animation ) > 0.8 )
break;
wait( 0.05 );
}
self SetLookAtEntity( level.player );
struct = getstruct( "hide_house_scene", "targetname" );
struct anim_first_frame_solo( self, "hands_up" );
wait( 1.7 );
struct anim_single_solo( self, "hands_up" );
self safe_delete();
}
window_waver()
{
flag_wait( "garage_door_scene" );
wait( 10 );
spawner = GetEnt( "window_wave_loop_spawner", "targetname" );
spawner.script_drone_override = true;
// array_spawn_function_targetname( "window_wave_loop_spawner", ::window_wave_loop );
// array_spawn_targetname( "window_wave_loop_spawner" );
}
window_wave_loop()
{
self endon( "death" );
self SetLookAtEntity( level.player );
start = self.origin;
scene = self.script_noteworthy;
struct = getstruct( self.target, "targetname" );
struct thread anim_generic_loop( self, scene );
wait( 13.4 );
struct notify( "stop_loop" );
self anim_stopanimscripted();
self SetGoalPos( start );
self.goalradius = 5;
wait( 5 );
self Delete();
}
garage_scene()
{
// garage_door_scene_left
// garage_door_scene
flag_wait( "garage_door_scene" );
run_thread_on_targetname( "garage_pull_struct", ::garage_pull_struct );
array_spawn_function_targetname( "garage_spawner", ::garage_spawner );
garage_spawner_right = GetEnt( "garage_spawner_right", "script_noteworthy" );
garage_spawner_left = GetEnt( "garage_spawner_left", "script_noteworthy" );
// garage_window_shouter_spawner = GetEnt( "garage_window_shouter_spawner", "script_noteworthy" );
garage_spawner = GetEnt( "garage_spawner", "script_noteworthy" );
garage_spawner_right delayThread( 0, ::spawn_ai );
//garage_window_shouter_spawner delayThread( 0, ::spawn_ai );
garage_spawner delayThread( 6.4, ::spawn_ai );
garage_spawner_left delayThread( 3.4, ::spawn_ai );
}
garage_spawner()
{
self endon( "death" );
scene = self.script_noteworthy;
start_org = self.origin;
structs = [];
structs[ "garage_spawner_right" ] = "garage_door_scene";
structs[ "garage_spawner_left" ] = "garage_door_scene_left";
structs[ "garage_spawner" ] = "garage_door_scene";
structs[ "garage_window_shouter_spawner" ] = self.target;
self.moveplaybackrate = 1;
if ( scene == "garage_spawner_right" )
{
self.force_civilian_hunched_run = true;
}
else
if ( scene == "garage_spawner_left" )
{
self.force_civilian_stand_run = true;
}
if ( IsDefined( level.scr_anim[ "generic" ][ scene + "_run" ] ) )
{
self set_generic_run_anim( scene + "_run", false );
}
struct_name = structs[ scene ];
struct = getstruct( struct_name, "targetname" );
struct anim_generic_reach( self, scene );
if ( scene == "garage_spawner" )
{
level.garage_puller = self;
self disable_pain();
self magic_bullet_shield();
delayThread( 1.75, ::flag_set, "pull_garage" );
}
struct anim_generic( self, scene );
return_to_goal = [];
return_to_goal[ "garage_spawner_right" ] = false;
return_to_goal[ "garage_spawner_left" ] = false;
return_to_goal[ "garage_window_shouter_spawner" ] = true;
return_to_goal[ "garage_spawner" ] = false;
if ( !return_to_goal[ scene ] )
{
self SetGoalPos( self.origin );
wait( 5 );
self safe_delete();
return;
}
self SetGoalPos( start_org );
self.goalradius = 4;
self waittill( "goal" );
self safe_delete();
}
garage_pull_struct()
{
// get the structs that control the height of the garage door
lower_struct = self;
mid_struct = getstruct( lower_struct.target, "targetname" );
top_struct = getstruct( mid_struct.target, "targetname" );
top_struct.origin += ( 0, 0, 10 );// buffer
// get the brushes that make up the door
brushes = [];
brush = top_struct;
for ( ;; )
{
newbrush = GetEnt( brush.target, "targetname" );
brushes[ brushes.size ] = newbrush;
if ( !isdefined( newbrush.target ) )
break;
brush = newbrush;
}
start_height = mid_struct.origin[ 2 ] - lower_struct.origin[ 2 ];
// move the brushes up the start height
foreach ( brush in brushes )
{
brush.start_origin = brush.origin;
brush.origin += ( 0, 0, start_height );
if ( brush.origin[ 2 ] > top_struct.origin[ 2 ] )
brush hide_notsolid();
}
flag_wait( "pull_garage" );
thread play_sound_in_space( "scn_roadkill_garage_close", brushes[ 0 ].origin );
level delayThread( 0.95, ::send_notify, "stop_pulling" );
origins = [];
origins[ origins.size ] = ( 0, 0, 420.637 );
origins[ origins.size ] = ( 0, 0, 420.62 );
origins[ origins.size ] = ( 0, 0, 419.686 );
origins[ origins.size ] = ( 0, 0, 418.499 );
origins[ origins.size ] = ( 0, 0, 415.63 );
origins[ origins.size ] = ( 0, 0, 413.791 );
origins[ origins.size ] = ( 0, 0, 412.708 );
origins[ origins.size ] = ( 0, 0, 411.595 );
origins[ origins.size ] = ( 0, 0, 411.204 );
origins[ origins.size ] = ( 0, 0, 410.838 );
origins[ origins.size ] = ( 0, 0, 411.314 );
origins[ origins.size ] = ( 0, 0, 411.756 );
origins[ origins.size ] = ( 0, 0, 412.38 );
origins[ origins.size ] = ( 0, 0, 412.633 );
origins[ origins.size ] = ( 0, 0, 409.838 );
origins[ origins.size ] = ( 0, 0, 401.405 );
origins[ origins.size ] = ( 0, 0, 388.418 );
// origins[ origins.size ] = ( 0, 0, 369.622 );
// origins[ origins.size ] = ( 0, 0, 369.832 );
// origins[ origins.size ] = ( 0, 0, 369.826 );
thread garage_brushes_move( brushes, lower_struct, origins );
for ( ;; )
{
if ( !brushes.size )
break;
foreach ( index, brush in brushes )
{
if ( brush.origin[ 2 ] < top_struct.origin[ 2 ] )
{
brush show_solid();
brushes[ index ] = undefined;
}
}
wait( 0.05 );
}
}
garage_brushes_move( brushes, lower_struct, origins )
{
level endon( "stop_pulling" );
PrintLn( " origins = [];" );
index = 0;
for ( ;; )
{
//hand_org = level.garage_puller GetTagOrigin( "tag_inhand" );
hand_org = origins[ index ];
index++;
//println( " origins[ origins.size ] = ( 0, 0, " + hand_org[ 2 ] + " );" );
difference = hand_org[ 2 ] - lower_struct.origin[ 2 ];
foreach ( brush in brushes )
{
brush MoveTo( brush.start_origin + ( 0, 0, difference ), 0.1, 0, 0 );
}
if ( index >= origins.size )
break;
wait( 0.05 );
}
foreach ( brush in brushes )
{
brush MoveTo( brush.start_origin, 0.2, 0.1, 0.1 );
}
}
street_runner_scene()
{
flag_wait( "start_runner" );
struct = getstruct( "street_runner_scene", "targetname" );
spawner = GetEnt( struct.target, "targetname" );
guy = spawner spawn_ai();
if ( spawn_failed( guy ) )
return;
guy.animname = "street_runner";
animation = guy getanim( "scene" );
struct thread anim_custom_animmode_solo( guy, "gravity", "scene" );
wait( 0.05 );
guy SetAnimTime( animation, 0.18 );
guy endon( "death" );
guy.allowPain = true;
guy.allowdeath = true;
guy add_damage_function( ::player_fails_if_he_kills_me );
for ( ;; )
{
if ( guy GetAnimTime( animation ) > 0.95 )
break;
wait( 0.05 );
}
goalnode = GetNode( guy.target, "targetname" );
guy SetGoalNode( goalnode );
guy.goalradius = 8;
guy waittill( "goal" );
guy Delete();
}
roof_backup_scene()
{
flag_wait( "start_runner" );
wait( 4 );
struct = getstruct( "roof_backup_scene", "targetname" );
spawner = GetEnt( struct.target, "targetname" );
guy = spawner spawn_ai();
if ( spawn_failed( guy ) )
return;
guy.animname = "roof_backup";
animation = guy getanim( "scene" );
struct thread anim_single_solo( guy, "scene" );
wait( 0.05 );
guy SetAnimTime( animation, 0.2 );
guy endon( "death" );
guy.allowPain = true;
guy.allowdeath = true;
for ( ;; )
{
if ( guy GetAnimTime( animation ) > 0.59 )
break;
wait( 0.05 );
}
guy Delete();
}
civ_balcony()
{
flag_wait( "start_balcony" );
door = GetEnt( "civ_run_door", "targetname" );
trigger = GetEnt( "civ_door_trigger", "targetname" );
spawner = GetEnt( "civ_balcony_spawner", "targetname" );
struct = getstruct( "civ_balcony_physics", "targetname" );
// wait( 10.00 );
// open the door
door ConnectPaths();
//door NotSolid();
door RotateYaw( -90, 1, 0.5, 0.5 );
guy = spawner spawn_ai();
if ( spawn_failed( guy ) )
return;
node = GetNode( guy.target, "targetname" );
startpos = guy.origin;
guy endon( "death" );
guy waittill( "goal" );
guy.goalradius = 8;
wait( 0.35 );
// knock the cans off the balcony
forward = AnglesToForward( struct.angles );
vec = forward * 0.15;
PhysicsJolt( struct.origin, 32, 32, vec );
wait( 1.8 );
guy SetGoalPos( startpos );
// wait until he runs back inside
trigger waittill( "trigger" );
// time to close the door behind him
door RotateYaw( 90, 1, 0.5, 0.5 );
wait( 0.4 );
play_sound_in_space( "scn_doorpeek_door_slam", door.origin );
}
grenade_barrage_if_you_delay()
{
// the time before you get grenades on you
time = 10;
frames = time * 20;
count = 0;
structs = getstructarray( "grenade_dismount_spawner", "targetname" );
structs = array_randomize( structs );
index = 0;
wait_times = [];
wait_times[ 0 ] = 3.2;
wait_times[ 1 ] = 1.8;
wait_times[ 2 ] = 0.5;
wait_times[ 3 ] = 3.7;
wait_times[ 4 ] = 1.3;
wait_index = 0;
for ( ;; )
{
if ( flag( "player_inside_ambush_house" ) )
{
if ( count > frames - 35 )
count = frames - 35;
}
else
{
count++;
}
if ( count >= frames )
{
struct = random( structs );
struct throw_grenade();
index++;
index %= structs.size;
wait( wait_times[ wait_index ] );
wait_index++;
wait_index %= wait_times.size;
}
wait( 0.05 );
}
}
dismount_enemy_spawner()
{
self SetThreatBiasGroup( "axis_dismount_attackers" );
self.dont_ride_kill = true;
}
throw_grenade()
{
target = getstruct( self.target, "targetname" );
time = RandomFloatRange( 3, 5 );
MagicGrenade( "fraggrenade", self.origin, target.origin, time );
}
modify_dismount_spawner_threatbias()
{
for ( ;; )
{
flag_wait( "player_inside_ambush_house" );
SetIgnoreMeGroup( "axis_dismount_attackers", "ally_with_player" );
SetIgnoreMeGroup( "ally_with_player", "axis_dismount_attackers" );
flag_waitopen( "player_inside_ambush_house" );
SetThreatBias( "axis_dismount_attackers", "ally_with_player", 0 );
SetThreatBias( "ally_with_player", "axis_dismount_attackers", 0 );
}
}
handle_player_exposing_himself_in_front_of_school()
{
flag_wait( "player_exposes_on_street" );
level.player SetThreatBiasGroup( "allies" );
thread player_dies_if_he_goes_too_far();
for ( ;; )
{
flag_wait( "player_exposes_on_street" );
set_player_attacker_accuracy( 1000 );
level.player.noPlayerInvul = true;
level.player.threatbias = 50000;
level.player EnableHealthShield( false );
flag_waitopen( "player_exposes_on_street" );
maps\_gameskill::updateAllDifficulty();
level.player.noPlayerInvul = undefined;
level.player.threatbias = 150;
level.player EnableHealthShield( true );
}
}
player_dies_if_he_goes_too_far()
{
flag_clear( "player_dies_on_street" );
flag_wait( "player_dies_on_street" );
for ( ;; )
{
ai = GetAIArray( "axis" );
guy = random( ai );
origin = ( 0, 0, 0 );
attacker = level.player;
if ( IsAlive( guy ) )
{
origin = guy GetEye();
attacker = guy;
}
level.player DoDamage( 25, origin );
delay = RandomFloatRange( 0.1, 0.3 );
wait( delay );
}
}
handle_start_points_for_detour_humvee()
{
switch( level.start_point )
{
case "default":
case "intro":
case "riverbank":
case "move_out":
case "convoy":
case "ride":
case "ambush":
return;
}
ride_vehicle_spawners = GetEntArray( "ride_vehicle_spawner", "targetname" );
foreach ( spawner in ride_vehicle_spawners )
{
if ( spawner.script_index == 3 )
spawner Delete();
}
}
player_gets_max_health_for_dismount()
{
level.player endon( "death" );
time = 4;
frames = time * 20;
for ( i = 0; i < frames; i++ )
{
level.player.health = level.player.maxhealth;
wait( 0.05 );
}
}
intro_shepherd()
{
shepherd_roamer_spawner = GetEnt( "shepherd_roamer_spawner", "targetname" );
shepherd_roamer_spawner add_spawn_function( ::intro_shepherd_think );
shepherd_roamer_spawner spawn_ai();
}
intro_shepherd_think()
{
thread shepherd_roams_battlefield( self.target );
}
player_shepherd_fov()
{
start_time = gettime();
wait_for_buffer_time_to_pass( start_time, 7.0 );
ent = spawn_tag_origin(); // fov_ent fovent
ent.origin = (65,0,0);
ent thread manage_fov();
time = 0.5;
level.player LerpViewAngleClamp( time, time, 0, 0,0,0,0 );
//ent MoveTo( (40,0,0), time, time, 0 );
wait_for_buffer_time_to_pass( start_time, 9.4 );
//ent MoveTo( (65,0,0), time, time * 0.5, time * 0.5 );
wait time;
ent delete();
}
manage_fov()
{
self endon( "death" );
for ( ;; )
{
setsaveddvar( "cg_fov", self.origin[0] );
wait 0.05;
}
}
shepherd_roams_battlefield( target )
{
level.player allowprone( false );
level.player allowcrouch( false );
self endon( "death" );
self.animname = "shepherd";
self.ignoreall = true;
self.disablearrivals = true;
self.disableexits = true;
self.grenadeawareness = 0;
self disable_bulletwhizbyreaction();
self set_run_anim( "angry_walk" );
self gun_remove();
lookent = getent( "shepherd_lookat_target", "targetname" );
//self SetLookAtEntity( lookent );
gun = spawn_anim_model( "gun_model" );
//gun LinkTo( self, "tag_weapon_right", (0,0,0), (0,0,0) );
player_rig = spawn_anim_model( "player_rig" );
guys = [];
guys[ "shepherd" ] = self;
guys[ "gun" ] = gun;
guys[ "player_rig" ] = player_rig;
scene = "player_shep_intro";
animation = player_rig getanim( scene );
time = getanimlength( animation );
mortar_org = getstruct( "mortar_org", "targetname" );
delayThread( time - 1.6, ::roadkill_mortar_goes_off, mortar_org );
level.player delayThread( time - 0.2, maps\_gameskill::grenade_dirt_on_screen, "right" );
arc = 15;
level.player PlayerLinkToDelta( player_rig, "tag_player", 1, arc, arc, arc, arc, 1 );
thread player_shepherd_fov();
struct = getstruct( "shepherd_get_in_fight", "targetname" );
struct thread anim_single( guys, scene );
//delaythread( 0, ::play_sound_on_entity, "roadkill_shp_ontheline" );
//level.player LerpViewAngleClamp( 1, 0.5, 0.5, 0,0,0,0 );
struct waittill ( scene );
level.player unlink();
level.player allowprone( true );
level.player allowcrouch( true );
player_rig delete();
gun delete();
flag_set( "get_on_the_line" );
node = getnode( "shepherd_dest_node", "targetname" );
self setgoalnode( node );
self.goalradius = 8;
flag_wait( "shepherd_leaves" );
self stop_magic_bullet_shield();
thread shepherd_bridge_scene( self );
}
shepdamage_bullet_thread()
{
self endon( "death" );
for ( ;; )
{
self waittill( "bullethit", other );
if ( other == level.player )
{
// Friendly fire will not be tolerated!
SetDvar( "ui_deadquote", &"SCRIPT_MISSIONFAIL_KILLTEAM_AMERICAN" ); // friendly fire will not be tolerated
missionfailedwrapper();
}
}
}
shepdamage_damage_thread()
{
self endon( "death" );
for ( ;; )
{
self waittill( "damage", dmg, attacker, one, two, weapType );
if ( !isalive( attacker ) )
continue;
if ( attacker == level.player )
{
// Friendly fire will not be tolerated!
SetDvar( "ui_deadquote", &"SCRIPT_MISSIONFAIL_KILLTEAM_AMERICAN" ); // friendly fire will not be tolerated
missionfailedwrapper();
}
}
}
shepherd_bridge_scene( shepherd )
{
shepherd gun_remove();
shepherd = maps\_vehicle_aianim::convert_guy_to_drone( shepherd ); //turning him into a drone at this point. not up for fighting with the boatride script
shepherd.script = "empty_script";
shepherd.dontdonotetracks = true;
shepherd setcandamage( true );
shepherd.health = 5000;
shepherd thread shepdamage_bullet_thread();
shepherd thread shepdamage_damage_thread();
shepherd hide();
shepherd.animname = "shepherd";
shepherd Attach( "com_hand_radio", "tag_inhand" );
struct = getstruct( "shepherd_new_wander_struct", "targetname" );
ent = spawn_tag_origin();
start_org = struct.origin + (-200,0,0);
ent.origin = start_org;
ent.angles = struct.angles;
ent anim_first_frame_solo( shepherd, "angry_wander" );
wait 0.05;
shepherd linkto( ent );
wait 4;
shepherd show();
// ent thread anim_custom_animmode_solo( shepherd, "gravity", "angry_wander" );
ent thread anim_single_solo( shepherd, "angry_wander" );
time = 8;
ent moveto( struct.origin, time, 0, time );
wait time;
// shepherd unlink();
//flag_wait( "time_to_go" );
shepherd wait_until_time_to_shepout();
time = 5;
// shepherd linkto( ent );
ent moveto( start_org, time, time, 0 );
wait time;
shepherd delete();
}
wait_until_time_to_shepout()
{
level endon( "player_starts_stairs" );
animation = getanim( "angry_wander" );
for ( ;; )
{
animtime = self getanimtime( animation );
if ( animtime > 0.80 )
break;
wait 0.05;
}
}
stair_wave_spawner()
{
self endon( "death" );
self.animname = "shepherd";
self Attach( "com_hand_radio", "tag_inhand" );
self hide();
self gun_remove();
struct = getstruct( "shepherd_wander_struct", "targetname" );
struct anim_first_frame_solo( self, "stair_wave" );
wait 0.05; // for anim to take effect
eye = self geteye();
//Print3d( eye, "x", (1,0,0), 1, 2, 5000 );
see_spawn = level.player can_see_origin( eye, false );
within_dist = distance( level.player.origin, self.origin ) < 400;
if ( see_spawn || within_dist )
{
waittillframeend;
self safe_delete();
return;
}
self show();
// struct anim_single_solo( self, "stair_approach" );
struct thread anim_loop_solo( self, "stair_idle" );
for ( ;; )
{
if ( distance( level.player.origin, self.origin ) < 350 )
break;
wait( 0.05 );
}
struct notify( "stop_loop" );
struct anim_single_solo( self, "stair_wave" );
struct thread anim_loop_solo( self, "stair_idle" );
flag_wait( "player_gets_in" );
self safe_delete();
}
wander_battlefield_until_time_to_stop( target )
{
if ( flag( "bridgelayer_complete" ) )
return;
level endon( "bridgelayer_complete" );
first_target = target;
for ( ;; )
{
if ( !isdefined( target ) )
target = first_target;
struct = getstruct( target, "targetname" );
if ( IsDefined( struct.script_delay ) )
{
struct anim_reach_solo( self, "idle_reach" );
struct thread anim_loop_solo( self, "idle" );
wait( struct.script_delay );
struct notify( "stop_loop" );
self anim_stopanimscripted();
}
else
{
self SetGoalPos( struct.origin );
self.goalradius = struct.radius;
self waittill( "goal" );
}
target = struct.target;
}
}
intro_runner_path_breaker()
{
brush = GetEnt( "intro_runner_path_breaker", "targetname" );
brush DisconnectPaths();
brush NotSolid();
wait( 5 );
brush Solid();
brush ConnectPaths();
brush Delete();
}
school_unreachable_spawner()
{
self endon( "death" );
flag_wait( "roadkill_school_14" );
self Delete();
}
ambusher_spawner()
{
level.ambusher = self;
self.ignoreall = true;
self.ignoreme = true;
flag_wait( "ambush_spawner_angry" );
self.ignoreme = false;
if ( IsAlive( self ) )
{
self.threatbias = 50000;
self.ignoreall = false;
//self.ignoreme = true;
link = GetEnt( self.script_linkto, "script_linkname" );
self SetEntityTarget( link );
wait( 3 );
self ClearEntityTarget();
}
if ( IsAlive( self ) )
{
self waittill( "death" );
// yay ignoreme after death!
wait( 2 );
if ( IsDefined( self ) )
self.ignoreme = true;
}
}
ignore_until_attack()
{
self endon( "death" );
self.ignoreme = true;
self waittill( "shooting" );
wait( 0.5 );
self.ignoreme = false;
}
trapper_spawner()
{
// so other friendly doesn't crossfire
self endon( "death" );
flag_wait( "trapper_spawners_ignoreme" );
self.ignoreme = true;
}
trapper_killer_trigger()
{
trigger = GetEnt( "trapper_killer_trigger", "targetname" );
for ( ;; )
{
trigger waittill( "trigger", other );
other Delete();
}
}
no_grenades()
{
self.grenadeammo = 0;
}
gaz_balcony_guys()
{
run_thread_on_targetname( "gaz_balcony", ::gaz_balcony );
}
gaz_balcony()
{
spawner = GetEnt( self.target, "targetname" );
spawner.script_drone_override = true;
spawner add_spawn_function( ::gaz_balcony_think, self );
spawner spawn_ai();
}
gaz_balcony_think( struct )
{
self endon( "death" );
self SetLookAtEntity( level.player );
self gun_remove();
self.allowdeath = true;
self.health = 1;
self.ignoreall = true;
self.ignoreSuppression = true;
// self.ignoreme = true;
self.custom_scene = struct.animation;
self.price_idle = struct.animation == "killhouse_sas_price_idle";
self.first_scene = "killhouse_gaz_idleB";
if ( self.price_idle )
self.first_scene = "killhouse_sas_price_idle";
if ( self.custom_scene == "killhouse_gaz_idleB" )
{
// offset anim
wait( 2.5 );
}
else
{
wait( RandomFloat( 1.5 ) );
}
struct thread anim_generic_loop( self, self.first_scene );
flag_wait( "garage_door_scene" );
//wait( 3 );
idle_until_tired_of_idling_or_shot_at( struct );
timer = RandomFloat( 0.65 );
wait( timer );
struct notify( "stop_loop" );
self anim_stopanimscripted();
self waittill( "goal" );
wait( 90 );
self Delete();
}
idle_until_tired_of_idling_or_shot_at( struct )
{
self endon( "bulletwhizby" );
if ( !self.price_idle )
{
struct notify( "stop_loop" );
struct anim_generic( self, self.custom_scene + "_solo" );
struct anim_generic( self, self.custom_scene + "_solo" );
struct thread anim_generic_loop( self, self.first_scene );
}
wait( 60 );
}
player_vehicle_catches_up()
{
flag_wait( "start_runner" );
for ( ;; )
{
if ( Distance( level.crazy_ride_convoy[ "player" ].origin, level.crazy_ride_convoy[ "detour" ].origin ) <= 320 )
break;
wait( 0.05 );
}
flag_set( "player_closes_gap" );
}
slow_down_to_speed_when_you_get_dist_from_ent( speed, ent, dist )
{
for ( ;; )
{
if ( Distance( self.origin, ent.origin ) <= dist )
{
self Vehicle_SetSpeed( speed, 5, 5 );
break;
}
wait( 0.05 );
}
}
riverbank_mg()
{
self Delete();
/*
self SetMode( "manual" );
self SetTargetEntity( level.player );
for ( ;; )
{
bursts = RandomIntRange( 4, 7 );
for ( i = 0; i < bursts; i++ )
{
self StartFiring();
burst_time = RandomFloatRange( 0.5, 1 );
wait( burst_time );
self StopFiring();
timeout_time = RandomFloatRange( 0.2, 0.8 );
wait( timeout_time );
}
timeout_time = RandomFloatRange( 1.0, 1.5 );
wait( timeout_time );
}
*/
}
radio_dialogue_generic( alias )
{
if ( !isdefined( level.scr_radio[ alias ] ) )
{
level.scr_radio[ alias ] = level.scr_sound[ "generic" ][ alias ];
}
radio_dialogue( alias );
}
ahead_line( alias )
{
play_line_at_offset_on_player_vehicle( alias, ( 0, 2500, 0 ) );
}
way_ahead_line( alias )
{
play_line_at_offset_on_player_vehicle( alias, ( 0, 4000, 0 ) );
}
shot_fired_trigger()
{
self waittill( "trigger" );
struct_end = getstruct( self.target, "targetname" );
struct_start = getstruct( struct_end.target, "targetname" );
end = struct_end.origin;
original_end = end;
start = struct_start.origin;
angles = VectorToAngles( start - end );
forward = AnglesToForward( angles );
dist = Distance( end, start );
end += forward * -1000;
flag_set( "shot_rings_out" );
// Print3d( start, "bullet", (1,0,0), 1, 2, 1000 );
//Print3d( start, "sound", (0,1,0.5), 1, 2, 1000 );
thread play_sound_in_space( "weap_dragunovsniper_fire_npc", start );
units_per_second = 9000;
time = dist / units_per_second;
wait( time * 0.6 );
thread play_sound_in_space( "whizby_triggered", end );
wait( time * 0.4 );
// Line( start, original_end, (0.5,0.5,0), 1, 1, 1000 );
//MagicBullet( "scripted_silent", start, end );
trace = BulletTrace( start, end, true, undefined );
pos = trace[ "position" ];
fx = getfx( "car_dirt" );
sound = "concrete";
if ( trace[ "surfacetype" ] != "concrete" )
{
fx = getfx( "car_spark" );
sound = "metal";
}
PlayFX( fx, pos, forward );
PlayFX( fx, pos, forward );
brick_sounds = [];
brick_sounds[ brick_sounds.size ] = "ride_bullet_brick_1";
brick_sounds[ brick_sounds.size ] = "ride_bullet_brick_2";
metal_sounds = [];
metal_sounds[ metal_sounds.size ] = "ride_bullet_metal_1";
metal_sounds[ metal_sounds.size ] = "ride_bullet_metal_3";
metal_sounds[ metal_sounds.size ] = "ride_bullet_metal_2";
metal_sounds[ metal_sounds.size ] = "ride_bullet_metal_4";
metal_sounds[ metal_sounds.size ] = "ride_bullet_metal_5";
sounds = [];
sounds[ "concrete" ] = brick_sounds;
sounds[ "metal" ] = metal_sounds;
if ( !isdefined( level.magic_sound_index ) )
level.magic_sound_index = [];
if ( !isdefined( level.magic_sound_index[ sound ] ) )
{
level.magic_sound_index[ sound ] = 0;
}
index = level.magic_sound_index[ sound ];
alias = sounds[ sound ][ index ];
thread play_sound_in_space( alias, pos, true );
level.magic_sound_index[ sound ]++;
level.magic_sound_index[ sound ] %= sounds[ sound ].size;
wait( 1.2 );
// Shot. Nine o'clock. Three hundred twenty six meters.
//thread passenger_line( "roadkill_bmr_9_326" );
// Line( start, end, (1,0,0), 1, 1, 1000 );
// Print3d( trace[ "position" ], "HIT", (1,0,0), 1, 2, 1000 );
}
rpg_ambush_spawner()
{
// self.ignoreall = true;
self SetEntityTarget( level.crazy_ride_convoy[ "detour" ] );
self.interval = 0;
if ( !isdefined( self.script_delay ) )
return;
self SetGoalPos( self.origin );
script_delay();
self maps\_spawner::go_to_node();
}
hydrant_hit()
{
hydrant_struct = getstruct( "hydrant_struct", "targetname" );
RadiusDamage( hydrant_struct.origin, hydrant_struct.radius, 5000, 5000, level.player );
}
technical_pushed_animation()
{
technical = level.traffic_jam_truck;
technical.animname = "technical";
struct = SpawnStruct();
struct.origin = ( 0, 0, 0 );
struct.angles = ( 0, 0, 0 );
struct thread anim_single_solo( technical, "technical_pushed" );
wait( 0.05 );
animation = technical getanim( "technical_pushed" );
technical SetAnim( animation, 1, 0, 1.07 );
}
roadkill_gameskill_ride_settings()
{
// RIGHT NOW ONLY .25 AND .75 ARE USED for easy and normal
level.difficultySettings[ "threatbias" ][ "easy" ] = 0;
level.difficultySettings[ "threatbias" ][ "normal" ] = 0;
level.difficultySettings[ "threatbias" ][ "hardened" ] = 0;
level.difficultySettings[ "threatbias" ][ "veteran" ] = 0;
level.difficultySettings[ "base_enemy_accuracy" ][ "easy" ] = 1.0;
level.difficultySettings[ "base_enemy_accuracy" ][ "normal" ] = 1.0;
level.difficultySettings[ "base_enemy_accuracy" ][ "hardened" ] = 1.0;
level.difficultySettings[ "base_enemy_accuracy" ][ "veteran" ] = 1.0;
// lower numbers = higher accuracy for AI at a distance
level.difficultySettings[ "accuracyDistScale" ][ "easy" ] = 1.0;
level.difficultySettings[ "accuracyDistScale" ][ "normal" ] = 1.0;
level.difficultySettings[ "accuracyDistScale" ][ "hardened" ] = 1.0;
level.difficultySettings[ "accuracyDistScale" ][ "veteran" ] = 1.0; // too many other things make it more difficult
level.difficultySettings[ "pain_test" ][ "easy" ] = maps\_gameskill::always_pain;
level.difficultySettings[ "pain_test" ][ "normal" ] = maps\_gameskill::always_pain;
level.difficultySettings[ "pain_test" ][ "hardened" ] = maps\_gameskill::always_pain;
level.difficultySettings[ "pain_test" ][ "veteran" ] = maps\_gameskill::always_pain;
// Death Invulnerable Time controls how long the player is death-proof after going into red flashing
// This protection resets after the player recovers full health.
level.difficultySettings[ "player_deathInvulnerableTime" ][ "easy" ] = 7000;
level.difficultySettings[ "player_deathInvulnerableTime" ][ "normal" ] = 4000;
level.difficultySettings[ "player_deathInvulnerableTime" ][ "hardened" ] = 3000;
level.difficultySettings[ "player_deathInvulnerableTime" ][ "veteran" ] = 3000;
// level.invulTime_preShield: time player is invulnerable when hit before their health is low enough for a red overlay( should be very short )
level.difficultySettings[ "invulTime_preShield" ][ "easy" ] = 0.0;
level.difficultySettings[ "invulTime_preShield" ][ "normal" ] = 0.0;
level.difficultySettings[ "invulTime_preShield" ][ "hardened" ] = 0.0;
level.difficultySettings[ "invulTime_preShield" ][ "veteran" ] = 0.0;
// level.invulTime_onShield: time player is invulnerable when hit the first time they get a red health overlay( should be reasonably long )
// should not be more than or too much lower than player_deathInvulnerableTime
level.difficultySettings[ "invulTime_onShield" ][ "easy" ] = 0.5;
level.difficultySettings[ "invulTime_onShield" ][ "normal" ] = 0.5;
level.difficultySettings[ "invulTime_onShield" ][ "hardened" ] = 0.5;
level.difficultySettings[ "invulTime_onShield" ][ "veteran" ] = 0.5;
// level.invulTime_postShield: time player is invulnerable when hit after the red health overlay is already up( should be short )
level.difficultySettings[ "invulTime_postShield" ][ "easy" ] = 0.3;
level.difficultySettings[ "invulTime_postShield" ][ "normal" ] = 0.3;
level.difficultySettings[ "invulTime_postShield" ][ "hardened" ] = 0.3;
level.difficultySettings[ "invulTime_postShield" ][ "veteran" ] = 0.3;
// level.playerHealth_RegularRegenDelay
// The delay before you regen health after getting hurt
level.difficultySettings[ "playerHealth_RegularRegenDelay" ][ "easy" ] = 500;
level.difficultySettings[ "playerHealth_RegularRegenDelay" ][ "normal" ] = 500;
level.difficultySettings[ "playerHealth_RegularRegenDelay" ][ "hardened" ] = 500;
level.difficultySettings[ "playerHealth_RegularRegenDelay" ][ "veteran" ] = 500;
// level.worthyDamageRatio( player must recieve this much damage as a fraction of maxhealth to get invulTime_PREshield. )
level.difficultySettings[ "worthyDamageRatio" ][ "easy" ] = 0.2;
level.difficultySettings[ "worthyDamageRatio" ][ "normal" ] = 0.2;
level.difficultySettings[ "worthyDamageRatio" ][ "hardened" ] = 0.2;
level.difficultySettings[ "worthyDamageRatio" ][ "veteran" ] = 0.2;
// self.gs.regenRate
// the rate you regen health once it starts to regen
level.difficultySettings[ "health_regenRate" ][ "easy" ] = 0.2;
level.difficultySettings[ "health_regenRate" ][ "normal" ] = 0.2;
level.difficultySettings[ "health_regenRate" ][ "hardened" ] = 0.2;
level.difficultySettings[ "health_regenRate" ][ "veteran" ] = 0.2;
// level.playerDifficultyHealth
// the amount of health you have in this difficulty
level.difficultySettings[ "playerDifficultyHealth" ][ "easy" ] = 20;
level.difficultySettings[ "playerDifficultyHealth" ][ "normal" ] = 20;
level.difficultySettings[ "playerDifficultyHealth" ][ "hardened" ] = 20;
level.difficultySettings[ "playerDifficultyHealth" ][ "veteran" ] = 20;
// If you go to red flashing, the amount of time before your health regens
level.difficultySettings[ "longRegenTime" ][ "easy" ] = 500;
level.difficultySettings[ "longRegenTime" ][ "normal" ] = 500;
level.difficultySettings[ "longRegenTime" ][ "hardened" ] = 500;
level.difficultySettings[ "longRegenTime" ][ "veteran" ] = 500;
// level.healthOverlayCutoff
level.difficultySettings[ "healthOverlayCutoff" ][ "easy" ] = 0.02;
level.difficultySettings[ "healthOverlayCutoff" ][ "normal" ] = 0.02;
level.difficultySettings[ "healthOverlayCutoff" ][ "hardened" ] = 0.02;
level.difficultySettings[ "healthOverlayCutoff" ][ "veteran" ] = 0.02;
}
trigger_delete_axis_not_in_volume()
{
self waittill( "trigger" );
volume = GetEnt( self.target, "targetname" );
ai = GetAIArray( "axis" );
count = 0;
total = ai.size;
foreach ( guy in ai )
{
if ( guy IsTouching( volume ) )
continue;
guy Delete();
count++;
}
//IPrintLnBold( "Deleted " + count + " out of " + total + " axis." );
}
balcony_check()
{
if ( !isdefined( self.script_balcony ) )
return;
self.a.disableLongDeath = true;// no long death on these guys
AssertEx( self.script_balcony, "Cant be < 1" );
self.deathFunction = ::try_balcony_death;
}
try_balcony_death()
{
// always return false in this function because we want the death
// animscript to continue after this function no matter what
if ( !isdefined( self ) )
return false;
if ( self.a.pose != "stand" )
return false;
if ( IsDefined( self.prevnode ) )
{
angleAI = self.angles[ 1 ];
angleNode = self.prevnode.angles[ 1 ];
angleDiff = abs( angleAI - angleNode );
if ( angleDiff > 80 )
return false;
d = Distance( self.origin, self.prevnode.origin );
if ( d > 92 )
return false;
}
if ( !isdefined( level.last_balcony_death ) )
level.last_balcony_death = GetTime();
elapsedTime = GetTime() - level.last_balcony_death;
// if one just happened within 3 seconds dont do it
if ( elapsedTime < 3 * 1000 )
return false;
deathAnims = getGenericAnim( "balcony_death" );
self.deathanim = deathAnims[ RandomInt( deathAnims.size ) ];
return false;
}
enemy_playground_spawner()
{
level.enemy_playground_enemies[ level.enemy_playground_enemies.size ] = self;
level endon( "playground_baddies_retreat" );
self.attackeraccuracy = 0;
self.IgnoreRandomBulletDamage = true;
thread enemy_playground_guy_retreats();
self waittill( "damage" );
flag_set( "playground_baddies_retreat" );
}
enemy_playground_guy_retreats()
{
self endon( "death" );
flag_wait( "playground_baddies_retreat" );
volume = GetEnt( "lower_school_flee_volume", "targetname" );
timer = RandomFloat( 2 );
wait( timer );
self SetGoalVolumeAuto( volume );
self waittill( "goal" );
self.attackeraccuracy = 1;
self.IgnoreRandomBulletDamage = false;
}
player_becomes_normal_gameskill()
{
wait( 8.85 );
// reset attackeraccuracy
level.player maps\_gameskill::resetSkill();
level.player recover_random_bullet_damage();
// get hurt like normal again
level.player clear_custom_gameskill_func();
setsaveddvar( "player_radiusdamagemultiplier", "1.0" );
}
recover_random_bullet_damage()
{
level.player.IgnoreRandomBulletDamage = false;
}
wait_for_chance_to_charge_school()
{
volume = GetEnt( "safe_to_charge_school_volume", "targetname" );
num = 1;
for ( ;; )
{
ai = GetAIArray( "axis" );
count = 0;
too_many = false;
foreach ( guy in level.enemy_playground_enemies )
{
if ( !isalive( guy ) )
continue;
if ( guy IsTouching( volume ) )
{
count++;
if ( count > num )
{
too_many = true;
break;
}
}
}
if ( !too_many )
return;
wait( 0.05 );
}
}
ending_takeoff_heli_spawner()
{
struct = getstruct( "heli_linkup_struct", "script_noteworthy" );
self set_stage( struct, level.heli_guy_left, "left" );
self set_stage( struct, level.heli_guy_right, "right" );
flag_wait( "start_shepherd_end" );
self thread load_side( "left", level.heli_guy_left );
self thread load_side( "right", level.heli_guy_right );
wait( 8 );
flag_wait( "heli_takes_off" );
heli_fly_node = getstruct( "heli_fly_node", "targetname" );
self vehicle_paths( heli_fly_node );
}
heli_spawner_left()
{
self.goalradius = 8;
level.heli_guy_left[ level.heli_guy_left.size ] = self;
}
heli_spawner_right()
{
self.goalradius = 8;
level.heli_guy_right[ level.heli_guy_right.size ] = self;
}
link_heli_to_landing()
{
linker = getstruct( "heli_linkup_struct", "script_noteworthy" );
targ = getstruct( "gag_stage_littlebird_unload", "script_noteworthy" );
linker.target = targ.targetname;
}
fail_for_civ_kill()
{
add_damage_function( ::civ_hit );
}
civ_hit( amt, attacker, force, b, c, d, e )
{
if ( !isalive( attacker ) )
return;
if ( attacker != level.player )
return;
wait( 1.5 );
// You are not authorized to fire on unarmed targets.
SetDvar( "ui_deadquote", &"ROADKILL_SHOT_UNARMED" );
missionFailedWrapper();
}
player_get_in_reminder()
{
if ( flag( "player_gets_in" ) )
return;
level endon( "player_gets_in" );
wait( 4 );
lines = [];
// Come on Brodsky, get in!
lines[ lines.size ] = "roadkill_fly_comeongetin";
// Brodsky, get in your humvee, you're holding up the line!
lines[ lines.size ] = "roadkill_fly_holdingupline";
// Hurry up Private!
lines[ lines.size ] = "roadkill_fly_hurryup";
// Brodsky, move your ass, let's go!
lines[ lines.size ] = "roadkill_fly_moveletsgo";
index = 0;
for ( ;; )
{
timer = RandomFloatRange( 5, 9 );
wait( timer );
msg = lines[ index ];
index++;
index %= lines.size;
foley_line( msg );
}
}
baddies_on_building_get_your_attention()
{
array_spawn_function_targetname( "enemy_rooftop_spawner", ::enemy_rooftop_spawner );
array_spawn_targetname( "enemy_rooftop_spawner" );
}
enemy_rooftop_spawner()
{
self endon( "death" );
startpos = self.origin;
self.ignoreall = true;
self.ignoreme = true;
self.health = 10000;
spy_on_convoy();
self SetGoalPos( startpos );
self waittill( "goal" );
self Delete();
}
spy_on_convoy()
{
flag_assert( "video_tapers_react" );
level endon( "video_tapers_react" );
level endon( "spy_baddies_flee" );
thread flee_if_noticed_by_player();
self SetGoalPos( self.origin );
self.goalradius = 16;
timer = RandomFloat( 3 );
wait( timer );
node = GetNode( self.target, "targetname" );
self SetGoalNode( node );
self waittill( "goal" );
nodes = getstructarray( "spy_node", "script_noteworthy" );
for ( ;; )
{
timer = RandomFloat( 0.8 );
wait( timer );
node = random( nodes );
self SetGoalPos( node.origin );
self waittill( "goal" );
}
}
flee_if_noticed_by_player()
{
level endon( "spy_baddies_flee" );
add_wait( ::waittill_msg, "bulletwhizby" );
add_wait( ::waittill_msg, "death" );
add_wait( ::waittill_msg, "damage" );
do_wait_any();
level notify( "spy_baddies_flee" );
}
escape_block_spawner()
{
self magic_bullet_shield();
self SetGoalPos( self.origin );
self PushPlayer( true );
self.dontavoidplayer = true;
self.goalradius = 16;
flag_wait( "player_gets_in" );
self safe_delete();
}
learn_flash()
{
level.player.flash_ammo = level.player GetWeaponAmmoStock( "flash_grenade" );
foley_line( "roadkill_fly_getflashbang" );
// wait( 0.25 );
// wait_for_buffer_time_to_pass( start_time, 1.05 );
display_hint( "learn_flash" );
}
player_learned_flash()
{
flash_ammo = level.player GetWeaponAmmoStock( "flash_grenade" );
if ( flash_ammo <= 0 )
return true;
return level.player.flash_ammo > flash_ammo;
}
detect_room_was_flashed()
{
volume = GetEnt( "dismount_flash_volume", "targetname" );
flash = volume get_flash_touching();
for ( ;; )
{
if ( !isdefined( flash ) )
break;
wait( 0.05 );
}
flag_set( "room_was_flashed" );
}
get_flash_touching()
{
for ( ;; )
{
grenades = GetEntArray( "grenade", "classname" );
flashes = [];
foreach ( grenade in grenades )
{
if ( IsSubStr( grenade.model, "flash" ) )
{
flashes[ flashes.size ] = grenade;
}
}
foreach ( flash in flashes )
{
if ( flash IsTouching( self ) )
return flash;
}
wait( 0.05 );
}
}
blend_sm_sunsamplesizenear()
{
//SetSavedDvar( "sm_sunSampleSizeNear", "0.55" ); // so bridgelayer has shadows
// SetSavedDvar( "sm_sunSampleSizeNear", 2.0 );// coming from air
//// delayThread( 0.6, maps\_introscreen::ramp_out_sunsample_over_time, 1.4, 0.76 ); // blend to 0.55 sunsample over 1.4 seconds
// wait( 0.6 );
// maps\_introscreen::ramp_out_sunsample_over_time( 1.4, 0.25 );// blend to 0.55 sunsample over 1.4 seconds
SetSavedDvar( "sm_sunsamplesizenear", 0.33 );
flag_wait_or_timeout( "player_enters_riverbank", 9 );
maps\_introscreen::ramp_out_sunsample_over_time( 1, 0.76 );// blend to 0.55 sunsample over 1.4 seconds
}
riverbank_player_learns_m203()
{
if ( flag( "leaving_riverbank" ) )
return;
level endon ( "leaving_riverbank" );
level endon ( "bridge_layer_attacked_by_bridge_baddies" );
flag_wait( "player_enters_riverbank" );
wait( 20 );
if ( player_learned_m203() )
return;
// Allen! Switch to your M203!
foley_line( "roadkill_fly_yourM203" );
display_hint( "learn_m203" );
for ( ;; )
{
if ( player_learned_m203() )
break;
wait( 0.05 );
}
wait( 2 );
// Drop some rounds on 'em across the river!
foley_line( "roadkill_fly_acrossriver" );
}
player_learned_m203()
{
if ( flag( "leaving_riverbank" ) )
return true;
return level.player getcurrentweapon() == "m203_m4_eotech";
}
other_two_guys_say_huah()
{
lines = [];
lines[ 0 ] = "roadkill_ar1_huah";
lines[ 1 ] = "roadkill_ar2_huah2";
index = 0;
ai = getaiarray( "allies" );
foreach ( guy in ai )
{
if ( guy is_hero() )
continue;
msg = lines[ index ];
guy generic_dialogue_queue( msg );
index++;
if ( index >= lines.size )
return;
}
}
foley_gets_eyes_on_school_dialogue()
{
// Hunter 2-1 to Hunter 2-3, I have eyes on the school, over!
foley_line( "roadkill_fly_eyesonschool" );
delayThread( 2.6, ::flag_set, "friendlies_suppress_school" );
start_time = gettime();
// 2-1, we are combat ineffective here! We are taking heavy fire from the school, can you assist, over?!
radio_line( "roadkill_ar3_ineffective" );
wait_for_buffer_time_to_pass( start_time, 3.2 );
// Keep it together 2-3! We're on the way! 2-1 out!
foley_line( "roadkill_fly_keepittogether" );
if ( flag( "playground_baddies_retreat" ) )
return;
// Taaargeets, front of the school!! Take 'em out!!!
dunn_line( "roadkill_cpd_frontofschool" );
}
school_badguy_cleanup()
{
flag_wait( "roadkill_school_18" );
// delete all enemies at this point
ai = getaiarray( "axis" );
foreach ( guy in ai )
{
guy delete();
}
}
arab_line( msg )
{
level.arab_function_stack_struct function_stack( ::arab_line_proc, msg );
}
arab_line_proc( msg )
{
speakers = getstructarray( "arab_speaker", "targetname" );
nearest = getClosest( level.player.origin, speakers );
play_sound_in_space( msg, nearest.origin );
}
ending_fadeout_nextmission()
{
flag_wait( "start_shepherd_end" );
delayThread( 6, ::flag_set, "heli_takes_off" );
wait( 10 );
black_overlay = create_client_overlay( "black", 0, level.player );
black_overlay FadeOverTime( 2 );
black_overlay.alpha = 1;
wait( 2 );
nextmission();
}