// IW6 GSC SOURCE // Generated by https://github.com/xensik/gsc-tool fish() { level waittill( "load_finished" ); if ( isdefined( level._interactive["fish_setup"] ) ) return; level._interactive["fish_setup"] = 1; var_0 = getentarray( "interactive_fish", "script_noteworthy" ); foreach ( var_2 in var_0 ) { if ( var_2.classname == "script_model" ) var_2 thread single_fish_start(); } } single_fish_start() { if ( isdefined( self.target ) ) var_0 = getentarray( self.target, "targetname" ); else var_0 = []; if ( var_0.size >= 1 && isdefined( var_0[0].script_noteworthy ) && var_0[0].script_noteworthy == "interactive_fish" ) { self.following = var_0[0]; if ( !isdefined( var_0[0].followedby ) ) var_0[0].followedby = []; var_0[0].followedby[var_0[0].followedby.size] = self; var_0 = []; } var_1 = spawnstruct(); var_1.origin = self.origin; var_1.script_radius = self.script_radius; var_0[var_0.size] = var_1; if ( !isdefined( self.script_moveplaybackrate ) ) self.script_moveplaybackrate = 1; foreach ( var_3 in var_0 ) { if ( !isdefined( var_3.script_radius ) ) var_3.script_radius = level._interactive[self.interactive_type].default_wander_radius; } thread single_fish_detectdamage( "interrupted" ); thread single_fish_idle( self.interactive_type, var_0, var_1.origin, var_1.script_radius, 1 ); self removefrommovingplatformsystem( 1 ); } single_fish_idle( var_0, var_1, var_2, var_3, var_4 ) { self endon( "death" ); self endon( "interrupted" ); if ( !isdefined( var_4 ) ) var_4 = 0; var_5 = level._interactive[var_0]; self useanimtree( var_5.animtree ); thread maps\interactive_models\_interactive_utility::detect_people( var_5.people_react_distance, "interrupted", [ "interrupted", "death", "damage" ] ); thread maps\interactive_models\_interactive_utility::detect_player_event( var_5.gunfire_react_distance, "interrupted", [ "interrupted", "death", "damage" ], "weapon_fired" ); thread single_fish_flee( var_0, var_1 ); for (;;) { var_6 = var_2 - self.origin; var_7 = length( ( var_6[0], var_6[1], 2 * var_6[2] ) ); if ( var_7 > var_3 * 2 ) var_8 = maps\interactive_models\_interactive_utility::single_anim( var_5.anims, "flee_continue", "idle anim", 1, self.script_moveplaybackrate ); else var_8 = maps\interactive_models\_interactive_utility::single_anim( var_5.anims, "idle", "idle anim", 1, self.script_moveplaybackrate ); var_9 = getanimlength( var_8 ) / self.script_moveplaybackrate; var_10 = length( getmovedelta( var_8 ) ) / var_9; var_11 = 0; if ( var_4 ) { wait 0.05; var_12 = randomfloatrange( 0, 1 ); self setanimtime( var_8, var_12 ); var_11 = var_12 * var_9 + 0.05; var_4 = 0; } while ( var_11 < var_9 ) { var_13 = var_5.wander_redirect_time * randomfloatrange( 0.5, 1.5 ) / self.script_moveplaybackrate; if ( var_11 + var_13 > var_9 - var_5.wander_redirect_time / 2 ) var_13 = var_9 - var_11; if ( var_10 * var_13 > var_3 ) var_13 = var_3 / ( var_10 * 1.5 ); var_14 = anglestoforward( self.angles ); var_15 = self.origin + 0.5 * var_10 * var_14 * var_13; var_16 = var_2 - var_15; var_17 = length( ( var_16[0], var_16[1], 2 * var_16[2] ) ); if ( var_17 + var_10 * var_13 < var_3 ) { if ( var_7 < var_3 ) var_18 = randomfloatrange( -20, 20 ); else var_18 = randomfloatrange( -60, 60 ); var_19 = randomfloatrange( -20, 20 ) - 0.5 * self.angles[0]; maps\interactive_models\_interactive_utility::interactives_drawdebuglinefortime( self.origin, var_2, 0, 1, 0, var_13 ); } else { var_20 = anglestoright( self.angles ); var_18 = randomfloatrange( 60, 100 ); if ( vectordot( var_16, var_14 ) > 0 ) { var_18 = var_18 - 60; if ( var_7 < var_3 ) var_18 = var_18 / 2; } if ( vectordot( var_16, var_20 ) > 0 ) var_18 = var_18 * -1; var_21 = var_3 / 2; if ( var_16[2] < -1 * var_21 ) var_19 = randomfloatrange( 15, 30 ) - 0.5 * self.angles[0]; else if ( var_16[2] > var_21 ) var_19 = randomfloatrange( -30, -15 ) - 0.5 * self.angles[0]; else if ( var_16[2] < -0.5 * var_21 ) var_19 = randomfloatrange( 0, 30 ) - 0.5 * self.angles[0]; else if ( var_16[2] > 0.5 * var_21 ) var_19 = randomfloatrange( -30, 0 ) - 0.5 * self.angles[0]; else var_19 = randomfloatrange( -20, 20 ) - 0.5 * self.angles[0]; maps\interactive_models\_interactive_utility::interactives_drawdebuglinefortime( self.origin, var_2, 0.7, 0.7, 0, var_13 ); } clamp( var_19, -60 - self.angles[0], 60 - self.angles[0] ); if ( var_18 > 0 ) { self setanimlimitedrestart( var_5.anims["turn_left_child"], 1, 0 ); self setanim( var_5.anims["turn_left"], min( var_18 / 60, 1 ), 0 ); } else { self setanimlimitedrestart( var_5.anims["turn_right_child"], 1, 0, self.script_moveplaybackrate ); self setanim( var_5.anims["turn_right"], min( var_18 / -60, 1 ), 0 ); } self rotateby( ( var_19, var_18, 0 ), 0.5 / self.script_moveplaybackrate, 0, 0.5 / self.script_moveplaybackrate ); self.detect_people_trigger["interrupted"].origin = var_15 - ( 0, 0, 16 ); wait( var_13 ); var_11 = var_11 + var_13; } } } single_fish_flee( var_0, var_1 ) { self endon( "death" ); var_2 = level._interactive[var_0]; var_3 = randomint( var_1.size ); self.nextorigin = var_1[var_3].origin; var_4 = var_1[var_3].script_radius; self waittill( "interrupted" ); var_5 = undefined; if ( isdefined( self.interruptedent ) ) { if ( issentient( self.interruptedent ) ) var_6 = self.interruptedent geteye(); else var_6 = self.interruptedent.origin; var_5 = vectornormalize( var_6 - self.origin ); } thread single_fish_interruptfollowers(); self.nextorigin = single_fish_getnextorigin(); var_7 = self.nextorigin - self.origin; var_8 = vectornormalize( var_7 ); if ( isdefined( var_5 ) && vectordot( var_5, var_8 ) > 0.7 ) var_8 = var_5 + vectornormalize( var_8 - var_5 ); var_9 = anglestoforward( self.angles ); if ( vectordot( var_8, var_9 ) > 0.7 ) var_10 = "flee_straight"; else { var_11 = anglestoright( self.angles ); if ( vectordot( var_8, var_11 ) > 0 ) var_10 = "flee_right"; else var_10 = "flee_left"; } var_12 = vectortoangles( var_8 ); var_13 = randomfloatrange( 0.8, 1.2 ); var_14 = maps\interactive_models\_interactive_utility::single_anim( var_2.anims, var_10, "flee anim", 1, self.script_moveplaybackrate * var_13 ); self rotateto( var_12, 0.2 / self.script_moveplaybackrate, 0, 0.2 / self.script_moveplaybackrate ); var_15 = getanimlength( var_14 ) / ( self.script_moveplaybackrate * var_13 ); var_15 = var_15 - 0.5; var_15 = var_15 - randomfloat( 2 ); wait 0.5; while ( var_15 > 0.3 ) { var_7 = self.nextorigin - self.origin; var_8 = vectornormalize( var_7 ); var_12 = vectortoangles( var_8 ); self rotateto( var_12, 1, 0.1, 0.3 ); wait 0.3; var_15 = var_15 - 0.3; } self waittillmatch( "flee anim", "end" ); thread single_fish_idle( var_0, var_1, self.nextorigin, var_4 ); } single_fish_getnextorigin() { if ( isdefined( self.following ) ) return self.following single_fish_getnextorigin(); else return self.nextorigin; } single_fish_interruptfollowers() { self endon( "death" ); wait( 0.05 * randomint( 3 ) ); if ( isdefined( self.following ) ) { self.following.interruptedent = self.interruptedent; self.following notify( "interrupted" ); } if ( isdefined( self.followedby ) ) { var_0 = self.followedby.size; foreach ( var_2 in self.followedby ) { wait( 0.05 * randomintrange( 5, 10 ) / var_0 ); var_2.interruptedent = self.interruptedent; var_2 notify( "interrupted" ); } } } single_fish_detectdamage( var_0 ) { self endon( "death" ); self setcandamage( 1 ); for (;;) { self.health = 1000000; self waittill( "damage" ); self notify( var_0 ); } } single_fish_savetostruct() { var_0 = spawnstruct(); var_0.model = self.model; var_0.interactive_type = self.interactive_type; var_0.origin = self.origin; var_0.angles = self.angles; var_0.target = self.target; var_0.targetname = self.targetname; var_0.script_noteworthy = self.script_noteworthy; var_0.script_radius = self.script_radius; self delete(); return var_0; } single_fish_loadfromstruct() { var_0 = spawn( "script_model", self.origin ); var_0 setmodel( self.model ); var_0.interactive_type = self.interactive_type; var_0.origin = self.origin; var_0.angles = self.angles; var_0.target = self.target; var_0.targetname = self.targetname; var_0.script_noteworthy = self.script_noteworthy; var_0.script_radius = self.script_radius; var_0 thread single_fish_start_after_frameend(); } single_fish_start_after_frameend() { waittillframeend; single_fish_start(); }