// IW6 GSC SOURCE // Generated by https://github.com/xensik/gsc-tool birds() { if ( common_scripts\utility::issp() ) level waittill( "load_finished" ); else level waittill( "interactive_start" ); if ( !isdefined( level._interactive["birds_setup"] ) ) { level._interactive["birds_setup"] = 1; level._interactive["bird_perches"] = []; var_0 = getentarray( "interactive_birds", "targetname" ); foreach ( var_2 in var_0 ) var_2 thread birds_setup(); } } birds_setup() { birds_finishbirdtypesetup( level._interactive[self.interactive_type] ); birds_setupconnectedperches(); if ( isdefined( self.script_triggername ) ) { var_0 = birds_savetostruct(); level waittill( "start_" + self.script_triggername ); var_0 birds_loadfromstruct(); } else { birds_createents(); thread birds_fly( self.target ); } } birds_createents() { var_0 = level._interactive[self.interactive_type]; if ( !isdefined( self.interactive_number ) ) self.interactive_number = var_0.rig_numtags; self setmodel( var_0.rig_model ); if ( common_scripts\utility::issp() ) self call [[ level.func["useanimtree"] ]]( var_0.rig_animtree ); self hideallparts(); self.birds = []; self.birdexists = []; self.numbirds = 0; for ( var_1 = 1; var_1 <= self.interactive_number; var_1++ ) { self.birds[var_1] = spawn( "script_model", self gettagorigin( "tag_bird" + var_1 ) ); self.birds[var_1] setmodel( var_0.bird_model["idle"] ); self.birds[var_1] linkto( self, "tag_bird" + var_1 ); if ( common_scripts\utility::issp() ) self.birds[var_1] call [[ level.func["useanimtree"] ]]( var_0.bird_animtree ); var_2 = ( var_1 - randomfloat( 1 ) ) / self.interactive_number; self.birds[var_1] thread maps\interactive_models\_interactive_utility::wait_then_fn( var_2, "Stop initial model setup", ::bird_sit, self, "tag_bird" + var_1, var_0.bird_model["idle"], var_0.birdmodel_anims ); self.birdexists[var_1] = 1; self.numbirds++; if ( isdefined( var_0.bird_health ) ) self.birds[var_1].health = var_0.bird_health; else self.birds[var_1].health = 20; self.birds[var_1] setcandamage( 1 ); self.birds[var_1] thread bird_waitfordamage( self, var_1 ); } if ( isdefined( self.script_triggername ) ) thread birds_waitfortriggerstop(); } birds_setupconnectedperches( var_0, var_1 ) { if ( !isdefined( var_0 ) ) var_0 = getent( self.target, "targetname" ); var_2 = spawnstruct(); var_2.targetname = var_0.targetname; var_2.target = var_0.target; var_2.origin = var_0.origin; var_2.angles = var_0.angles; var_2.interactive_takeoffanim = var_0.interactive_takeoffanim; var_2.interactive_landanim = var_0.interactive_landanim; var_2.script_radius = var_0.script_radius; var_2.script_noteworthy = var_0.script_noteworthy; var_2.script_triggername = var_0.script_triggername; if ( isdefined( var_1 ) ) var_1[0] = var_2; if ( isdefined( var_0.incoming ) ) { foreach ( var_4 in var_0.incoming ) var_4.endperch = var_2; } var_0 delete(); level._interactive["bird_perches"][var_2.targetname] = var_2; if ( !isdefined( var_2.interactive_takeoffanim ) ) var_2.interactive_takeoffanim = "flying"; if ( !isdefined( var_2.interactive_landanim ) ) var_2.interactive_landanim = "flying"; var_2.triggers = []; var_6 = getentarray( var_2.targetname, "target" ); foreach ( var_8 in var_6 ) { if ( var_8.classname == "trigger_multiple" ) var_2.triggers[var_2.triggers.size] = var_8; } if ( isdefined( var_2.target ) ) { var_6 = getentarray( var_2.target, "targetname" ); foreach ( var_8 in var_6 ) { if ( var_8.classname == "trigger_multiple" ) var_2.triggers[var_2.triggers.size] = var_8; } } if ( isdefined( var_2.script_triggername ) ) { var_6 = getentarray( var_2.script_triggername, "target" ); foreach ( var_8 in var_6 ) { if ( var_8.classname == "trigger_multiple" ) var_2.triggers[var_2.triggers.size] = var_8; } } if ( !isdefined( var_1 ) ) { var_14 = getvehiclenodearray( var_2.target, "targetname" ); foreach ( var_16 in var_14 ) { var_17 = []; var_17[0] = var_2; var_17[1] = var_16; for ( var_18 = 1; !isdefined( var_17[var_18].script_noteworthy ) || var_17[var_18].script_noteworthy != "bird_perch"; var_18++ ) { if ( !isdefined( var_17[var_18].target ) ) break; var_19 = var_17[var_18].target; var_20 = getvehiclenode( var_19, "targetname" ); if ( !isdefined( var_20 ) ) { var_20 = getnode( var_19, "targetname" ); if ( !isdefined( var_20 ) ) { var_20 = getent( var_19, "targetname" ); if ( isdefined( var_20 ) ) var_20 = birds_setupconnectedperches( var_20 ); else var_20 = level._interactive["bird_perches"][var_2.targetname]; } } var_17[var_18 + 1] = var_20; } var_2 birds_perchsetuppath( var_17 ); } } else var_2 birds_perchsetuppath( var_1 ); return var_2; } birds_perchsetuppath( var_0 ) { if ( !isdefined( self.outgoing ) ) self.outgoing = []; var_1 = common_scripts\_csplines::cspline_makepath( var_0 ); var_2 = var_0[var_0.size - 1]; if ( isdefined( var_2.classname ) ) { if ( !isdefined( var_2.incoming ) ) var_2.incoming = []; var_2.incoming[var_2.incoming.size] = var_1; } if ( isdefined( var_2.script_noteworthy ) && var_2.script_noteworthy == "bird_perch" ) { var_1.endperch = var_2; var_1.landanim = var_2.interactive_landanim; } var_1.startorigin = self.origin; var_1.startangles = self.angles; var_1.takeoffanim = self.interactive_takeoffanim; var_1.endorigin = var_2.origin; var_1.endangles = var_2.angles; self.outgoing[self.outgoing.size] = var_1; } birds_fly( var_0 ) { self endon( "death" ); self.perch = level._interactive["bird_perches"][var_0]; var_1 = level._interactive[self.interactive_type]; var_2 = self.perch.outgoing[randomint( self.perch.outgoing.size )]; var_3 = common_scripts\_csplines::cspline_getpointatdistance( var_2, 0 ); self.origin = var_3["pos"]; self.angles = var_2.startangles; if ( common_scripts\utility::issp() ) { self call [[ level.func["setanimknob"] ]]( var_1.rigmodel_anims[var_2.takeoffanim], 1, 0, 0 ); self call [[ level.func["setanimtime"] ]]( var_1.rigmodel_anims[var_2.takeoffanim], 0 ); } else self call [[ level.func["scriptModelPlayAnim"] ]]( var_1.rigmodel_anims[var_2.takeoffanim + "mp"] ); var_4 = 0; self.landed = 1; var_5 = var_1.scareradius; if ( isdefined( self.perch.script_radius ) ) var_5 = self.perch.script_radius; if ( var_5 > 0 ) self.perch thread birds_perchdangertrigger( var_5, "triggered", "leaving perch" ); for (;;) { var_6 = 0; var_7 = var_1.rigmodel_anims[var_2.takeoffanim]; var_8 = var_1.rigmodel_anims[var_2.takeoffanim + "mp"]; var_9 = var_1.rigmodel_anims["flying"]; var_10 = var_1.rigmodel_anims["flyingmp"]; if ( isdefined( var_2.landanim ) ) { var_11 = var_1.rigmodel_anims[var_2.landanim]; var_12 = var_1.rigmodel_anims[var_2.landanim + "mp"]; } else { var_11 = undefined; var_12 = undefined; } if ( isdefined( var_1.rigmodel_pausestart[var_2.takeoffanim] ) ) var_13 = var_1.rigmodel_pausestart[var_2.takeoffanim]; else var_13 = 0; var_14 = 0; if ( !self.landed ) { if ( isdefined( var_11 ) && self.currentanim == var_11 ) { var_6 = 1 - self call [[ level.func["getanimtime"] ]]( self.currentanim ); var_14 = var_6 * getanimlength( var_7 ); var_13 = var_13 - var_14; var_13 = max( 0, var_13 ); } else { var_7 = var_1.rigmodel_anims["flying"]; var_8 = var_1.rigmodel_anims["flyingmp"]; var_6 = self call [[ level.func["getanimtime"] ]]( self.currentanim ); var_14 = var_6 * getanimlength( var_7 ); var_13 = 0; } } if ( isdefined( var_11 ) && isdefined( var_1.rigmodel_pauseend[var_2.landanim] ) ) var_15 = var_1.rigmodel_pauseend[var_2.landanim]; else var_15 = 0; var_16 = var_1.accn / 400; var_17 = var_2.segments[var_2.segments.size - 1].endat; var_18 = sqrt( var_16 * var_17 + var_4 * var_4 / 2 ); var_19 = var_1.topspeed / 20; if ( var_18 < var_19 ) var_19 = var_18; var_20 = int( ( var_19 - var_4 ) / var_16 ); var_21 = var_16 * ( var_20 / 2 ) * ( var_20 + 1 ) + var_4 * var_20; if ( isdefined( var_2.endperch ) ) { var_22 = int( var_19 / var_16 ); var_23 = var_16 * ( var_22 / 2 ) * ( var_22 + 1 ); } else { var_22 = 0; var_23 = 0; } var_24 = ( var_17 - ( var_21 + var_23 ) ) / var_19; var_25 = ( var_24 + ( var_20 + var_22 ) ) / 20; var_26 = getanimlength( var_9 ); if ( isdefined( var_11 ) ) var_27 = getanimlength( var_7 ) + getanimlength( var_11 ) - ( var_13 + var_14 + var_15 ); else var_27 = getanimlength( var_7 ) - ( var_13 + var_14 + var_15 ); var_28 = int( ( var_25 - var_27 ) / var_26 + 0.5 ); var_29 = ( var_28 * var_26 + var_27 ) / var_25; var_30 = var_2.endangles - var_2.startangles; var_30 = ( angleclamp180( var_30[0] ), angleclamp180( var_30[1] ), angleclamp180( var_30[2] ) ); if ( self.landed ) { self.perch waittill( "triggered" ); self.landed = 0; thread flock_fly_anim( var_7, 0, var_9, var_11, var_29, var_28, var_8, var_10, var_12 ); thread flock_playsound( var_1, "takeoff" ); var_31 = var_13 == 0; for ( var_32 = 1; var_32 <= self.interactive_number; var_32++ ) { if ( self.birdexists[var_32] ) self.birds[var_32] thread bird_flyfromperch( self, "tag_bird" + var_32, var_1.bird_model["fly"], var_1.bird_model["idle"], var_1.birdmodel_anims, "land_" + var_32, "takeoff_" + var_32, var_31 ); } } else { self notify( "stop_path" ); thread flock_fly_anim( var_7, var_6, var_9, var_11, var_29, var_28, var_8, var_10, var_12 ); for ( var_32 = 1; var_32 <= self.interactive_number; var_32++ ) { if ( self.birdexists[var_32] ) self.birds[var_32] thread bird_fly( self, "tag_bird" + var_32, var_1.bird_model["fly"], var_1.bird_model["idle"], var_1.birdmodel_anims, "land_" + var_32 ); } } if ( isdefined( self.perch ) ) { self.perch notify( "leaving perch" ); self.perch = undefined; } wait( var_13 ); var_33 = 0; var_34 = 0.2; while ( var_4 < var_19 - var_16 ) { var_4 = var_4 + var_16; var_33 = var_33 + var_4; var_3 = common_scripts\_csplines::cspline_getpointatdistance( var_2, var_33 ); self.origin = var_3["pos"]; self.angles = var_2.startangles + var_30 * ( var_33 / var_17 ); birds_set_flying_angles( self, var_3["vel"] * var_4, var_34, self.birds ); wait 0.05; } var_4 = var_19; while ( var_33 < var_17 - var_23 ) { var_33 = var_33 + var_4; var_3 = common_scripts\_csplines::cspline_getpointatdistance( var_2, var_33 ); self.origin = var_3["pos"]; self.angles = var_2.startangles + var_30 * ( var_33 / var_17 ); birds_set_flying_angles( self, var_3["vel"] * var_4, var_34, self.birds ); wait 0.05; } if ( !isdefined( var_2.endperch ) ) birds_delete(); var_35 = var_17 - var_33; var_36 = var_35 / var_23; var_4 = var_16 * ( int( var_4 / var_16 ) + 1 ); self.perch = var_2.endperch; self.perch thread birds_perchdangertrigger( var_5, "triggered", "leaving perch" ); while ( var_4 > var_19 * 0.75 || var_4 > 0 && birds_isperchsafe( self.perch ) ) { var_4 = var_4 - var_16; var_33 = var_33 + var_4 * var_36; var_3 = common_scripts\_csplines::cspline_getpointatdistance( var_2, var_33 ); self.origin = var_3["pos"]; self.angles = var_2.startangles + var_30 * ( var_33 / var_17 ); birds_set_flying_angles( self, var_3["vel"] * var_4, var_34, self.birds ); wait 0.05; } if ( var_4 <= 0 ) { self.origin = self.perch.origin; self.angles = self.perch.angles; var_2 = self.perch.outgoing[randomint( self.perch.outgoing.size )]; for ( var_32 = 0; var_32 < 20 * var_15 && birds_isperchsafe( self.perch ); var_32++ ) wait 0.05; if ( birds_isperchsafe( self.perch ) ) self.landed = 1; continue; } var_37 = self.perch.outgoing[randomint( self.perch.outgoing.size )]; var_2 = birds_path_move_first_point( var_37, var_3["pos"], var_3["vel"] * ( var_4 / var_19 ) ); var_2.startangles = self.angles; self.perch notify( "leaving perch" ); self.perch = undefined; } } debugprint( var_0 ) { } birds_set_flying_angles( var_0, var_1, var_2, var_3 ) { if ( common_scripts\utility::issp() ) { for ( var_4 = 1; var_4 <= var_3.size; var_4++ ) { if ( self.birdexists[var_4] ) { var_5 = var_0 gettagangles( "tag_bird" + var_4 ); var_6 = anglestoforward( var_5 ) / var_2; var_7 = var_6 + var_1; var_8 = vectortoangles( var_7 ); var_9 = var_8 - var_5; var_9 = ( angleclamp180( var_9[0] ) / 3, angleclamp180( var_9[1] ), 0 ); var_3[var_4] linkto( var_0, "tag_bird" + var_4, ( 0, 0, 0 ), var_9 ); } } } } flock_playsound( var_0, var_1 ) { if ( isdefined( var_0.sounds ) && isdefined( var_0.sounds[var_1] ) ) self playsound( var_0.sounds[var_1] ); } flock_fly_anim( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 ) { self endon( "death" ); self endon( "stop_path" ); if ( common_scripts\utility::issp() ) { var_9 = 0; if ( getanimlength( var_0 ) == 0 ) { } else { var_10 = var_4 / ( getanimlength( var_0 ) * 20 ); var_1 = var_1 - 2 * var_10; if ( var_1 > var_10 ) var_9 = 0.3; self call [[ level.func["setflaggedanimknob"] ]]( "bird_rig_takeoff_anim", var_0, 1, var_9, var_4 ); self.currentanim = var_0; if ( var_1 > var_10 ) { common_scripts\utility::waitframe(); self call [[ level.func["setanimtime"] ]]( var_0, var_1 ); self waittillmatch( "bird_rig_takeoff_anim", "end" ); } else self waittillmatch( "bird_rig_takeoff_anim", "end" ); } self call [[ level.func["setflaggedanimknobrestart"] ]]( "bird_rig_loop_anim", var_2, 1, 0, var_4 ); self.currentanim = var_2; for ( var_11 = 0; var_11 < var_5; var_11++ ) self waittillmatch( "bird_rig_loop_anim", "end" ); if ( isdefined( var_3 ) ) { self call [[ level.func["setflaggedanimknobrestart"] ]]( "bird_rig_land_anim", var_3, 1, 0.05, var_4 ); self.currentanim = var_3; self waittillmatch( "bird_rig_land_anim", "end" ); return; } } else { if ( getanimlength( var_0 ) == 0 ) { } else if ( var_1 < 0.2 ) { self call [[ level.func["scriptModelPlayAnim"] ]]( var_6 ); self.currentanim = var_0; wait( getanimlength( var_0 ) ); } self call [[ level.func["scriptModelPlayAnim"] ]]( var_7 ); self.currentanim = var_2; for ( var_11 = 0; var_11 < var_5; var_11++ ) wait( getanimlength( var_2 ) ); if ( isdefined( var_3 ) ) { self call [[ level.func["scriptModelPlayAnim"] ]]( var_8 ); self.currentanim = var_3; wait( getanimlength( var_3 ) ); } } } bird_flyfromperch( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7 ) { self endon( "death" ); var_0 endon( "stop_path" ); if ( isdefined( var_6 ) && !var_7 && common_scripts\utility::issp() ) var_0 waittillmatch( "bird_rig_takeoff_anim", var_6 ); self notify( "Stop initial model setup" ); self setmodel( var_2 ); self notify( "stop_loop" ); if ( var_7 ) { var_8 = maps\interactive_models\_interactive_utility::single_anim( var_4, "flying", undefined, 0 ); if ( common_scripts\utility::issp() ) { common_scripts\utility::waitframe(); self call [[ level.func["setanimtime"] ]]( var_8, randomfloat( 1 ) ); } } else if ( isdefined( var_4["takeoff"] ) ) { var_9 = maps\interactive_models\_interactive_utility::single_anim( var_4, "takeoff", "takeoff_anim", 1 ); if ( common_scripts\utility::issp() ) self waittillmatch( "takeoff_anim", "end" ); else wait( getanimlength( var_9 ) ); } bird_fly( var_0, var_1, var_2, var_3, var_4, var_5 ); } bird_fly( var_0, var_1, var_2, var_3, var_4, var_5 ) { self endon( "death" ); var_0 endon( "stop_path" ); self setmodel( var_2 ); self notify( "stop_loop" ); thread maps\interactive_models\_interactive_utility::loop_anim( var_4, "flying", "stop_loop" ); var_0 waittillmatch( "bird_rig_land_anim", var_5 ); if ( isdefined( var_4["land"] ) ) { self notify( "stop_loop" ); self endon( "stop_loop" ); maps\interactive_models\_interactive_utility::single_anim( var_4, "land", undefined, 1 ); } thread bird_sit( var_0, var_1, var_3, var_4 ); } bird_sit( var_0, var_1, var_2, var_3 ) { self endon( "death" ); self setmodel( var_2 ); self notify( "stop_loop" ); maps\interactive_models\_interactive_utility::loop_anim( var_3, "idle", "stop_loop" ); } bird_waitfordamage( var_0, var_1 ) { for (;;) { self waittill( "damage", var_2, var_3, var_4, var_5, var_6 ); if ( isdefined( self.origin ) ) { if ( var_6 == "MOD_GRENADE_SPLASH" ) var_5 = self.origin + ( 0, 0, 5 ); playfx( level._interactive[var_0.interactive_type].death_effect, var_5 ); if ( self.health <= 0 ) { var_0.birdexists[var_1] = 0; var_0.numbirds--; if ( var_0.numbirds == 0 ) var_0 delete(); self delete(); continue; } if ( isdefined( var_0.perch ) ) var_0.perch notify( "triggered" ); } } } birds_finishbirdtypesetup( var_0, var_1 ) { if ( !isdefined( var_1 ) ) var_1 = 0; precachemodel( var_0.rig_model ); foreach ( var_3 in var_0.bird_model ) precachemodel( var_3 ); if ( !common_scripts\utility::issp() ) { foreach ( var_6 in var_0.sounds ) precachesound( var_6 ); for ( var_8 = 1; var_8 <= 12; var_8++ ) precachestring( "tag_bird" + var_8 ); foreach ( var_10 in getarraykeys( level._interactive[self.interactive_type].rigmodel_anims ) ) { if ( isendstr( var_10, "mp" ) ) { var_11 = level._interactive[self.interactive_type].rigmodel_anims[var_10]; if ( isarray( var_11 ) ) { foreach ( var_13 in var_11 ) call [[ level.func["precacheMpAnim"] ]]( var_13 ); } else call [[ level.func["precacheMpAnim"] ]]( var_11 ); } } foreach ( var_10 in getarraykeys( level._interactive[self.interactive_type].birdmodel_anims ) ) { if ( isendstr( var_10, "mp" ) ) { var_11 = level._interactive[self.interactive_type].birdmodel_anims[var_10]; if ( isarray( var_11 ) ) { foreach ( var_13 in var_11 ) call [[ level.func["precacheMpAnim"] ]]( var_13 ); } else call [[ level.func["precacheMpAnim"] ]]( var_11 ); } } } var_0.savetostructfn = ::birds_savetostruct; var_0.loadfromstructfn = ::birds_loadfromstruct; var_0.rigmodel_pausestart = []; var_0.rigmodel_pauseend = []; var_20 = getarraykeys( var_0.rigmodel_anims ); foreach ( var_22 in var_20 ) { if ( !isendstr( var_22, "mp" ) ) { if ( common_scripts\utility::string_starts_with( var_22, "takeoff_" ) ) { if ( getanimlength( var_0.rigmodel_anims[var_22] ) == 0 ) { var_0.rigmodel_anims[var_22] = var_0.rigmodel_anims["fly"]; var_0.rigmodel_pausestart[var_22] = 0; } else var_0.rigmodel_pausestart[var_22] = birds_get_last_takeoff( var_0, var_22, var_0.rig_numtags ) + var_1; continue; } if ( common_scripts\utility::string_starts_with( var_22, "land_" ) ) { if ( getanimlength( var_0.rigmodel_anims[var_22] ) == 0 ) { var_0.rigmodel_anims[var_22] = var_0.rigmodel_anims["fly"]; var_0.rigmodel_pauseend[var_22] = 0; continue; } var_0.rigmodel_pauseend[var_22] = birds_get_first_land( var_0, var_22, var_0.rig_numtags ); } } } } birds_get_last_takeoff( var_0, var_1, var_2 ) { var_3 = var_0.rigmodel_anims[var_1]; var_4 = 0; for ( var_5 = 1; var_5 <= var_2; var_5++ ) { var_6 = getnotetracktimes( var_3, "takeoff_" + var_5 ); if ( var_6.size <= 0 ) continue; if ( var_6.size > 1 ) continue; if ( var_6[0] > var_4 ) var_4 = var_6[0]; } return getanimlength( var_0.rigmodel_anims[var_1] ) * var_4; } birds_get_first_land( var_0, var_1, var_2 ) { var_3 = var_0.rigmodel_anims[var_1]; var_4 = 1; for ( var_5 = 1; var_5 <= var_2; var_5++ ) { var_6 = getnotetracktimes( var_3, "land_" + var_5 ); if ( var_6.size <= 0 ) continue; if ( var_6.size > 1 ) continue; if ( var_6[0] < var_4 ) var_4 = var_6[0]; } return getanimlength( var_0.rigmodel_anims[var_1] ) * ( 1 - var_4 ); } birds_perchdangertrigger( var_0, var_1, var_2 ) { self.trigger = spawn( "trigger_radius", self.origin - ( 0, 0, var_0 ), 23, var_0, 2 * var_0 ); thread maps\interactive_models\_interactive_utility::delete_on_notify( self.trigger, "death", var_2 ); thread birds_perchtouchtrigger( self.trigger, var_1, var_2 ); thread birds_percheventtrigger( var_0, var_1, var_2 ); foreach ( var_4 in self.triggers ) thread birds_perchtouchtrigger( var_4, var_1, var_2 ); } birds_perchtouchtrigger( var_0, var_1, var_2 ) { self endon( "death" ); self endon( var_2 ); for (;;) { var_0.anythingtouchingtrigger = 0; var_0 waittill( "trigger" ); self notify( var_1 ); var_0.anythingtouchingtrigger = 1; wait 1; } } birds_percheventtrigger( var_0, var_1, var_2 ) { if ( common_scripts\utility::issp() ) { self endon( "death" ); self endon( var_2 ); self.sentient = spawn( "script_origin", self.origin ); self.sentient call [[ level.makeentitysentient_func ]]( "neutral" ); thread maps\interactive_models\_interactive_utility::wait_then_fn( var_2, "death", ::birds_deleteperchsentient ); self.sentient call [[ level.addaieventlistener_func ]]( "projectile_impact" ); self.sentient call [[ level.addaieventlistener_func ]]( "bulletwhizby" ); self.sentient call [[ level.addaieventlistener_func ]]( "explode" ); self.lastaieventtrigger = gettime() - 500; for (;;) { self.sentient waittill( "ai_event", var_3, var_4, var_5 ); if ( var_3 != "explode" && var_3 != "gunshot" || distancesquared( self.origin, var_5 ) < 2 * var_0 ) { self notify( var_1 ); self.lastaieventtrigger = gettime(); } } } } birds_deleteperchsentient() { self.sentient delete(); } birds_isperchsafe( var_0 ) { var_1 = 0; var_2 = !var_0.trigger.anythingtouchingtrigger; if ( var_2 ) { foreach ( var_4 in var_0.triggers ) { if ( var_4.anythingtouchingtrigger ) { var_2 = 0; continue; } } if ( var_0.lastaieventtrigger > gettime() ) var_0.lastaieventtrigger = gettime() - 500; if ( gettime() - var_0.lastaieventtrigger >= 500 ) var_1 = 1; } return var_2 && var_1; } birds_path_move_first_point( var_0, var_1, var_2 ) { var_3 = common_scripts\_csplines::cspline_movefirstpoint( var_0, var_1, var_2 ); var_3.startorigin = var_1; if ( isdefined( var_0.startangles ) ) var_3.startangles = var_0.startangles; if ( isdefined( var_0.endorigin ) ) var_3.endorigin = var_0.endorigin; if ( isdefined( var_0.endangles ) ) var_3.endangles = var_0.endangles; if ( isdefined( var_0.endperch ) ) var_3.endperch = var_0.endperch; if ( isdefined( var_0.takeoffanim ) ) var_3.takeoffanim = var_0.takeoffanim; if ( isdefined( var_0.landanim ) ) var_3.landanim = var_0.landanim; return var_3; } birds_spawnandflyaway( var_0, var_1, var_2, var_3 ) { if ( !isdefined( level._interactive["scriptSpawnedCount"] ) ) level._interactive["scriptSpawnedCount"] = 0; level._interactive["scriptSpawnedCount"]++; var_4 = spawn( "script_model", var_1 ); var_4.angles = vectortoangles( var_2 ); var_4.targetname = "scriptSpawned_" + level._interactive["scriptSpawnedCount"]; var_4.script_noteworthy = "bird_perch"; var_5 = []; var_5[0] = var_4; var_5[1] = spawnstruct(); var_5[1].origin = var_1 + var_2; var_5[1].angles = var_4.angles; var_4 = birds_setupconnectedperches( var_4, var_5 ); var_6 = spawnstruct(); var_6.interactive_type = var_0; var_6.target = var_4.targetname; var_6.origin = var_1; var_6.interactive_number = var_3; var_6 birds_loadfromstruct(); var_4 notify( "triggered" ); common_scripts\utility::waitframe(); level._interactive["bird_perches"][var_4.targetname] = undefined; } birds_waitfortriggerstop() { self endon( "death" ); level waittill( "stop_" + self.script_triggername ); thread birds_savetostructandwaitfortriggerstart(); } birds_savetostructandwaitfortriggerstart() { var_0 = birds_savetostruct(); level waittill( "start_" + self.script_triggername ); var_0 birds_loadfromstruct(); } birds_savetostruct() { var_0 = spawnstruct(); var_0.interactive_type = self.interactive_type; var_0.target = self.target; var_0.origin = self.origin; var_0.targetname = self.targetname; if ( isdefined( self.interactive_number ) ) var_0.interactive_number = self.interactive_number; var_0.script_triggername = self.script_triggername; birds_delete(); return var_0; } birds_loadfromstruct() { var_0 = spawn( "script_model", self.origin ); var_0.interactive_type = self.interactive_type; var_0.target = self.target; var_0.origin = self.origin; if ( isdefined( self.interactive_number ) ) var_0.interactive_number = self.interactive_number; var_0.script_triggername = self.script_triggername; var_0.targetname = "interactive_birds"; if ( !isdefined( level._interactive["bird_perches"][self.target] ) ) var_0 birds_setupconnectedperches(); var_0 birds_createents(); var_0 thread birds_fly( var_0.target ); } birds_delete() { if ( isdefined( self.birds ) ) { for ( var_0 = 1; var_0 <= self.birds.size; var_0++ ) { if ( self.birdexists[var_0] ) self.birds[var_0] delete(); } } if ( isdefined( self.perch ) ) self.perch notify( "leaving perch" ); self delete(); }