/******************************************************************* * Decompiled By: Bog * Decompiled File: melee.gsc * Game: Call of Duty: Advanced Warfare * Platform: PC * Function Count: 61 * Decompile Time: 869 ms * Timestamp: 4/22/2024 2:00:37 AM *******************************************************************/ //Function Number: 1 init_animset_melee() { var_00 = []; var_00["standard"] = %melee_1; var_00["standard_stand_to_melee"] = %stand_2_melee_1; var_00["standard_run_to_melee"] = %run_2_melee_charge; var_00["aivai_exposed_attackerwins_attack"] = %melee_f_awin_attack; var_00["aivai_exposed_attackerwins_defend"] = %melee_f_awin_defend; var_00["aivai_exposed_attackerwins_defend_survive"] = %melee_f_awin_defend_survive; var_00["aivai_exposed_defenderwins_attack"] = %melee_f_dwin_attack; var_00["aivai_exposed_defenderwins_defend"] = %melee_f_dwin_defend; var_00["aivai_wrestle_attackerwins_attack"] = %bog_melee_r_attack; var_00["aivai_wrestle_attackerwins_defend"] = %bog_melee_r_defend; var_00["aivai_wrestle_attackerwins_defend_survive"] = %bog_melee_r_backdeath2; var_00["aivai_behind_attackerwins_attack"] = %melee_sync_attack; var_00["aivai_behind_attackerwins_defend"] = %melee_sync_defend; var_00["aivai_coverleft_attackerwins_attack"] = %cornersdl_melee_wina_attacker; var_00["aivai_coverleft_attackerwins_defend"] = %cornersdl_melee_wina_defender; var_00["aivai_coverleft_attackerwins_defend_survive"] = %cornersdl_melee_wina_defender_survive; var_00["aivai_coverleft_defenderwins_attack"] = %cornersdl_melee_wind_attacker; var_00["aivai_coverleft_defenderwins_attack_survive"] = %cornersdl_melee_wind_attacker_survive; var_00["aivai_coverleft_defenderwins_defend"] = %cornersdl_melee_wind_defender; var_00["aivai_coverright_attackerwins_attack"] = %cornersdr_melee_wina_attacker; var_00["aivai_coverright_attackerwins_defend"] = %cornersdr_melee_wina_defender; var_00["aivai_coverright_defenderwins_attack"] = %cornersdr_melee_wind_attacker; var_00["aivai_coverright_defenderwins_defend"] = %cornersdr_melee_wind_defender; level.archetypes["soldier"]["melee"] = var_00; } //Function Number: 2 melee_init() { precachemodel("weapon_parabolic_knife"); level._effect["melee_knife_ai"] = loadfx("vfx/weaponimpact/flesh_impact_knife"); } //Function Number: 3 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; } //Function Number: 4 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); } //Function Number: 5 melee_resetaction() { self.melee.target = self.enemy; self.melee.initiated = 0; self.melee.inprogress = 0; } //Function Number: 6 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; } //Function Number: 7 melee_updateandvalidatestartpos() { var_00 = 1; var_01 = distance2d(self.melee.startpos,self.melee.target.origin); if(var_01 < 32) { var_02 = 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_02 * 32 - var_01; if(distance(self.melee.startpos,self.melee.target.origin) < 31.9) { return 0; } var_00 = 0; } var_03 = self getdroptofloorposition(self.melee.startpos); if(!isdefined(var_03)) { return 0; } if(abs(self.melee.startpos[2] - var_03[2]) > 51.2) { return 0; } if(abs(self.origin[2] - var_03[2]) > 51.2) { return 0; } self.melee.startpos = var_03; if(!self maymovetopoint(self.melee.startpos,1,var_00)) { return 0; } if(isdefined(self.melee.starttotargetcornerangles)) { var_04 = self.melee.startpos - self.melee.target.origin; var_05 = anglestoforward(self.melee.starttotargetcornerangles); var_06 = vectordot(var_05,var_04); var_07 = self.melee.startpos - var_05 * var_06; var_08 = self.melee.target.origin - var_07; var_09 = distance2d(self.melee.target.origin,var_07); if(var_09 < 32) { var_07 = var_07 - var_08 * 32 - var_09 / 32; } } else { var_02 = vectornormalize((self.melee.startpos[0] - self.melee.target.origin[0],self.melee.startpos[1] - self.melee.target.origin[1],0)); var_07 = self.melee.target.origin + var_02 * 32; } if(!self maymovefrompointtopoint(self.melee.startpos,var_07,1,0)) { return 0; } if(!self maymovefrompointtopoint(var_07,self.melee.target.origin,1,1)) { return 0; } return 1; } //Function Number: 8 melee_isvalid() { if(!isdefined(self.melee.target)) { return 0; } var_00 = self.melee.target; if(isdefined(var_00.dontmelee)) { return 0; } var_01 = distancesquared(self.origin,var_00.origin); if(isdefined(self.meleechargedistsq)) { var_02 = self.meleechargedistsq; } else if(isplayer(var_01)) { var_02 = 40000; } else { var_02 = 25600; } if(!self.melee.initiated && var_01 > var_02) { 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_00) { 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_00)) { return 0; } if(isdefined(var_00.dontattackme) || isdefined(var_00.ignoreme) && var_00.ignoreme) { return 0; } if(!isai(var_00) && !isplayer(var_00)) { return 0; } if(isai(var_00)) { if(var_00 isinscriptedstate()) { return 0; } if(var_00 maps\_utility::doinglongdeath() || var_00.delayeddeath) { return 0; } } if(isplayer(var_00)) { var_03 = var_00 getstance(); } else { var_03 = var_01.a.pose; } if(var_03 != "stand" && var_03 != "crouch") { return 0; } if(isdefined(self.magic_bullet_shield) && isdefined(var_00.magic_bullet_shield)) { return 0; } if(isdefined(var_00.grenade)) { return 0; } if(self.melee.inprogress) { var_04 = 110; } else { var_04 = 60; } var_05 = angleclamp180(self.angles[1] - animscripts\utility::getyaw(var_00.origin)); if(abs(var_05) > var_04) { return 0; } if(var_01 <= 4096) { return 1; } if(self.melee.inprogress) { return 0; } if(isdefined(self.nextmeleechargetime) && isdefined(self.nextmeleechargetarget) && gettime() < self.nextmeleechargetime && self.nextmeleechargetarget == var_00) { return 0; } return 1; } //Function Number: 9 melee_startmovement() { self.melee.playingmovementanim = 1; self.a.movement = "run"; } //Function Number: 10 melee_stopmovement() { self clearanim(%body,0.2); self.melee.playingmovementanim = undefined; self.a.movement = "stop"; self orientmode("face default"); } //Function Number: 11 melee_mainloop() { self endon("killanimscript"); self endon("end_melee"); for(;;) { var_00 = self.melee.func; [[ self.melee.func ]](); if(!isdefined(self.melee.func) || var_00 == self.melee.func) { break; } } } //Function Number: 12 melee_standard_delaystandardcharge(param_00) { if(!isdefined(param_00)) { return; } self.nextmeleestandardchargetime = gettime() + 2500; self.nextmeleestandardchargetarget = param_00; } //Function Number: 13 melee_standard_checktimeconstraints() { var_00 = distancesquared(self.melee.target.origin,self.origin); if(var_00 > 4096 && isdefined(self.nextmeleestandardchargetime) && isdefined(self.nextmeleestandardchargetarget) && gettime() < self.nextmeleestandardchargetime && self.nextmeleestandardchargetarget == self.melee.target) { return 0; } return 1; } //Function Number: 14 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(); } //Function Number: 15 melee_standard_resetgiveuptime() { if(isdefined(self.meleechargedistsq)) { var_00 = self.meleechargedistsq; } else if(isplayer(self.melee.target)) { var_00 = 40000; } else { var_00 = 25600; } if(distancesquared(self.origin,self.melee.target.origin) > var_00) { self.melee.giveuptime = gettime() + 3000; return; } self.melee.giveuptime = gettime() + 1000; } //Function Number: 16 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(); if(isdefined(self.team)) { maps\_dds::dds_notify("act_melee",self.team == "allies"); } self orientmode("face point",self.melee.target.origin); var_00 = animscripts\utility::lookupanim("melee","standard"); self setflaggedanimknoballrestart("meleeanim",var_00,%body,1,0.2,1); melee_playfacialanim(var_00); self.melee.inprogress = 1; if(!melee_standard_playattackloop()) { melee_standard_delaystandardcharge(self.melee.target); break; } } self animmode("none"); } //Function Number: 17 melee_standard_playattackloop() { for(;;) { self waittill("meleeanim",var_00); if(var_00 == "end") { return 1; } if(var_00 == "stop") { if(!melee_chooseaction()) { return 0; } if(self.melee.func != ::melee_standard_main) { return 1; } } if(var_00 == "fire") { if(isdefined(self.melee.target)) { var_01 = self.melee.target.health; self melee(); if(isdefined(self.melee.target) && self.melee.target.health < var_01) { melee_standard_resetgiveuptime(); } } } } } //Function Number: 18 melee_standard_updateandvalidatetarget() { if(!isdefined(self.melee.target)) { return 0; } if(!melee_isvalid()) { return 0; } var_00 = vectornormalize(self.melee.target.origin - self.origin); self.melee.startpos = self.melee.target.origin - 40 * var_00; return melee_updateandvalidatestartpos(); } //Function Number: 19 melee_standard_getinposition() { if(!melee_standard_updateandvalidatetarget()) { return 0; } var_00 = common_scripts\utility::distance_2d_squared(self.origin,self.melee.target.origin); if(var_00 <= 4096) { var_01 = animscripts\utility::lookupanim("melee","standard_stand_to_melee"); self setflaggedanimknoball("readyanim",var_01,%body,1,0.3,1); melee_playfacialanim(var_01); animscripts\shared::donotetracks("readyanim"); return 1; } melee_playchargesound(); var_02 = self.melee.target.origin; var_03 = 0.1; var_04 = animscripts\utility::lookupanim("melee","standard_run_to_melee"); var_05 = length(getmovedelta(var_04,0,1)); var_06 = 32; var_07 = 48 + var_06 + var_05; var_08 = var_07 * var_07; var_09 = 64 + var_06; var_0A = var_09 * var_09; var_0B = getanimlength(var_04) * 1000; var_0C = var_0B - 100; var_0D = var_0B - 200; var_0E = 0; var_0F = undefined; var_10 = 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_10,%body,1,0.3,1); melee_playfacialanim(var_10); var_11 = 0; for(;;) { var_12 = gettime(); var_13 = isdefined(var_0F) && var_0F <= var_08; if(!var_11) { if(var_13) { melee_startmovement(); self setflaggedanimknoballrestart("chargeanim",var_04,%body,1,0.2,1); melee_playfacialanim(var_04); var_0E = var_12; var_11 = 1; } } else { var_14 = var_01 <= var_08; if(var_12 - var_0E >= var_0C || !var_13 && !var_14) { melee_startmovement(); self setflaggedanimknoball("chargeanim",var_10,%body,1,0.3,1); melee_playfacialanim(var_10); var_11 = 0; } } animscripts\notetracks::donotetracksfortime(var_03,"chargeanim"); if(!melee_standard_updateandvalidatetarget()) { melee_stopmovement(); return 0; } var_01 = common_scripts\utility::distance_2d_squared(self.origin,self.melee.target.origin); var_15 = self.melee.target.origin - var_02 * 1 / gettime() - var_12; var_02 = self.melee.target.origin; var_16 = self.melee.target.origin + var_15 * var_0D; var_0F = common_scripts\utility::distance_2d_squared(self.origin,var_16); if(var_11 && var_01 <= var_0A && gettime() - var_0E >= var_0C || !isplayer(self.melee.target)) { break; } if(!var_11 && gettime() >= self.melee.giveuptime) { melee_stopmovement(); return 0; } } melee_stopmovement(); return 1; } //Function Number: 20 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; } } } //Function Number: 21 melee_aivsai_exposed_chooseanimationandposition_flip(param_00) { var_01 = 90; if(self.melee.inprogress) { var_01 = var_01 + 50; } if(abs(param_00) < var_01) { return 0; } var_02 = self.melee.target; melee_decide_winner(); if(self.melee.winner) { self.melee.animname = animscripts\utility::lookupanim("melee","aivai_exposed_attackerwins_attack"); var_02.melee.animname = animscripts\utility::lookupanim("melee","aivai_exposed_attackerwins_defend"); var_02.melee.surviveanimname = animscripts\utility::lookupanim("melee","aivai_exposed_attackerwins_defend_survive"); } else { self.melee.animname = animscripts\utility::lookupanim("melee","aivai_exposed_defenderwins_attack"); var_02.melee.animname = animscripts\utility::lookupanim("melee","aivai_exposed_defenderwins_defend"); } return 1; } //Function Number: 22 melee_aivsai_exposed_chooseanimationandposition_wrestle(param_00) { var_01 = 100; if(self.melee.inprogress) { var_01 = var_01 + 50; } if(abs(param_00) < var_01) { return 0; } var_02 = self.melee.target; if(isdefined(var_02.magic_bullet_shield)) { return 0; } if(isdefined(var_02.meleealwayswin)) { return 0; } self.melee.winner = 1; self.melee.animname = animscripts\utility::lookupanim("melee","aivai_wrestle_attackerwins_attack"); var_02.melee.animname = animscripts\utility::lookupanim("melee","aivai_wrestle_attackerwins_defend"); var_02.melee.surviveanimname = animscripts\utility::lookupanim("melee","aivai_wrestle_attackerwins_defend_survive"); return 1; } //Function Number: 23 melee_aivsai_exposed_chooseanimationandposition_behind(param_00) { if(-90 > param_00 || param_00 > 0) { return 0; } var_01 = self.melee.target; if(isdefined(var_01.magic_bullet_shield)) { return 0; } if(isdefined(var_01.meleealwayswin)) { return 0; } self.melee.winner = 1; self.melee.animname = animscripts\utility::lookupanim("melee","aivai_behind_attackerwins_attack"); var_01.melee.animname = animscripts\utility::lookupanim("melee","aivai_behind_attackerwins_defend"); return 1; } //Function Number: 24 melee_aivsai_exposed_chooseanimationandposition_buildexposedlist() { if(isdefined(self.meleeforcedexposedflip)) { var_00[0] = ::melee_aivsai_exposed_chooseanimationandposition_flip; } else if(isdefined(self.meleeforcedexposedwrestle)) { var_00[0] = ::melee_aivsai_exposed_chooseanimationandposition_wrestle; } else { var_01 = randomint(2); var_02 = 1 - var_01; var_03 = 2; var_00[var_01] = ::melee_aivsai_exposed_chooseanimationandposition_flip; var_00[var_02] = ::melee_aivsai_exposed_chooseanimationandposition_wrestle; var_00[var_03] = ::melee_aivsai_exposed_chooseanimationandposition_behind; } return var_00; } //Function Number: 25 melee_aivsai_exposed_chooseanimationandposition() { var_00 = self.melee.target; var_01 = vectortoangles(var_00.origin - self.origin); var_02 = angleclamp180(var_00.angles[1] - var_01[1]); var_03 = melee_aivsai_exposed_chooseanimationandposition_buildexposedlist(); for(var_04 = 0;var_04 < var_03.size;var_04++) { if([[ var_03[var_04] ]](var_02)) { self.melee.startangles = (0,var_01[1],0); self.melee.startpos = getstartorigin(var_00.origin,var_00.angles,self.melee.animname); if(melee_updateandvalidatestartpos()) { return 1; } } } return 0; } //Function Number: 26 melee_decide_winner() { var_00 = self.melee.target; if(isdefined(self.meleealwayswin)) { self.melee.winner = 1; return; } else if(isdefined(var_00.meleealwayswin)) { self.melee.winner = 0; return; } if(isdefined(self.magic_bullet_shield)) { self.melee.winner = 1; return; } if(isdefined(var_00.magic_bullet_shield)) { self.melee.winner = 0; return; } self.melee.winner = common_scripts\utility::cointoss(); } //Function Number: 27 melee_aivsai_specialcover_chooseanimationandposition() { var_00 = self.melee.target; melee_decide_winner(); var_01 = var_00.covernode.type; if(var_01 == "Cover Multi") { var_01 = animscripts\utility::getcovermultipretendtype(var_00.covernode); } if(var_01 == "Cover Left") { if(self.melee.winner) { self.melee.animname = animscripts\utility::lookupanim("melee","aivai_coverleft_attackerwins_attack"); var_00.melee.animname = animscripts\utility::lookupanim("melee","aivai_coverleft_attackerwins_defend"); var_00.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_00.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_00.melee.animname = animscripts\utility::lookupanim("melee","aivai_coverright_attackerwins_defend"); } else { self.melee.animname = animscripts\utility::lookupanim("melee","aivai_coverright_defenderwins_attack"); var_00.melee.animname = animscripts\utility::lookupanim("melee","aivai_coverright_defenderwins_defend"); } self.melee.startpos = getstartorigin(var_00.covernode.origin,var_00.covernode.angles,self.melee.animname); self.melee.startangles = (var_00.covernode.angles[0],angleclamp180(var_00.covernode.angles[1] + 180),var_00.covernode.angles[2]); var_00.melee.faceyaw = animscripts\utility::getnodeforwardyaw(var_00.covernode); self.melee.starttotargetcornerangles = var_00.covernode.angles; if(!melee_updateandvalidatestartpos()) { self.melee.starttotargetcornerangles = undefined; return 0; } return 1; } //Function Number: 28 melee_aivsai_specialcover_canexecute() { var_00 = self.melee.target.covernode; if(!isdefined(var_00)) { return 0; } if(distancesquared(var_00.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_01 = vectortoangles(self.origin - var_00.origin); var_02 = angleclamp180(var_00.angles[1] - var_01[1]); var_03 = var_00.type; if(var_03 == "Cover Multi") { var_03 = animscripts\utility::getcovermultipretendtype(var_00); } if(var_03 == "Cover Left") { if(var_02 >= -50 && var_02 <= 0) { return 1; } } else if(var_03 == "Cover Right") { if(var_02 >= 0 && var_02 <= 50) { return 1; } } return 0; } //Function Number: 29 melee_aivsai_chooseaction() { var_00 = self.melee.target; if(!isai(var_00) || var_00.type != "human") { return 0; } if(self.stairsstate != "none" || var_00.stairsstate != "none") { return 0; } if(isdefined(self.meleealwayswin) && isdefined(var_00.meleealwayswin)) { return 0; } if(isdefined(self.magic_bullet_shield) && isdefined(var_00.magic_bullet_shield)) { return 0; } if((isdefined(self.meleealwayswin) && isdefined(var_00.magic_bullet_shield)) || isdefined(var_00.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_00.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_00.melee.faceyaw)) { var_00.melee.faceyaw = var_00.angles[1]; } self.melee.startposoffset = self.melee.startpos - var_00.origin; return 1; } //Function Number: 30 melee_aivsai_schedulenotetracklink(param_00) { self.melee.syncnotetrackent = param_00; param_00.melee.syncnotetrackent = undefined; } //Function Number: 31 melee_aivsai_targetlink(param_00) { if(!isdefined(param_00.melee)) { return; } melee_playchargesound(); if(!isalive(param_00)) { return; } self.syncedmeleetarget = param_00; param_00.syncedmeleetarget = self; self.melee.linked = 1; param_00.melee.linked = 1; self linktoblendtotag(param_00,"tag_sync",1,1); } //Function Number: 32 melee_aivsai_main() { if(!melee_aivsai_getinposition()) { self.nextmeleechargetime = gettime() + 1500; self.nextmeleechargetarget = self.melee.target; return; } var_00 = self.melee.target; melee_aivsai_schedulenotetracklink(var_00); if(self.melee.winner) { self.melee.death = undefined; var_00.melee.death = 1; } else { var_00.melee.death = undefined; self.melee.death = 1; } self.melee.partner = var_00; var_00.melee.partner = self; if(animscripts\utility::usingsidearm()) { maps\_utility::forceuseweapon(self.primaryweapon,"primary"); self.lastweapon = self.primaryweapon; } if(var_00 animscripts\utility::usingsidearm()) { var_00 maps\_utility::forceuseweapon(var_00.primaryweapon,"primary"); var_00.lastweapon = var_00.primaryweapon; } self.melee.weapon = self.weapon; self.melee.weaponslot = animscripts\utility::getcurrentweaponslotname(); var_00.melee.weapon = var_00.weapon; var_00.melee.weaponslot = var_00 animscripts\utility::getcurrentweaponslotname(); self.melee.inprogress = 1; var_00 animcustom(::melee_aivsai_execute,::melee_endscript); var_00 thread melee_aivsai_animcustominterruptionmonitor(self); self.melee.target = undefined; melee_aivsai_execute(); } //Function Number: 33 melee_aivsai_animcustominterruptionmonitor(param_00) { self endon("end_melee"); self endon("melee_aivsai_execute"); wait(0.1); if(isdefined(param_00)) { param_00 notify("end_melee"); } self notify("end_melee"); } //Function Number: 34 melee_aivsai_getinposition_updateandvalidatetarget(param_00,param_01) { if(isdefined(param_01) && param_01 <= gettime()) { return 0; } if(!melee_isvalid()) { return 0; } var_02 = self.melee.target; var_03 = distancesquared(var_02.origin,param_00); if(self.melee.precisepositioning) { var_04 = 256; } else { var_04 = 1296; } if(var_03 > var_04) { return 0; } self.melee.startpos = var_02.origin + self.melee.startposoffset; if(!melee_updateandvalidatestartpos()) { return 0; } return 1; } //Function Number: 35 melee_aivsai_getinposition_issuccessful(param_00) { var_01 = distancesquared((self.origin[0],self.origin[1],0),(self.melee.startpos[0],self.melee.startpos[1],0)); if(var_01 < 64 && abs(self.melee.startpos[2] - self.origin[2]) < 64) { return 1; } var_02 = distancesquared((param_00[0],param_00[1],0),(self.melee.startpos[0],self.melee.startpos[1],0)); var_03 = distancesquared((self.origin[0],self.origin[1],0),(self.melee.target.origin[0],self.melee.target.origin[1],0)); if(var_02 > var_03 && abs(self.melee.target.origin[2] - self.origin[2]) < 64) { return 1; } return 0; } //Function Number: 36 melee_aivsai_getinposition_finalize(param_00) { 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(param_00); } //Function Number: 37 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_00 = gettime() + 1500; var_01 = self.melee.target.origin; while(melee_aivsai_getinposition_updateandvalidatetarget(var_01,var_00)) { if(melee_aivsai_getinposition_issuccessful(var_01)) { return melee_aivsai_getinposition_finalize(var_01); } self orientmode("face point",self.melee.startpos); wait(0.05); } melee_stopmovement(); return 0; } //Function Number: 38 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_00 = animscripts\shared::donotetracks("meleeAnim",::melee_handlenotetracks); if(var_00 == "melee_death" && isdefined(self.melee.survive)) { melee_droppedweaponrestore(); self setflaggedanimknoballrestart("meleeAnim",self.melee.surviveanimname,%body,1,0.2); melee_playfacialanim(self.melee.surviveanimname); var_00 = animscripts\shared::donotetracks("meleeAnim",::melee_handlenotetracks); } if(isdefined(self.melee) && isdefined(self.melee.death)) { self kill(); } self.keepclaimednode = 0; } //Function Number: 39 melee_disableinterruptions() { self.melee.wasallowingpain = self.allowpain; self.melee.wasflashbangimmune = self.flashbangimmunity; maps\_utility::disable_pain(); maps\_utility::setflashbangimmunity(1); } //Function Number: 40 melee_needsweaponswap() { return isdefined(self.melee.weapon) && self.melee.weapon != "none" && self.weapon != self.melee.weapon; } //Function Number: 41 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; } } //Function Number: 42 melee_droppedweaponmonitorthread() { self endon("killanimscript"); self endon("end_melee"); self waittill("weapon_dropped",var_00); if(isdefined(var_00)) { self.melee.droppedweaponent = var_00; } } //Function Number: 43 melee_partnerendedmeleemonitorthread_shouldanimsurvive() { if(!isdefined(self.melee.surviveanimname)) { return 0; } if(!isdefined(self.melee.surviveanimallowed)) { return 0; } return 1; } //Function Number: 44 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(); return; } self.melee.death = undefined; if(melee_partnerendedmeleemonitorthread_shouldanimsurvive()) { self.melee.survive = 1; return; } self notify("end_melee"); return; } if(!isdefined(self.melee.unsynchappened)) { self notify("end_melee"); } } //Function Number: 45 melee_unlink() { if(!isdefined(self.melee.linked)) { return; } if(isdefined(self.syncedmeleetarget)) { self.syncedmeleetarget melee_unlinkinternal(); } melee_unlinkinternal(); } //Function Number: 46 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]); } //Function Number: 47 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; } } //Function Number: 48 melee_handlenotetracks_shoulddieafterunsync() { if(animhasnotetrack(self.melee.animname,"melee_death")) { return 0; } return isdefined(self.melee.death); } //Function Number: 49 melee_handlenotetracks_death(param_00) { if(isdefined(param_00) && param_00) { self.melee.interruptdeath = 1; return; } self.melee.animateddeath = 1; } //Function Number: 50 melee_handlenotetracks(param_00) { if(issubstr(param_00,"ps_")) { var_01 = getsubstr(param_00,3); self playsound(var_01); return; } if(var_01 == "sync") { if(isdefined(self.melee.syncnotetrackent)) { melee_aivsai_targetlink(self.melee.syncnotetrackent); self.melee.syncnotetrackent = undefined; return; } return; } if(var_01 == "unsync") { melee_handlenotetracks_unsync(); if(melee_handlenotetracks_shoulddieafterunsync()) { melee_handlenotetracks_death(); return; } return; } if(var_01 == "melee_interact") { self.melee.surviveanimallowed = 1; return; } if(var_01 == "melee_death") { if(isdefined(self.melee.survive)) { return var_01; } melee_handlenotetracks_death(); if(isdefined(self.melee.animateddeath)) { return var_01; } return; } if(var_01 == "attach_knife") { self attach("weapon_parabolic_knife","TAG_INHAND",1); self.melee.hasknife = 1; return; } if(var_01 == "detach_knife") { self detach("weapon_parabolic_knife","TAG_INHAND",1); self.melee.hasknife = undefined; return; } if(var_01 == "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); return; } return; } } //Function Number: 51 melee_deathhandler_regular() { self endon("end_melee"); animscripts\shared::dropallaiweapons(); return 0; } //Function Number: 52 melee_deathhandler_delayed() { self endon("end_melee"); animscripts\notetracks::donotetrackswithtimeout("meleeAnim",10); animscripts\shared::dropallaiweapons(); self startragdoll(); return 1; } //Function Number: 53 melee_endscript_checkdeath() { if(!isalive(self) && isdefined(self.melee.death)) { if(isdefined(self.melee.animateddeath)) { self.deathfunction = ::melee_deathhandler_delayed; return; } self.deathfunction = ::melee_deathhandler_regular; } } //Function Number: 54 melee_endscript_checkpositionandmovement() { if(!isalive(self)) { return; } if(isdefined(self.melee.playingmovementanim)) { melee_stopmovement(); } var_00 = self getdroptofloorposition(); if(isdefined(var_00)) { self forceteleport(var_00,self.angles); } } //Function Number: 55 melee_endscript_checkweapon() { if(isdefined(self.melee.hasknife)) { self detach("weapon_parabolic_knife","TAG_INHAND",1); } if(isalive(self)) { melee_droppedweaponrestore(); } } //Function Number: 56 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); } } //Function Number: 57 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(); } //Function Number: 58 melee_acquiremutex(param_00) { if(isdefined(self.melee)) { return 0; } if(isdefined(param_00.melee)) { return 0; } self.melee = spawnstruct(); param_00.melee = spawnstruct(); return 1; } //Function Number: 59 melee_releasemutex(param_00) { self.melee = undefined; if(isdefined(param_00)) { param_00.melee = undefined; } } //Function Number: 60 melee_playfacialanim(param_00) { self.facialidx = animscripts\face::playfacialanim(param_00,"pain",self.facialidx); } //Function Number: 61 melee_clearfacialanim() { self.facialidx = undefined; self clearanim(%head,0.2); }