// IW6 GSC SOURCE // Generated by https://github.com/xensik/gsc-tool main() { self endon( "killanimscript" ); entermove(); startmove(); continuemovement(); } entermove() { self.blockgoalpos = 0; self.playing_pain_animation = 0; self scragentsetphysicsmode( "gravity" ); self scragentsetanimmode( "code_move" ); } startmove() { if ( candostartmove() ) { switch ( getstartmovetype() ) { case "run-start": dorunstart(); break; case "walk-start": dowalkstart(); break; case "leap-to-run": doleaptorunstart(); break; default: break; } } } end_script() { self.blockgoalpos = 0; self.playing_pain_animation = 0; cancelallbut( undefined ); self scragentsetanimscale( 1, 1 ); self.previousanimstate = "move"; } setupmovement() { self.enablestop = 1; thread waitformovemodechange(); thread waitforjumpsoon(); thread waitforsharpturn(); thread waitforstop(); thread waitforstuck(); if ( candodge() ) { thread waitfornearmiss(); thread waitfordodgechance(); } } continuemovement() { setupmovement(); if ( self.oriented ) { var_0 = self getlookaheaddir(); var_1 = anglestoup( self.angles ); var_2 = vectorcross( var_1, var_0 ); var_0 = vectorcross( var_2, var_1 ); var_3 = ( 0, 0, 0 ) - var_2; var_4 = axistoangles( var_0, var_3, var_1 ); self scragentsetorientmode( "face angle abs", var_4 ); self scragentsetanimmode( "code_move_slide" ); } else { self scragentsetorientmode( "face motion" ); self scragentsetanimmode( "code_move" ); } self scragentsetanimscale( self.xyanimscale, 1.0 ); setmoveanim( self.movemode ); } waitformovemodechange() { self endon( "killanimscript" ); self endon( "alienmove_endwait_runwalk" ); var_0 = self.movemode; for (;;) { if ( var_0 != self.movemode ) { setmoveanim( self.movemode ); var_0 = self.movemode; } wait 0.1; } } waitforsharpturn() { self endon( "killanimscript" ); self endon( "alienmove_endwait_sharpturn" ); self waittill( "path_dir_change", var_0 ); var_1 = maps\mp\agents\_scriptedagents::getangleindexfromselfyaw( var_0 ); if ( var_1 == 4 ) { thread waitforsharpturn(); return; } var_2 = !should_do_sharp_turn(); if ( var_2 ) var_1 = 0; var_3 = "run_turn"; var_4 = self getanimentry( var_3, var_1 ); var_5 = var_2 || candoturnanim( var_4 ); if ( !var_5 ) { thread waitforsharpturn(); return; } cancelallbut( "sharpturn" ); self.blockgoalpos = 1; self.enablestop = 0; if ( var_2 ) maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( self getlookaheaddir() ); self scragentsetanimmode( "anim deltas" ); self scragentsetorientmode( "face angle abs", self.angles ); maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_3, var_1, self.moveplaybackrate, var_3, "code_move" ); self scragentsetorientmode( "face motion" ); self.blockgoalpos = 0; continuemovement(); } waitforstop() { self endon( "killanimscript" ); self endon( "alienmove_endwait_stop" ); self waittill( "stop_soon" ); if ( !shoulddostopanim() || self.movemode == "walk" ) thread waitforstop(); else { var_0 = self getpathgoalpos(); if ( !isdefined( var_0 ) ) { thread waitforstop(); return; } var_1 = var_0 - self.origin; var_2 = getstopendfacedir( var_0 ); var_3 = getstopanimstate(); if ( should_move_straight_ahead() ) var_4 = 0; else var_4 = getstopanimindex( var_3, var_2 ); var_5 = self getanimentry( var_3, var_4 ); var_6 = getmovedelta( var_5 ); var_7 = getangledelta( var_5 ); if ( length( var_1 ) + 48 < length( var_6 ) ) { thread waitforstop(); return; } var_8 = getstopdata( var_0 ); var_9 = calcanimstartpos( var_8.pos, var_8.angles[1], var_6, var_7 ); var_10 = maps\mp\agents\_scriptedagents::droppostoground( var_9 ); if ( !isdefined( var_10 ) ) { thread waitforstop(); return; } if ( !maps\mp\agents\_scriptedagents::canmovepointtopoint( var_8.pos, var_10 ) ) { thread waitforstop(); return; } cancelallbut( "stop", "sharpturn" ); thread waitforpathset( "alienmove_endwait_pathsetwhilestopping", "alienmove_endwait_stop" ); var_11 = maps\mp\agents\_scriptedagents::getanimscalefactors( var_0 - self.origin, var_6 ); self scragentsetanimmode( "anim deltas" ); self scragentsetorientmode( "face angle abs", vectortoangles( var_1 ) ); self scragentsetanimscale( var_11.xy, var_11.z ); maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_3, var_4, var_3, "end" ); self scragentsetanimscale( 1.0, 1.0 ); if ( should_move_straight_ahead() ) maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( self getlookaheaddir() ); var_0 = self getpathgoalpos(); if ( distancesquared( self.origin, var_0 ) < 400.0 ) { self scragentsetanimmode( "code_move_slide" ); self setanimstate( "idle" ); return; return; } startmove(); continuemovement(); } } getstopendfacedir( var_0 ) { if ( isdefined( self.enemy ) ) return self.enemy.origin - var_0; return var_0 - self.origin; } getstopanimstate() { switch ( self.movemode ) { case "jog": case "run": return "run_stop"; case "walk": return "walk_stop"; default: } } getstopanimindex( var_0, var_1 ) { switch ( var_0 ) { case "walk_stop": return 0; case "run_stop": return maps\mp\agents\_scriptedagents::getangleindexfromselfyaw( var_1 ); } } waitforpathset( var_0, var_1 ) { self endon( "killanimscript" ); self endon( var_0 ); var_2 = self scragentgetgoalpos(); self waittill( "path_set" ); var_3 = self scragentgetgoalpos(); if ( distancesquared( var_2, var_3 ) < 1 ) { thread waitforpathset( var_0, var_1 ); return; } self notify( var_1 ); continuemovement(); } waitforjumpsoon() { self endon( "killanimscript" ); self endon( "alienmove_endwait_jumpsoon" ); self waittill( "traverse_soon" ); cancelallbut( "jumpsoon" ); var_0 = self getnegotiationstartnode(); var_1 = self getnegotiationendnode(); var_2 = var_1.origin - var_0.origin; var_3 = maps\mp\agents\_scriptedagents::getangleindexfromselfyaw( var_1.origin - var_0.origin ); if ( !shoulddoleaparrivalanim( var_0, var_3 ) ) continuemovement(); else { var_4 = "jump_launch_arrival"; var_5 = self getanimentry( var_4, var_3 ); var_6 = getmovedelta( var_5 ); var_7 = getangledelta( var_5 ); if ( !maps\mp\agents\_scriptedagents::canmovepointtopoint( self.origin, var_0.origin ) && !self.oriented ) { continuemovement(); return; } thread waitforpathset( "alienmove_endwait_pathsetwhilejumping", "alienmove_endwait_jumpsoon" ); self scragentsetanimmode( "anim deltas" ); self scragentsetorientmode( "face angle abs", self.angles ); var_8 = maps\mp\agents\_scriptedagents::getanimscalefactors( var_0.origin - self.origin, var_6 ); self scragentsetanimscale( var_8.xy, var_8.z ); maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_4, var_3, self.moveplaybackrate, "jump_launch_arrival", "anim_will_finish" ); var_9 = var_2; var_10 = anglestoup( self.angles ); var_11 = vectorcross( var_10, var_9 ); var_9 = vectorcross( var_11, var_10 ); var_12 = ( 0, 0, 0 ) - var_11; var_13 = axistoangles( var_9, var_12, var_10 ); self scragentsetorientmode( "face angle abs", var_13 ); self scragentsetanimscale( 1.0, 1.0 ); var_0 = self getnegotiationstartnode(); if ( isdefined( var_0 ) && distancesquared( self.origin, var_0.origin ) < 400.0 || self.oriented ) { self scragentsetanimmode( "code_move_slide" ); return; } continuemovement(); } } setmoveanim( var_0 ) { if ( var_0 == "run" ) { var_1 = self getanimentrycount( "run" ); var_2 = [ 20, 80 ]; var_3 = maps\mp\alien\_utility::getrandomindex( var_2 ); self setanimstate( "run", var_3, self.moveplaybackrate ); } else if ( var_0 == "jog" ) self setanimstate( "jog", undefined, self.moveplaybackrate ); else if ( var_0 == "walk" ) self setanimstate( "walk", undefined, self.moveplaybackrate ); else { } } cancelallbut( var_0, var_1 ) { var_2 = [ "runwalk", "sharpturn", "stop", "pathsetwhilestopping", "jumpsoon", "pathsetwhilejumping", "pathset", "nearmiss", "dodgechance", "stuck" ]; var_3 = isdefined( var_0 ); var_4 = isdefined( var_1 ); foreach ( var_6 in var_2 ) { if ( var_3 && var_6 == var_0 ) continue; if ( var_4 && var_6 == var_1 ) continue; self notify( "alienmove_endwait_" + var_6 ); } } getstopdata( var_0 ) { var_1 = spawnstruct(); if ( isdefined( self.node ) ) { var_1.pos = self.node.origin; var_1.angles = self.node.angles; } else if ( isdefined( self.enemy ) ) { var_1.pos = var_0; var_1.angles = vectortoangles( self.enemy.origin - var_0 ); } else { var_1.pos = var_0; var_1.angles = self.angles; } return var_1; } calcanimstartpos( var_0, var_1, var_2, var_3 ) { var_4 = var_1 - var_3; var_5 = ( 0, var_4, 0 ); var_6 = anglestoforward( var_5 ); var_7 = anglestoright( var_5 ); var_8 = var_6 * var_2[0]; var_9 = var_7 * var_2[1]; return var_0 - var_8 + var_9; } onflashbanged() { dostumble(); } ondamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 ) { if ( isdefined( level.dlc_can_do_pain_override_func ) ) { var_10 = [[ level.dlc_can_do_pain_override_func ]]( "move" ); if ( !var_10 ) return; } if ( maps\mp\alien\_utility::is_pain_available( var_1, var_4 ) ) dostumble( var_3, var_7, var_8, var_2, var_4, var_1 ); } dostumble( var_0, var_1, var_2, var_3, var_4, var_5 ) { self endon( "killanimscript" ); if ( self.playing_pain_animation ) return; cancelallbut( undefined ); self.statelocked = 1; self.playing_pain_animation = 1; var_6 = var_0 & level.idflags_stun; if ( var_4 == "MOD_MELEE" || var_6 ) { var_7 = "pain_pushback"; var_8 = maps\mp\agents\alien\_alien_anim_utils::getpainanimindex( "push_back", var_1 ); var_9 = "pain_pushback"; } else { var_7 = maps\mp\agents\alien\_alien_anim_utils::getpainanimstate( "run_stumble", var_3, var_6 ); var_8 = maps\mp\agents\alien\_alien_anim_utils::getpainanimindex( "run", var_1, var_2 ); var_9 = "run_stumble"; } var_10 = self getanimentry( var_7, var_8 ); maps\mp\alien\_utility::always_play_pain_sound( var_10 ); maps\mp\alien\_utility::register_pain( var_10 ); self scragentsetorientmode( "face angle abs", self.angles ); self scragentsetanimmode( "anim deltas" ); maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_7, var_8, self.moveplaybackrate, var_9, "code_move" ); self.playing_pain_animation = 0; self.statelocked = 0; if ( shouldstartmove() ) startmove(); continuemovement(); } waitfornearmiss( var_0 ) { self endon( "killanimscript" ); self endon( "alienmove_endwait_nearmiss" ); var_1 = 0.5; for (;;) { common_scripts\utility::waittill_any( "bulletwhizby", "damage" ); if ( randomfloat( 1.0 ) < var_1 ) continue; if ( !self.playing_pain_animation ) dododge(); } } waitfordodgechance() { self endon( "killanimscript" ); self endon( "alienmove_endwait_dodgechance" ); var_0 = 0.0; var_1 = randomintrange( 1000, 2000 ); var_2 = gettime(); for (;;) { wait 0.1; if ( isalive( self.enemy ) ) { var_3 = gettime(); var_4 = vectornormalize( self.origin - self.enemy.origin ); var_5 = anglestoforward( self.enemy.angles ); if ( vectordot( var_4, var_5 ) < 0.985 ) { var_0 = 0.0; continue; } var_0 = var_0 + ( var_3 - var_2 ); if ( distancesquared( self.origin, self.enemy.origin ) > 640000.0 ) continue; var_6 = var_4 * -1.0; var_7 = anglestoforward( self.angles ); if ( vectordot( var_6, var_7 ) < 0.766 ) continue; if ( var_0 >= var_1 && !self.playing_pain_animation ) { dododge( "dodgechance" ); var_0 = 0.0; var_1 = randomintrange( 1000, 2000 ); } var_2 = var_3; } } } candodge() { switch ( maps\mp\alien\_utility::get_alien_type() ) { case "seeder": case "mammoth": case "spitter": case "elite": return 0; default: return 1; } } dododge( var_0 ) { self endon( "killanimscript" ); var_1 = 1000; if ( isdefined( self.last_dodge_time ) && gettime() - self.last_dodge_time < var_1 ) return; if ( isalive( self.enemy ) && distancesquared( self.origin, self.enemy.origin ) < 65536.0 ) return; var_2 = get_primary_dodge_anim_state(); if ( common_scripts\utility::cointoss() ) { if ( !trydodge( var_2 + "_left", var_0 ) ) trydodge( var_2 + "_right", var_0 ); } else if ( !trydodge( var_2 + "_right", var_0 ) ) trydodge( var_2 + "_left", var_0 ); } get_primary_dodge_anim_state() { switch ( self.movemode ) { case "jog": return "jog_dodge"; default: return "run_dodge"; } } trydodge( var_0, var_1 ) { var_2 = 0.5; var_3 = maps\mp\agents\_scriptedagents::getrandomanimentry( var_0 ); var_4 = self getanimentry( var_0, var_3 ); var_5 = maps\mp\agents\_scriptedagents::getsafeanimmovedeltapercentage( var_4 ); var_5 = min( var_5, self.xyanimscale ); if ( var_5 < var_2 ) return 0; self.last_dodge_time = gettime(); cancelallbut( var_1 ); self scragentsetanimmode( "anim deltas" ); self scragentsetorientmode( "face angle abs", self.angles ); self scragentsetanimscale( var_5, 1.0 ); maps\mp\agents\_scriptedagents::playanimuntilnotetrack( var_0, var_0, "end" ); self scragentsetanimscale( 1, 1 ); continuemovement(); return 1; } waitforstuck() { self endon( "killanimscript" ); self endon( "alienmove_endwait_stuck" ); var_0 = 2000.0; var_1 = gettime() + var_0; var_2 = self.origin; var_3 = 1.0; for (;;) { var_4 = gettime(); var_5 = length( self.origin - var_2 ); if ( var_5 > var_3 ) var_1 = var_4 + var_0; if ( var_1 <= var_4 ) { stucklerp(); var_1 = var_4 + var_0; break; } var_2 = self.origin; wait 0.1; } continuemovement(); } stucklerp() { self endon( "killanimscript" ); self endon( "alienmove_endwait_stuck" ); self endon( "death" ); var_0 = 0.2; cancelallbut( "stuck" ); var_1 = self getanimentry(); var_2 = getanimlength( var_1 ); var_3 = length( getmovedelta( var_1 ) ); var_4 = var_0 / var_2 * var_3; var_5 = self getlookaheaddir(); var_6 = self.origin + var_5 * var_4; self scragentsetphysicsmode( "noclip" ); self scragentsetorientmode( "face angle abs", vectortoangles( var_5 ) ); self scragentdoanimlerp( self.origin, var_6, var_0 ); wait( var_0 ); self setorigin( self.origin ); } dowalkstart() { var_0 = "walk_start"; var_1 = maps\mp\agents\_scriptedagents::getrandomanimentry( var_0 ); self scragentsetanimmode( "anim deltas" ); self scragentsetorientmode( "face angle abs", self.angles ); self.blockgoalpos = 1; maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_0, var_1, self.moveplaybackrate, var_0, "code_move" ); self scragentsetorientmode( "face motion" ); self.blockgoalpos = 0; } dorunstart() { var_0 = self getnegotiationstartnode(); if ( isdefined( var_0 ) ) var_1 = var_0.origin; else var_1 = self getpathgoalpos(); if ( !isdefined( var_1 ) ) return; if ( distancesquared( var_1, self.origin ) < 10000 ) return; var_2 = self getlookaheaddir(); var_3 = self getvelocity(); if ( lengthsquared( var_3 ) > 16 ) { var_4 = anglestoup( self.angles ); if ( vectordot( var_4, ( 0, 0, 1 ) ) < 0.707 ) { var_5 = vectordot( var_4, var_2 ); if ( var_5 > 0.707 || var_5 < -0.707 ) return; } } dostartmoveanim( "run_start" ); } doleaptorunstart() { dostartmoveanim( "leap_to_run_start" ); } should_move_straight_ahead() { switch ( maps\mp\alien\_utility::get_alien_type() ) { case "seeder": case "spitter": case "minion": return 1; default: return 0; } } should_do_sharp_turn() { switch ( maps\mp\alien\_utility::get_alien_type() ) { case "seeder": case "mammoth": case "spitter": case "minion": case "elite": return 0; default: return 1; } } dostartmoveanim( var_0 ) { if ( should_move_straight_ahead() ) { var_1 = 0; maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( self getlookaheaddir() ); } else var_1 = getstartmoveangleindex(); self scragentsetanimmode( "anim deltas" ); self scragentsetorientmode( "face angle abs", self.angles ); self.blockgoalpos = 1; maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_0, var_1, self.moveplaybackrate, var_0, "code_move" ); self scragentsetorientmode( "face motion" ); self.blockgoalpos = 0; } candostartmove() { if ( !isdefined( self.traversecomplete ) && !isdefined( self.skipstartmove ) && ( !isdefined( self.disableexits ) || self.disableexits == 0 ) ) return 1; else return 0; } getstartmovetype() { var_0 = self.previousanimstate; switch ( var_0 ) { case "traverse_jump": return "leap-to-run"; default: switch ( self.movemode ) { case "run": return "run-start"; case "walk": return "walk-start"; default: return "run-start"; } } } shoulddostopanim() { return isdefined( self.enablestop ) && self.enablestop == 1; } shoulddoleaparrivalanim( var_0, var_1 ) { if ( var_0.type == "Jump" || var_0.type == "Jump Attack" ) return 1; else if ( traversalstartfromidle( var_0.animscript ) ) return 1; else if ( incominganglestraightahead( maps\mp\alien\_utility::get_alien_type(), var_1 ) ) return 0; else return 1; } incominganglestraightahead( var_0, var_1 ) { switch ( var_0 ) { case "mammoth": case "elite": return var_1 == 4; default: return var_1 == 3 || var_1 == 4 || var_1 == 5; } } traversalstartfromidle( var_0 ) { switch ( var_0 ) { case "alien_climb_up_ledge_18_idle": case "alien_climb_up_ledge_18_run": case "climb_up_end_jump_side_r": case "climb_up_end_jump_side_l": case "alien_climb_up_over_56": case "alien_climb_up": return 1; default: return 0; } } candoturnanim( var_0 ) { var_1 = 16; var_2 = 10; var_3 = ( 0, 0, 16 ); if ( !isdefined( self getpathgoalpos() ) ) return 0; var_4 = getnotetracktimes( var_0, "code_move" ); var_5 = var_4[0]; var_6 = getmovedelta( var_0, 0, var_5 ); var_7 = self localtoworldcoords( var_6 ); var_7 = getgroundposition( var_7, self.radius ); if ( !isdefined( var_7 ) ) return 0; var_8 = self aiphysicstracepassed( self.origin + var_3, var_7 + var_3, self.radius - var_2, self.height - var_1 ); if ( var_8 ) return 1; else return 0; } shouldstartmove() { var_0 = getstartmoveangleindex(); return var_0 < 3 || var_0 > 5; } getstartmoveangleindex() { return maps\mp\agents\_scriptedagents::getangleindexfromselfyaw( self getlookaheaddir() ); }