// IW6 GSC SOURCE // Generated by https://github.com/xensik/gsc-tool #using_animtree("generic_human"); init_animset_melee() { var_0 = []; var_0["standard"] = %melee_1; var_0["standard_stand_to_melee"] = %stand_2_melee_1; var_0["standard_run_to_melee"] = %run_2_melee_charge; var_0["aivai_exposed_attackerwins_attack"] = %melee_f_awin_attack; var_0["aivai_exposed_attackerwins_defend"] = %melee_f_awin_defend; var_0["aivai_exposed_attackerwins_defend_survive"] = %melee_f_awin_defend_survive; var_0["aivai_exposed_defenderwins_attack"] = %melee_f_dwin_attack; var_0["aivai_exposed_defenderwins_defend"] = %melee_f_dwin_defend; var_0["aivai_wrestle_attackerwins_attack"] = %bog_melee_r_attack; var_0["aivai_wrestle_attackerwins_defend"] = %bog_melee_r_defend; var_0["aivai_wrestle_attackerwins_defend_survive"] = %bog_melee_r_backdeath2; var_0["aivai_behind_attackerwins_attack"] = %melee_sync_attack; var_0["aivai_behind_attackerwins_defend"] = %melee_sync_defend; var_0["aivai_coverleft_attackerwins_attack"] = %cornersdl_melee_wina_attacker; var_0["aivai_coverleft_attackerwins_defend"] = %cornersdl_melee_wina_defender; var_0["aivai_coverleft_attackerwins_defend_survive"] = %cornersdl_melee_wina_defender_survive; var_0["aivai_coverleft_defenderwins_attack"] = %cornersdl_melee_wind_attacker; var_0["aivai_coverleft_defenderwins_attack_survive"] = %cornersdl_melee_wind_attacker_survive; var_0["aivai_coverleft_defenderwins_defend"] = %cornersdl_melee_wind_defender; var_0["aivai_coverright_attackerwins_attack"] = %cornersdr_melee_wina_attacker; var_0["aivai_coverright_attackerwins_defend"] = %cornersdr_melee_wina_defender; var_0["aivai_coverright_defenderwins_attack"] = %cornersdr_melee_wind_attacker; var_0["aivai_coverright_defenderwins_defend"] = %cornersdr_melee_wind_defender; anim.archetypes["soldier"]["melee"] = var_0; } melee_init() { precachemodel( "weapon_parabolic_knife" ); level._effect["melee_knife_ai"] = loadfx( "fx/impacts/flesh_hit_knife" ); } melee_stealthcheck() { if ( !isdefined( self._stealth ) ) return 0; if ( isdefined( self.ent_flag ) && isdefined( self.ent_flag["_stealth_enabled"] ) && self.ent_flag["_stealth_enabled"] ) { if ( isdefined( self.ent_flag["_stealth_attack"] ) && !self.ent_flag["_stealth_attack"] ) return 1; } return 0; } melee_tryexecuting() { if ( !isdefined( self.enemy ) ) return 0; if ( isdefined( self.dontmelee ) ) return 0; if ( melee_stealthcheck() ) return 0; if ( !melee_acquiremutex( self.enemy ) ) return 0; melee_resetaction(); if ( !melee_chooseaction() ) { melee_releasemutex( self.enemy ); return 0; } self animcustom( ::melee_mainloop, ::melee_endscript ); } melee_resetaction() { self.melee.target = self.enemy; self.melee.initiated = 0; self.melee.inprogress = 0; } melee_chooseaction() { if ( !melee_isvalid() ) return 0; self.melee.initiated = 1; if ( melee_aivsai_chooseaction() ) { self.melee.func = ::melee_aivsai_main; return 1; } if ( melee_standard_chooseaction() ) { if ( isdefined( self.specialmelee_standard ) ) self.melee.func = self.specialmelee_standard; else self.melee.func = ::melee_standard_main; return 1; } self.melee.func = undefined; self.nextmeleechecktime = gettime() + 150; self.nextmeleechecktarget = self.melee.target; return 0; } melee_updateandvalidatestartpos() { var_0 = 1; var_1 = distance2d( self.melee.startpos, self.melee.target.origin ); if ( var_1 < 32 ) { var_2 = vectornormalize( ( self.melee.startpos[0] - self.melee.target.origin[0], self.melee.startpos[1] - self.melee.target.origin[1], 0 ) ); self.melee.startpos = self.melee.startpos + var_2 * ( 32 - var_1 ); var_0 = 0; } var_3 = self getdroptofloorposition( self.melee.startpos ); if ( !isdefined( var_3 ) ) return 0; if ( abs( self.melee.startpos[2] - var_3[2] ) > 51.2 ) return 0; if ( abs( self.origin[2] - var_3[2] ) > 51.2 ) return 0; self.melee.startpos = var_3; if ( !self maymovetopoint( self.melee.startpos, 1, var_0 ) ) return 0; if ( isdefined( self.melee.starttotargetcornerangles ) ) { var_4 = self.melee.startpos - self.melee.target.origin; var_5 = anglestoforward( self.melee.starttotargetcornerangles ); var_6 = vectordot( var_5, var_4 ); var_7 = self.melee.startpos - var_5 * var_6; var_8 = self.melee.target.origin - var_7; var_9 = distance2d( self.melee.target.origin, var_7 ); if ( var_9 < 32 ) var_7 = var_7 - var_8 * ( ( 32 - var_9 ) / 32 ); } else { var_2 = vectornormalize( ( self.melee.startpos[0] - self.melee.target.origin[0], self.melee.startpos[1] - self.melee.target.origin[1], 0 ) ); var_7 = self.melee.target.origin + var_2 * 32; } if ( !self maymovefrompointtopoint( self.melee.startpos, var_7, 1, 0 ) ) return 0; if ( !self maymovefrompointtopoint( var_7, self.melee.target.origin, 1, 1 ) ) return 0; return 1; } melee_isvalid() { if ( !isdefined( self.melee.target ) ) return 0; var_0 = self.melee.target; if ( isdefined( var_0.dontmelee ) ) return 0; var_1 = distancesquared( self.origin, var_0.origin ); if ( isdefined( self.meleechargedistsq ) ) var_2 = self.meleechargedistsq; else if ( isplayer( var_0 ) ) var_2 = 40000; else var_2 = 25600; if ( !self.melee.initiated && var_1 > var_2 ) return 0; if ( !isalive( self ) ) return 0; if ( isdefined( self.a.nofirstframemelee ) && self.a.scriptstarttime >= gettime() + 50 ) return 0; if ( isdefined( self.nextmeleechecktime ) && isdefined( self.nextmeleechecktarget ) && gettime() < self.nextmeleechecktime && self.nextmeleechecktarget == var_0 ) return 0; if ( isdefined( self.a.onback ) || self.a.pose == "prone" ) return 0; if ( animscripts\utility::usingsidearm() ) return 0; if ( isdefined( self.grenade ) && self.frontshieldanglecos == 1 ) return 0; if ( !isalive( var_0 ) ) return 0; if ( isdefined( var_0.dontattackme ) || isdefined( var_0.ignoreme ) && var_0.ignoreme ) return 0; if ( !isai( var_0 ) && !isplayer( var_0 ) ) return 0; if ( isai( var_0 ) ) { if ( var_0 isinscriptedstate() ) return 0; if ( var_0 maps\_utility::doinglongdeath() || var_0.delayeddeath ) return 0; } if ( isplayer( var_0 ) ) var_3 = var_0 getstance(); else var_3 = var_0.a.pose; if ( var_3 != "stand" && var_3 != "crouch" ) return 0; if ( isdefined( self.magic_bullet_shield ) && isdefined( var_0.magic_bullet_shield ) ) return 0; if ( isdefined( var_0.grenade ) ) return 0; if ( self.melee.inprogress ) var_4 = 110; else var_4 = 60; var_5 = angleclamp180( self.angles[1] - animscripts\utility::getyaw( var_0.origin ) ); if ( abs( var_5 ) > var_4 ) return 0; if ( var_1 <= 4096 ) return 1; if ( self.melee.inprogress ) return 0; if ( isdefined( self.nextmeleechargetime ) && isdefined( self.nextmeleechargetarget ) && gettime() < self.nextmeleechargetime && self.nextmeleechargetarget == var_0 ) return 0; return 1; } melee_startmovement() { self.melee.playingmovementanim = 1; self.a.movement = "run"; } melee_stopmovement() { self clearanim( %body, 0.2 ); self.melee.playingmovementanim = undefined; self.a.movement = "stop"; self orientmode( "face default" ); } melee_mainloop() { self endon( "killanimscript" ); self endon( "end_melee" ); for (;;) { var_0 = self.melee.func; [[ self.melee.func ]](); if ( !isdefined( self.melee.func ) || var_0 == self.melee.func ) break; } } melee_standard_delaystandardcharge( var_0 ) { if ( !isdefined( var_0 ) ) return; self.nextmeleestandardchargetime = gettime() + 2500; self.nextmeleestandardchargetarget = var_0; } melee_standard_checktimeconstraints() { var_0 = distancesquared( self.melee.target.origin, self.origin ); if ( var_0 > 4096 && isdefined( self.nextmeleestandardchargetime ) && isdefined( self.nextmeleestandardchargetarget ) && gettime() < self.nextmeleestandardchargetime && self.nextmeleestandardchargetarget == self.melee.target ) return 0; return 1; } melee_standard_chooseaction() { if ( isdefined( self.melee.target.magic_bullet_shield ) ) return 0; if ( !melee_standard_checktimeconstraints() ) return 0; if ( isdefined( self.melee.target.specialmeleechooseaction ) ) return 0; return melee_standard_updateandvalidatetarget(); } melee_standard_resetgiveuptime() { if ( isdefined( self.meleechargedistsq ) ) var_0 = self.meleechargedistsq; else if ( isplayer( self.melee.target ) ) var_0 = 40000; else var_0 = 25600; if ( distancesquared( self.origin, self.melee.target.origin ) > var_0 ) self.melee.giveuptime = gettime() + 3000; else self.melee.giveuptime = gettime() + 1000; } melee_standard_main() { self animmode( "zonly_physics" ); if ( isdefined( self.melee.target ) ) melee_standard_resetgiveuptime(); while ( isdefined( self.melee.target ) ) { if ( !melee_standard_getinposition() ) { self.nextmeleechargetime = gettime() + 1500; self.nextmeleechargetarget = self.melee.target; break; } if ( !isdefined( self.melee.target ) ) break; animscripts\battlechatter_ai::evaluatemeleeevent(); self orientmode( "face point", self.melee.target.origin ); var_0 = animscripts\utility::lookupanim( "melee", "standard" ); self setflaggedanimknoballrestart( "meleeanim", var_0, %body, 1, 0.2, 1 ); melee_playfacialanim( var_0 ); self.melee.inprogress = 1; if ( !melee_standard_playattackloop() ) { melee_standard_delaystandardcharge( self.melee.target ); break; } } self animmode( "none" ); } melee_standard_playattackloop() { for (;;) { self waittill( "meleeanim", var_0 ); if ( var_0 == "end" ) return 1; if ( var_0 == "stop" ) { if ( !melee_chooseaction() ) return 0; if ( self.melee.func != ::melee_standard_main ) return 1; } if ( var_0 == "fire" ) { if ( isdefined( self.melee.target ) ) { var_1 = self.melee.target.health; self melee(); if ( isdefined( self.melee.target ) && self.melee.target.health < var_1 ) melee_standard_resetgiveuptime(); } } } } melee_standard_updateandvalidatetarget() { if ( !isdefined( self.melee.target ) ) return 0; if ( !melee_isvalid() ) return 0; var_0 = vectornormalize( self.melee.target.origin - self.origin ); self.melee.startpos = self.melee.target.origin - 40.0 * var_0; return melee_updateandvalidatestartpos(); } melee_standard_getinposition() { if ( !melee_standard_updateandvalidatetarget() ) return 0; var_0 = common_scripts\utility::distance_2d_squared( self.origin, self.melee.target.origin ); if ( var_0 <= 4096 ) { var_1 = animscripts\utility::lookupanim( "melee", "standard_stand_to_melee" ); self setflaggedanimknoball( "readyanim", var_1, %body, 1, 0.3, 1 ); melee_playfacialanim( var_1 ); animscripts\shared::donotetracks( "readyanim" ); return 1; } melee_playchargesound(); var_2 = self.melee.target.origin; var_3 = 0.1; var_4 = animscripts\utility::lookupanim( "melee", "standard_run_to_melee" ); var_5 = length( getmovedelta( var_4, 0, 1 ) ); var_6 = 32; var_7 = 48.0 + var_6 + var_5; var_8 = var_7 * var_7; var_9 = 64 + var_6; var_10 = var_9 * var_9; var_11 = getanimlength( var_4 ) * 1000; var_12 = var_11 - 100; var_13 = var_11 - 200; var_14 = 0; var_15 = undefined; var_16 = animscripts\utility::lookupanim( "run", "straight" ); if ( isplayer( self.melee.target ) && self.melee.target == self.enemy ) self orientmode( "face enemy" ); else self orientmode( "face point", self.melee.target.origin ); self setflaggedanimknoball( "chargeanim", var_16, %body, 1, 0.3, 1 ); melee_playfacialanim( var_16 ); var_17 = 0; for (;;) { var_18 = gettime(); var_19 = isdefined( var_15 ) && var_15 <= var_8; if ( !var_17 ) { if ( var_19 ) { melee_startmovement(); self setflaggedanimknoballrestart( "chargeanim", var_4, %body, 1, 0.2, 1 ); melee_playfacialanim( var_4 ); var_14 = var_18; var_17 = 1; } } else { var_20 = var_0 <= var_8; if ( var_18 - var_14 >= var_12 || !var_19 && !var_20 ) { melee_startmovement(); self setflaggedanimknoball( "chargeanim", var_16, %body, 1, 0.3, 1 ); melee_playfacialanim( var_16 ); var_17 = 0; } } animscripts\notetracks::donotetracksfortime( var_3, "chargeanim" ); if ( !melee_standard_updateandvalidatetarget() ) { melee_stopmovement(); return 0; } var_0 = common_scripts\utility::distance_2d_squared( self.origin, self.melee.target.origin ); var_21 = ( self.melee.target.origin - var_2 ) * ( 1 / ( gettime() - var_18 ) ); var_2 = self.melee.target.origin; var_22 = self.melee.target.origin + var_21 * var_13; var_15 = common_scripts\utility::distance_2d_squared( self.origin, var_22 ); if ( var_17 && var_0 <= var_10 && ( gettime() - var_14 >= var_12 || !isplayer( self.melee.target ) ) ) break; if ( !var_17 && gettime() >= self.melee.giveuptime ) { melee_stopmovement(); return 0; } } melee_stopmovement(); return 1; } melee_playchargesound() { if ( !isdefined( self.a.nextmeleechargesound ) ) self.a.nextmeleechargesound = 0; if ( isdefined( self.enemy ) && isplayer( self.enemy ) || randomint( 3 ) == 0 ) { if ( gettime() > self.a.nextmeleechargesound ) { animscripts\face::saygenericdialogue( "meleecharge" ); self.a.nextmeleechargesound = gettime() + 8000; } } } melee_aivsai_exposed_chooseanimationandposition_flip( var_0 ) { var_1 = 90; if ( self.melee.inprogress ) var_1 = var_1 + 50; if ( abs( var_0 ) < var_1 ) return 0; var_2 = self.melee.target; melee_decide_winner(); if ( self.melee.winner ) { self.melee.animname = animscripts\utility::lookupanim( "melee", "aivai_exposed_attackerwins_attack" ); var_2.melee.animname = animscripts\utility::lookupanim( "melee", "aivai_exposed_attackerwins_defend" ); var_2.melee.surviveanimname = animscripts\utility::lookupanim( "melee", "aivai_exposed_attackerwins_defend_survive" ); } else { self.melee.animname = animscripts\utility::lookupanim( "melee", "aivai_exposed_defenderwins_attack" ); var_2.melee.animname = animscripts\utility::lookupanim( "melee", "aivai_exposed_defenderwins_defend" ); } return 1; } melee_aivsai_exposed_chooseanimationandposition_wrestle( var_0 ) { var_1 = 100; if ( self.melee.inprogress ) var_1 = var_1 + 50; if ( abs( var_0 ) < var_1 ) return 0; var_2 = self.melee.target; if ( isdefined( var_2.magic_bullet_shield ) ) return 0; if ( isdefined( var_2.meleealwayswin ) ) return 0; self.melee.winner = 1; self.melee.animname = animscripts\utility::lookupanim( "melee", "aivai_wrestle_attackerwins_attack" ); var_2.melee.animname = animscripts\utility::lookupanim( "melee", "aivai_wrestle_attackerwins_defend" ); var_2.melee.surviveanimname = animscripts\utility::lookupanim( "melee", "aivai_wrestle_attackerwins_defend_survive" ); return 1; } melee_aivsai_exposed_chooseanimationandposition_behind( var_0 ) { if ( -90 > var_0 || var_0 > 0 ) return 0; var_1 = self.melee.target; if ( isdefined( var_1.magic_bullet_shield ) ) return 0; if ( isdefined( var_1.meleealwayswin ) ) return 0; self.melee.winner = 1; self.melee.animname = animscripts\utility::lookupanim( "melee", "aivai_behind_attackerwins_attack" ); var_1.melee.animname = animscripts\utility::lookupanim( "melee", "aivai_behind_attackerwins_defend" ); return 1; } melee_aivsai_exposed_chooseanimationandposition_buildexposedlist() { if ( isdefined( self.meleeforcedexposedflip ) ) var_0[0] = ::melee_aivsai_exposed_chooseanimationandposition_flip; else if ( isdefined( self.meleeforcedexposedwrestle ) ) var_0[0] = ::melee_aivsai_exposed_chooseanimationandposition_wrestle; else { var_1 = randomint( 2 ); var_2 = 1 - var_1; var_3 = 2; var_0[var_1] = ::melee_aivsai_exposed_chooseanimationandposition_flip; var_0[var_2] = ::melee_aivsai_exposed_chooseanimationandposition_wrestle; var_0[var_3] = ::melee_aivsai_exposed_chooseanimationandposition_behind; } return var_0; } melee_aivsai_exposed_chooseanimationandposition() { var_0 = self.melee.target; var_1 = vectortoangles( var_0.origin - self.origin ); var_2 = angleclamp180( var_0.angles[1] - var_1[1] ); var_3 = melee_aivsai_exposed_chooseanimationandposition_buildexposedlist(); for ( var_4 = 0; var_4 < var_3.size; var_4++ ) { if ( [[ var_3[var_4] ]]( var_2 ) ) { self.melee.startangles = ( 0, var_1[1], 0 ); self.melee.startpos = getstartorigin( var_0.origin, var_0.angles, self.melee.animname ); if ( melee_updateandvalidatestartpos() ) return 1; } } return 0; } melee_decide_winner() { var_0 = self.melee.target; if ( isdefined( self.meleealwayswin ) ) { self.melee.winner = 1; return; } else if ( isdefined( var_0.meleealwayswin ) ) { self.melee.winner = 0; return; } if ( isdefined( self.magic_bullet_shield ) ) self.melee.winner = 1; else if ( isdefined( var_0.magic_bullet_shield ) ) self.melee.winner = 0; else self.melee.winner = common_scripts\utility::cointoss(); } melee_aivsai_specialcover_chooseanimationandposition() { var_0 = self.melee.target; melee_decide_winner(); var_1 = var_0.covernode.type; if ( var_1 == "Cover Multi" ) var_1 = animscripts\utility::getcovermultipretendtype( var_0.covernode ); if ( var_1 == "Cover Left" ) { if ( self.melee.winner ) { self.melee.animname = animscripts\utility::lookupanim( "melee", "aivai_coverleft_attackerwins_attack" ); var_0.melee.animname = animscripts\utility::lookupanim( "melee", "aivai_coverleft_attackerwins_defend" ); var_0.melee.surviveanimname = animscripts\utility::lookupanim( "melee", "aivai_coverleft_attackerwins_defend_survive" ); } else { self.melee.animname = animscripts\utility::lookupanim( "melee", "aivai_coverleft_defenderwins_attack" ); self.melee.surviveanimname = animscripts\utility::lookupanim( "melee", "aivai_coverleft_defenderwins_attack_survive" ); var_0.melee.animname = animscripts\utility::lookupanim( "melee", "aivai_coverleft_defenderwins_defend" ); } } else if ( self.melee.winner ) { self.melee.animname = animscripts\utility::lookupanim( "melee", "aivai_coverright_attackerwins_attack" ); var_0.melee.animname = animscripts\utility::lookupanim( "melee", "aivai_coverright_attackerwins_defend" ); } else { self.melee.animname = animscripts\utility::lookupanim( "melee", "aivai_coverright_defenderwins_attack" ); var_0.melee.animname = animscripts\utility::lookupanim( "melee", "aivai_coverright_defenderwins_defend" ); } self.melee.startpos = getstartorigin( var_0.covernode.origin, var_0.covernode.angles, self.melee.animname ); self.melee.startangles = ( var_0.covernode.angles[0], angleclamp180( var_0.covernode.angles[1] + 180 ), var_0.covernode.angles[2] ); var_0.melee.faceyaw = animscripts\utility::getnodeforwardyaw( var_0.covernode ); self.melee.starttotargetcornerangles = var_0.covernode.angles; if ( !melee_updateandvalidatestartpos() ) { self.melee.starttotargetcornerangles = undefined; return 0; } return 1; } melee_aivsai_specialcover_canexecute() { var_0 = self.melee.target.covernode; if ( !isdefined( var_0 ) ) return 0; if ( distancesquared( var_0.origin, self.melee.target.origin ) > 16 && isdefined( self.melee.target.a.covermode ) && ( self.melee.target.a.covermode != "hide" && self.melee.target.a.covermode != "lean" ) ) return 0; var_1 = vectortoangles( self.origin - var_0.origin ); var_2 = angleclamp180( var_0.angles[1] - var_1[1] ); var_3 = var_0.type; if ( var_3 == "Cover Multi" ) var_3 = animscripts\utility::getcovermultipretendtype( var_0 ); if ( var_3 == "Cover Left" ) { if ( var_2 >= -50 && var_2 <= 0 ) return 1; } else if ( var_3 == "Cover Right" ) { if ( var_2 >= 0 && var_2 <= 50 ) return 1; } return 0; } melee_aivsai_chooseaction() { var_0 = self.melee.target; if ( !isai( var_0 ) || var_0.type != "human" ) return 0; if ( self.stairsstate != "none" || var_0.stairsstate != "none" ) return 0; if ( isdefined( self.meleealwayswin ) && isdefined( var_0.meleealwayswin ) ) return 0; if ( isdefined( self.magic_bullet_shield ) && isdefined( var_0.magic_bullet_shield ) ) return 0; if ( isdefined( self.meleealwayswin ) && isdefined( var_0.magic_bullet_shield ) || isdefined( var_0.meleealwayswin ) && isdefined( self.magic_bullet_shield ) ) return 0; if ( isdefined( self.specialmeleechooseaction ) ) { if ( ![[ self.specialmeleechooseaction ]]() ) return 0; self.melee.precisepositioning = 1; } else if ( isdefined( var_0.specialmeleechooseaction ) ) return 0; else if ( melee_aivsai_specialcover_canexecute() && melee_aivsai_specialcover_chooseanimationandposition() ) self.melee.precisepositioning = 1; else { if ( !melee_aivsai_exposed_chooseanimationandposition() ) return 0; self.melee.precisepositioning = 0; } if ( !isdefined( var_0.melee.faceyaw ) ) var_0.melee.faceyaw = var_0.angles[1]; self.melee.startposoffset = self.melee.startpos - var_0.origin; return 1; } melee_aivsai_schedulenotetracklink( var_0 ) { self.melee.syncnotetrackent = var_0; var_0.melee.syncnotetrackent = undefined; } melee_aivsai_targetlink( var_0 ) { if ( !isdefined( var_0.melee ) ) return; melee_playchargesound(); if ( !isalive( var_0 ) ) return; self.syncedmeleetarget = var_0; var_0.syncedmeleetarget = self; self.melee.linked = 1; var_0.melee.linked = 1; self linktoblendtotag( var_0, "tag_sync", 1, 1 ); } melee_aivsai_main() { if ( !melee_aivsai_getinposition() ) { self.nextmeleechargetime = gettime() + 1500; self.nextmeleechargetarget = self.melee.target; return; } var_0 = self.melee.target; melee_aivsai_schedulenotetracklink( var_0 ); if ( self.melee.winner ) { self.melee.death = undefined; var_0.melee.death = 1; } else { var_0.melee.death = undefined; self.melee.death = 1; } self.melee.partner = var_0; var_0.melee.partner = self; if ( animscripts\utility::usingsidearm() ) { maps\_utility::forceuseweapon( self.primaryweapon, "primary" ); self.lastweapon = self.primaryweapon; } if ( var_0 animscripts\utility::usingsidearm() ) { var_0 maps\_utility::forceuseweapon( var_0.primaryweapon, "primary" ); var_0.lastweapon = var_0.primaryweapon; } self.melee.weapon = self.weapon; self.melee.weaponslot = animscripts\utility::getcurrentweaponslotname(); var_0.melee.weapon = var_0.weapon; var_0.melee.weaponslot = var_0 animscripts\utility::getcurrentweaponslotname(); self.melee.inprogress = 1; var_0 animcustom( ::melee_aivsai_execute, ::melee_endscript ); var_0 thread melee_aivsai_animcustominterruptionmonitor( self ); self.melee.target = undefined; melee_aivsai_execute(); } melee_aivsai_animcustominterruptionmonitor( var_0 ) { self endon( "end_melee" ); self endon( "melee_aivsai_execute" ); wait 0.1; if ( isdefined( var_0 ) ) var_0 notify( "end_melee" ); self notify( "end_melee" ); } melee_aivsai_getinposition_updateandvalidatetarget( var_0, var_1 ) { if ( isdefined( var_1 ) && var_1 <= gettime() ) return 0; if ( !melee_isvalid() ) return 0; var_2 = self.melee.target; var_3 = distancesquared( var_2.origin, var_0 ); if ( self.melee.precisepositioning ) var_4 = 256; else var_4 = 1296; if ( var_3 > var_4 ) return 0; self.melee.startpos = var_2.origin + self.melee.startposoffset; if ( !melee_updateandvalidatestartpos() ) return 0; return 1; } melee_aivsai_getinposition_issuccessful( var_0 ) { var_1 = distancesquared( ( self.origin[0], self.origin[1], 0 ), ( self.melee.startpos[0], self.melee.startpos[1], 0 ) ); if ( var_1 < 64 && abs( self.melee.startpos[2] - self.origin[2] ) < 64 ) return 1; var_2 = distancesquared( ( var_0[0], var_0[1], 0 ), ( self.melee.startpos[0], self.melee.startpos[1], 0 ) ); var_3 = distancesquared( ( self.origin[0], self.origin[1], 0 ), ( self.melee.target.origin[0], self.melee.target.origin[1], 0 ) ); if ( var_2 > var_3 && abs( self.melee.target.origin[2] - self.origin[2] ) < 64 ) return 1; return 0; } melee_aivsai_getinposition_finalize( var_0 ) { melee_stopmovement(); if ( self.melee.precisepositioning ) { self forceteleport( self.melee.startpos, self.melee.startangles ); wait 0.05; } else { self orientmode( "face angle", self.melee.startangles[1] ); wait 0.05; } return melee_aivsai_getinposition_updateandvalidatetarget( var_0 ); } melee_aivsai_getinposition() { if ( !melee_isvalid() ) return 0; melee_startmovement(); self clearanim( %body, 0.2 ); self setanimknoball( animscripts\run::getrunanim(), %body, 1, 0.2 ); self animmode( "zonly_physics" ); self.keepclaimednode = 1; var_0 = gettime() + 1500; var_1 = self.melee.target.origin; while ( melee_aivsai_getinposition_updateandvalidatetarget( var_1, var_0 ) ) { if ( melee_aivsai_getinposition_issuccessful( var_1 ) ) return melee_aivsai_getinposition_finalize( var_1 ); self orientmode( "face point", self.melee.startpos ); wait 0.05; } melee_stopmovement(); return 0; } melee_aivsai_execute() { self endon( "killanimscript" ); self endon( "end_melee" ); self notify( "melee_aivsai_execute" ); self animmode( "zonly_physics" ); self.a.special = "none"; self.specialdeathfunc = undefined; thread melee_droppedweaponmonitorthread(); thread melee_partnerendedmeleemonitorthread(); if ( isdefined( self.melee.faceyaw ) ) self orientmode( "face angle", self.melee.faceyaw ); else self orientmode( "face current" ); self.a.pose = "stand"; self clearanim( %body, 0.2 ); if ( isdefined( self.melee.death ) ) melee_disableinterruptions(); self setflaggedanimknoballrestart( "meleeAnim", self.melee.animname, %body, 1, 0.2 ); melee_playfacialanim( self.melee.animname ); var_0 = animscripts\shared::donotetracks( "meleeAnim", ::melee_handlenotetracks ); if ( var_0 == "melee_death" && isdefined( self.melee.survive ) ) { melee_droppedweaponrestore(); self setflaggedanimknoballrestart( "meleeAnim", self.melee.surviveanimname, %body, 1, 0.2 ); melee_playfacialanim( self.melee.surviveanimname ); var_0 = animscripts\shared::donotetracks( "meleeAnim", ::melee_handlenotetracks ); } if ( isdefined( self.melee ) && isdefined( self.melee.death ) ) self kill(); self.keepclaimednode = 0; } melee_disableinterruptions() { self.melee.wasallowingpain = self.allowpain; self.melee.wasflashbangimmune = self.flashbangimmunity; maps\_utility::disable_pain(); maps\_utility::setflashbangimmunity( 1 ); } melee_needsweaponswap() { return isdefined( self.melee.weapon ) && self.melee.weapon != "none" && self.weapon != self.melee.weapon; } melee_droppedweaponrestore() { if ( self.weapon != "none" && self.lastweapon != "none" ) return; if ( !isdefined( self.melee.weapon ) || self.melee.weapon == "none" ) return; maps\_utility::forceuseweapon( self.melee.weapon, self.melee.weaponslot ); if ( isdefined( self.melee.droppedweaponent ) ) { self.melee.droppedweaponent delete(); self.melee.droppedweaponent = undefined; } } melee_droppedweaponmonitorthread() { self endon( "killanimscript" ); self endon( "end_melee" ); self waittill( "weapon_dropped", var_0 ); if ( isdefined( var_0 ) ) self.melee.droppedweaponent = var_0; } melee_partnerendedmeleemonitorthread_shouldanimsurvive() { if ( !isdefined( self.melee.surviveanimname ) ) return 0; if ( !isdefined( self.melee.surviveanimallowed ) ) return 0; return 1; } melee_partnerendedmeleemonitorthread() { self endon( "killanimscript" ); self endon( "end_melee" ); self waittill( "partner_end_melee" ); if ( isdefined( self.melee.death ) ) { if ( isdefined( self.melee.animateddeath ) || isdefined( self.melee.interruptdeath ) ) self kill(); else { self.melee.death = undefined; if ( melee_partnerendedmeleemonitorthread_shouldanimsurvive() ) self.melee.survive = 1; else self notify( "end_melee" ); } } else if ( !isdefined( self.melee.unsynchappened ) ) self notify( "end_melee" ); } melee_unlink() { if ( !isdefined( self.melee.linked ) ) return; if ( isdefined( self.syncedmeleetarget ) ) self.syncedmeleetarget melee_unlinkinternal(); melee_unlinkinternal(); } melee_unlinkinternal() { self unlink(); self.syncedmeleetarget = undefined; if ( !isalive( self ) ) return; self.melee.linked = undefined; self animmode( "zonly_physics" ); self orientmode( "face angle", self.angles[1] ); } melee_handlenotetracks_unsync() { melee_unlink(); self.melee.unsynchappened = 1; if ( isdefined( self.melee.partner ) && isdefined( self.melee.partner.melee ) ) self.melee.partner.melee.unsynchappened = 1; } melee_handlenotetracks_shoulddieafterunsync() { if ( animhasnotetrack( self.melee.animname, "melee_death" ) ) return 0; return isdefined( self.melee.death ); } melee_handlenotetracks_death( var_0 ) { if ( isdefined( var_0 ) && var_0 ) self.melee.interruptdeath = 1; else self.melee.animateddeath = 1; } melee_handlenotetracks( var_0 ) { if ( issubstr( var_0, "ps_" ) ) { var_1 = getsubstr( var_0, 3 ); self playsound( var_1 ); } else if ( var_0 == "sync" ) { if ( isdefined( self.melee.syncnotetrackent ) ) { melee_aivsai_targetlink( self.melee.syncnotetrackent ); self.melee.syncnotetrackent = undefined; } } else if ( var_0 == "unsync" ) { melee_handlenotetracks_unsync(); if ( melee_handlenotetracks_shoulddieafterunsync() ) melee_handlenotetracks_death(); } else if ( var_0 == "melee_interact" ) self.melee.surviveanimallowed = 1; else if ( var_0 == "melee_death" ) { if ( isdefined( self.melee.survive ) ) return var_0; melee_handlenotetracks_death(); if ( isdefined( self.melee.animateddeath ) ) return var_0; } else if ( var_0 == "attach_knife" ) { self attach( "weapon_parabolic_knife", "TAG_INHAND", 1 ); self.melee.hasknife = 1; } else { if ( var_0 == "detach_knife" ) { self detach( "weapon_parabolic_knife", "TAG_INHAND", 1 ); self.melee.hasknife = undefined; return; } if ( var_0 == "stab" ) { self playsound( "melee_knife_hit_body" ); playfxontag( level._effect["melee_knife_ai"], self, "TAG_KNIFE_FX" ); if ( isdefined( self.melee.partner ) && isdefined( self.melee.partner.melee ) ) self.melee.partner melee_handlenotetracks_death( 1 ); } } } melee_deathhandler_regular() { self endon( "end_melee" ); animscripts\shared::dropallaiweapons(); return 0; } melee_deathhandler_delayed() { self endon( "end_melee" ); animscripts\notetracks::donotetrackswithtimeout( "meleeAnim", 10.0 ); animscripts\shared::dropallaiweapons(); self startragdoll(); return 1; } melee_endscript_checkdeath() { if ( !isalive( self ) && isdefined( self.melee.death ) ) { if ( isdefined( self.melee.animateddeath ) ) self.deathfunction = ::melee_deathhandler_delayed; else self.deathfunction = ::melee_deathhandler_regular; } } melee_endscript_checkpositionandmovement() { if ( !isalive( self ) ) return; if ( isdefined( self.melee.playingmovementanim ) ) melee_stopmovement(); var_0 = self getdroptofloorposition(); if ( isdefined( var_0 ) ) self forceteleport( var_0, self.angles ); else { } } melee_endscript_checkweapon() { if ( isdefined( self.melee.hasknife ) ) self detach( "weapon_parabolic_knife", "TAG_INHAND", 1 ); if ( isalive( self ) ) melee_droppedweaponrestore(); } melee_endscript_checkstatechanges() { if ( isdefined( self.melee.wasallowingpain ) ) { if ( self.melee.wasallowingpain ) maps\_utility::enable_pain(); else maps\_utility::disable_pain(); } if ( isdefined( self.melee.wasflashbangimmune ) ) maps\_utility::setflashbangimmunity( self.melee.wasflashbangimmune ); } melee_endscript() { melee_unlink(); melee_endscript_checkdeath(); melee_endscript_checkpositionandmovement(); melee_endscript_checkweapon(); melee_endscript_checkstatechanges(); if ( isdefined( self.melee.partner ) ) self.melee.partner notify( "partner_end_melee" ); melee_releasemutex( self.melee.target ); melee_clearfacialanim(); } melee_acquiremutex( var_0 ) { if ( isdefined( self.melee ) ) return 0; if ( isdefined( var_0.melee ) ) return 0; self.melee = spawnstruct(); var_0.melee = spawnstruct(); return 1; } melee_releasemutex( var_0 ) { self.melee = undefined; if ( isdefined( var_0 ) ) var_0.melee = undefined; } melee_playfacialanim( var_0 ) { self.facialidx = animscripts\face::playfacialanim( var_0, "pain", self.facialidx ); } melee_clearfacialanim() { self.facialidx = undefined; self clearanim( %head, 0.2 ); }