2024-02-13 13:20:49 +01:00

1306 lines
36 KiB
Plaintext

// 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 );
}