/******************************************************************* * Decompiled By: Bog * Decompiled File: swim.gsc * Game: Call of Duty: Advanced Warfare * Platform: PC * Function Count: 63 * Decompile Time: 920 ms * Timestamp: 4/22/2024 2:01:03 AM *******************************************************************/ //Function Number: 1 moveswim() { self endon("movemode"); self orientmode("face enemy or motion"); if(animscripts\utility::isspaceai()) { self.turnrate = 0.16; } else { self.turnrate = 0.03; } animscripts\utility::updateisincombattimer(); if(animscripts\utility::isincombat(0)) { moveswim_combat(); return; } moveswim_noncombat(); } //Function Number: 2 swim_begin() { self.swim = spawnstruct(); self.swim.combatstate = "nostate"; self.swim.movestate = "combat_stationary"; self.swim.trackstate = "track_none"; self.swim.statefns = []; self.swim.statefns["nostate"] = [::swim_null,::swim_null]; self.swim.statefns["noncombat"] = [::moveswim_noncombat_enter,::moveswim_noncombat_exit]; self.swim.statefns["combat"] = [::moveswim_combat_enter,::moveswim_combat_exit]; self.swim.statefns["combat_stationary"] = [::swim_null,::swim_null]; self.swim.statefns["combat_forward"] = [::moveswim_combat_forward_enter,::moveswim_combat_forward_exit]; self.swim.statefns["combat_strafe"] = [::moveswim_combat_strafe_enter,::moveswim_combat_strafe_exit]; self.swim.statefns["track_none"] = [::swim_null,::swim_null]; self.swim.statefns["track_forward"] = [::swim_track_forward_enter,::swim_track_forward_exit]; self.swim.statefns["track_strafe"] = [::swim_track_strafe_enter,::swim_track_strafe_exit]; self setanimlimited(getswimanim("aim_stand_D")); self setanimlimited(getswimanim("aim_stand_U")); self setanimlimited(getswimanim("aim_stand_L")); self setanimlimited(getswimanim("aim_stand_R")); self.custommovetransition = ::swim_movebegin; self.permanentcustommovetransition = 1; self.pathturnanimoverridefunc = ::swim_pathchange_getturnanim; self.pathturnanimblendtime = 0.2; } //Function Number: 3 swim_end() { self.swim = undefined; if(animscripts\utility::isspaceai()) { self.turnrate = 0.16; return; } self.turnrate = 0.3; } //Function Number: 4 swim_null() { } //Function Number: 5 swim_moveend() { moveswim_set("nostate"); swim_clearleananims(); if(isdefined(self.prevturnrate)) { self.turnrate = self.prevturnrate; self.prevturnrate = undefined; } } //Function Number: 6 moveswim_noncombat() { if(self.swim.combatstate != "noncombat") { moveswim_set("noncombat"); } var_00 = self.swim.move_noncombat_anim; var_01 = 0.4; if(animscripts\utility::isspaceai()) { var_01 = 0.2; } self setflaggedanimknob("swimanim",var_00,1,var_01,self.moveplaybackrate); swim_updateleananim(); animscripts\notetracks::donotetracksfortime(0.2,"swimanim"); } //Function Number: 7 moveswim_combat() { if(self.swim.combatstate != "combat") { moveswim_set("combat"); } if(isdefined(self.enemy)) { animscripts\run::setshootwhilemoving(1); if(!self.facemotion) { swim_dostrafe(); return; } else { if(self.swim.movestate != "combat_forward") { moveswim_combat_move_set("combat_forward"); } if(isdefined(self.bclearstrafeturnrate) && self.bclearstrafeturnrate && lengthsquared(self.velocity)) { var_00 = vectortoangles(self.velocity); if(abs(angleclamp180(var_00[1] - self.angles[1])) > 35) { self.turnrate = 0.18; if(animscripts\utility::isspaceai()) { self.turnrate = 0.2; } } else { if(animscripts\utility::isspaceai()) { self.turnrate = 0.16; } else { self.turnrate = 0.03; } self.bclearstrafeturnrate = undefined; } } else { self.bclearstrafeturnrate = undefined; } var_01 = getswimanim("forward_aim"); } } else { if(self.swim.movestate != "combat_forward") { moveswim_combat_move_set("combat_forward"); } animscripts\run::setshootwhilemoving(0); var_01 = getswimanim("forward_aim"); } var_02 = 0.4; if(animscripts\utility::isspaceai()) { var_02 = 0.2; } swim_updateleananim(); self setflaggedanimknob("swimanim",var_01,1,var_02,self.moveplaybackrate); animscripts\notetracks::donotetracksfortime(0.2,"swimanim"); } //Function Number: 8 moveswim_set(param_00) { if(param_00 == self.swim.combatstate) { return; } [[ self.swim.statefns[self.swim.combatstate][1] ]](); [[ self.swim.statefns[param_00][0] ]](); self.swim.combatstate = param_00; } //Function Number: 9 moveswim_noncombat_enter() { if(self.swim.trackstate != "track_none") { swim_track_set("track_none"); } swim_setleananims(); thread moveswim_noncombat_twitchupdate(); } //Function Number: 10 moveswim_noncombat_exit() { self notify("end_MoveSwim_NonCombat_TwitchUpdate"); } //Function Number: 11 moveswim_combat_enter() { self setanimknob(%combatrun,1,0.5,self.moveplaybackrate); if(self.swim.movestate != "combat_forward") { moveswim_combat_move_set("combat_forward"); } } //Function Number: 12 moveswim_combat_exit() { moveswim_combat_move_set("combat_stationary"); } //Function Number: 13 moveswim_combat_move_set(param_00) { if(param_00 == self.swim.movestate) { return; } [[ self.swim.statefns[self.swim.movestate][1] ]](); [[ self.swim.statefns[param_00][0] ]](); self.swim.movestate = param_00; } //Function Number: 14 moveswim_combat_forward_enter() { if(self.swim.trackstate != "track_forward") { swim_track_set("track_forward"); } swim_setleananims(); } //Function Number: 15 moveswim_combat_forward_exit() { } //Function Number: 16 moveswim_combat_strafe_enter() { self setanimknoblimited(getswimanim("strafe_B"),1,0.1,self.sidesteprate,1); self setanimknoblimited(getswimanim("strafe_L"),1,0.1,self.sidesteprate,1); self setanimknoblimited(getswimanim("strafe_R"),1,0.1,self.sidesteprate,1); if(self.swim.trackstate != "track_strafe") { swim_track_set("track_strafe"); } swim_clearleananims(); if(animscripts\utility::isspaceai()) { self.turnrate = 0.25; return; } self.turnrate = 0.18; self.jumping = 1; } //Function Number: 17 moveswim_combat_strafe_exit() { self clearanim(%combatrun_forward,0.2); self clearanim(%combatrun_backward,0.2); self clearanim(%combatrun_left,0.2); self clearanim(%combatrun_right,0.2); if(animscripts\utility::isspaceai()) { self.turnrate = 0.16; } else { self.turnrate = 0.03; self.jumping = 0; } self.bclearstrafeturnrate = 1; } //Function Number: 18 swim_track_set(param_00) { if(self.swim.trackstate == param_00) { return; } [[ self.swim.statefns[self.swim.trackstate][1] ]](); [[ self.swim.statefns[param_00][0] ]](); self.swim.trackstate = param_00; } //Function Number: 19 swim_track_forward_enter() { self setanimlimited(getswimanim("aim_move_D")); self setanimlimited(getswimanim("aim_move_L")); self setanimlimited(getswimanim("aim_move_R")); self setanimlimited(getswimanim("aim_move_U")); thread moveswim_track_combat(); } //Function Number: 20 swim_track_forward_exit() { self clearanim(%aim_2,0.2); self clearanim(%aim_4,0.2); self clearanim(%aim_6,0.2); self clearanim(%aim_8,0.2); } //Function Number: 21 swim_track_strafe_enter() { } //Function Number: 22 swim_track_strafe_exit() { self clearanim(%w_aim_4,0.2); self clearanim(%w_aim_6,0.2); self clearanim(%w_aim_8,0.2); self clearanim(%w_aim_2,0.2); } //Function Number: 23 moveswim_track_combat() { self endon("killanimscript"); self endon("end_face_enemy_tracking"); if(!isdefined(self.aim_while_moving_thread)) { self.aim_while_moving_thread = 1; animscripts\combat::set_default_aim_limits(); if(animscripts\utility::isspaceai()) { self.rightaimlimit = 90; self.leftaimlimit = -90; } animscripts\track::trackloop(%w_aim_2,%w_aim_4,%w_aim_6,%w_aim_8); } } //Function Number: 24 getswimanim(param_00,param_01) { var_02 = animscripts\utility::lookupanim("swim",param_00); if(isdefined(param_01)) { return var_02[param_01]; } return var_02; } //Function Number: 25 moveswim_noncombat_twitchupdate() { var_00 = getswimanim("forward"); self.swim.move_noncombat_anim = var_00; } //Function Number: 26 swim_shoulddonodeexit() { if(isdefined(self.disableexits)) { return 0; } if(!isdefined(self.pathgoalpos)) { return 0; } var_00 = self.maxfaceenemydist; self.maxfaceenemydist = 128; if(!self shouldfacemotion()) { self.maxfaceenemydist = var_00; return 0; } self.maxfaceenemydist = var_00; var_01 = 10000; if(animscripts\utility::isspaceai()) { var_01 = 32400; } if(distancesquared(self.origin,self.pathgoalpos) < var_01) { return 0; } if(self.a.movement != "stop") { return 0; } if(lengthsquared(self.prevanimdelta) > 1) { var_02 = vectortoangles(self.prevanimdelta); if(abs(angleclamp180(var_02[1] - self.angles[1])) < 90) { var_03 = vectortoangles(self.lookaheaddir); if(abs(angleclamp180(var_03[1] - self.angles[1])) < 90) { return 0; } } } return 1; } //Function Number: 27 swim_movebegin() { self.a.pose = "stand"; if(!swim_shoulddonodeexit()) { return; } var_00 = swim_choosestart(); if(!isdefined(var_00)) { return; } var_01 = var_00.m_turnanim; var_02 = var_00.m_anim; var_03 = var_00.m_angledelta; var_04 = vectortoangles(self.lookaheaddir); var_05 = var_04 - var_03; var_06 = anglestoforward(var_05); var_07 = animscripts\exit_node::getexitnode(); if(animscripts\utility::isspaceai() && isdefined(var_07)) { var_08 = swim_getapproachtype(var_07); if(var_08 != "exposed") { var_09 = getnodeforwardangles(var_07); var_06 = anglestoforward(var_09); } else { var_06 = anglestoforward(self.angles); } } self animmode("nogravity",0); var_0A = randomfloatrange(0.9,1.1); var_0B = 0.3; self orientmode("face angle 3d",self.angles); if(isdefined(var_01) && !animscripts\utility::isspaceai()) { self setflaggedanimknoballrestart("startturn",var_01,%body,1,0.3,var_0A * self.moveplaybackrate); animscripts\shared::donotetracks("startturn"); var_0B = 0.5; } else if(isdefined(var_01) && animscripts\utility::isspaceai()) { if(isdefined(var_07)) { self orientmode("face direction",var_06); } self.prevturnrate = 0.16; self.turnrate = 5; var_0B = 0.1; self setflaggedanimknoballrestart("startturn",var_01,%body,1,var_0B,var_0A * self.moveplaybackrate); animscripts\shared::donotetracks("startturn"); var_0B = 0.5; self.turnrate = 0.16; self.prevturnrate = undefined; var_0C = getangledelta(var_01); var_07 = animscripts\exit_node::getexitnode(); var_06 = anglestoforward(self.angles); if(isdefined(var_07)) { var_08 = swim_getapproachtype(var_07); if(var_08 != "exposed") { var_09 = getnodeforwardangles(var_07); var_09 = (var_09[0],var_09[1] - var_0C,var_09[2]); var_06 = anglestoforward(var_09); } } } var_0D = var_04 - self.angles; var_0E = getanimlength(var_02); var_0F = 0.001 * abs(angleclamp180(var_0D[1] - var_03[1])) / var_0E; var_10 = 0.001 * abs(angleclamp180(var_0D[0] - var_03[0])) / var_0E; var_11 = max(var_0F,var_10); if(var_11 < 0.01) { var_11 = 0.01; } if(animscripts\utility::isspaceai()) { var_0B = 0.05; self.turnrate = 0.16; var_11 = 5; } self.prevturnrate = self.turnrate; self.turnrate = var_11; self orientmode("face direction",var_06); self setflaggedanimknoballrestart("startmove",var_02,%body,1,var_0B,var_0A * self.moveplaybackrate); animscripts\shared::donotetracks("startmove"); self.turnrate = self.prevturnrate; self.prevturnrate = undefined; self orientmode("face default"); self animmode("none",0); if(animscripts\utility::isspaceai()) { if(animhasnotetrack(var_02,"finish")) { animscripts\shared::donotetracks("startmove"); } var_12 = 65536; var_13 = self.goalpos; if(isdefined(self.node)) { var_13 = self.node.origin; } if(distance2dsquared(self.origin,var_13) > var_12) { self notify("force_space_rotation_update",0,0,undefined,1); } } if(animscripts\utility::isspaceai()) { return 0.2; } return 0.4; } //Function Number: 28 swim_setleananims() { self setanimlimited(getswimanim("turn_add_l")); self setanimlimited(getswimanim("turn_add_r")); self setanimlimited(getswimanim("turn_add_u")); self setanimlimited(getswimanim("turn_add_d")); self.prevleanfracyaw = 0; self.prevleanfracpitch = 0; } //Function Number: 29 swim_clearleananims() { self clearanim(%add_turn_l,0.2); self clearanim(%add_turn_r,0.2); self clearanim(%add_turn_u,0.2); self clearanim(%add_turn_d,0.2); self.prevleanfracyaw = undefined; self.prevleanfracpitch = undefined; } //Function Number: 30 swim_choosestart() { var_00 = animscripts\utility::isincombat(); var_01 = animscripts\exit_node::getexitnode(); var_02 = self.angles; var_03 = 0; var_04 = 0; var_05 = 0; var_06 = vectortoangles(self.lookaheaddir); var_07 = animscripts\utility::gettruenodeangles(var_01); if(animscripts\utility::isspaceai() && var_07[2]) { if(var_07[2] != 0) { var_08 = anglestoforward(var_07); var_09 = self.goalpos; if(isdefined(self.node)) { var_09 = self.node.origin; } var_0A = rotatepointaroundvector(var_08,var_09 - self.origin,var_07[2] * -1); var_0B = var_0A + self.origin; var_0C = var_0B - self.origin; var_0C = vectornormalize(var_0C); var_06 = vectortoangles(var_0C); var_05 = 1; } } var_0D = undefined; var_0E = undefined; if(isdefined(var_01) && isdefined(var_01.type)) { var_0E = swim_getapproachtype(var_01); if(var_0E != "exposed") { var_0D = "exit_" + var_0E; var_02 = var_01.angles; if(animscripts\utility::isspaceai()) { var_02 = animscripts\utility::gettruenodeangles(var_01); if(var_05 == 1) { var_02 = (var_02[0],var_02[1],0); } } else { var_02 = var_01.angles; } var_03 = 1; } } if(!isdefined(var_0D)) { if(var_00) { var_0D = "idle_ready_to_forward"; } else { var_0D = "idle_to_forward"; var_04 = 1; var_03 = 1; } } var_0F = getswimanim(var_0D); var_10 = angleclamp180(var_06[1] - var_02[1]); var_11 = angleclamp180(var_06[0] - var_02[0]); var_12 = undefined; if(animscripts\utility::isspaceai()) { var_12 = 3; } var_13 = swim_getangleindex(var_10,var_12); var_14 = swim_getangleindex(var_11,var_12); var_15 = var_0E; if(!isdefined(var_15) && isdefined(self.prevnode) && distance2dsquared(self.prevnode.origin,self.origin) < 36) { var_15 = swim_getapproachtype(self.prevnode); } if(var_13 == 4 && isdefined(var_15)) { var_16 = isdefined(var_0E); if(var_15 == "cover_corner_l" && var_10 < -10 && !var_16 || isdefined(var_0F[2])) { var_13 = 2; } else if(var_15 == "cover_corner_r" && var_10 > 10 && !var_16 || isdefined(var_0F[6])) { var_13 = 6; } } if(!isdefined(var_0F[var_13])) { var_0D = "idle_to_forward"; var_0F = getswimanim(var_0D); var_04 = 1; } var_17 = spawnstruct(); if(var_04) { var_18 = getswimanim("idle_turn"); if(!isdefined(var_18[var_13])) { var_19 = 0; var_1A = 8; while(!isdefined(var_0F[var_19]) && var_19 < 8) { var_19++; } while(!isdefined(var_0F[var_1A]) && var_1A > 0) { var_1A--; } if(var_13 < var_19) { var_13 = var_19; } else if(var_13 > var_1A) { var_13 = var_1A; } } var_17.m_turnanim = var_18[var_13]; var_13 = 4; } if(isdefined(var_0F[var_13]) && isdefined(var_0F[var_13][var_14])) { var_17.m_anim = var_0F[var_13][var_14]; if(var_03) { var_0F = getswimanim(var_0D + "_angleDelta"); var_17.m_angledelta = var_0F[var_13][var_14]; } else { var_17.m_angledelta = (0,0,0); } return var_17; } var_17 = undefined; return undefined; } //Function Number: 31 swim_setupapproach() { self endon("killanimscript"); self endon("swim_cancelapproach"); thread swim_restartapproachlistener(); if(isdefined(self.disablearrivals) && self.disablearrivals) { return; } self.swim.arrivalpathgoalpos = self.pathgoalpos; if(isdefined(self getnegotiationstartnode())) { return; } var_00 = animscripts\cover_arrival::getapproachent(); if(isdefined(var_00) && swim_isapproachablenode(var_00)) { thread swim_approachnode(); return; } thread swim_approachpos(); } //Function Number: 32 swim_restartapproachlistener() { self endon("killanimscript"); self endon("swim_killrestartlistener"); self waittill("path_set"); var_00 = isdefined(self.pathgoalpos) && isdefined(self.swim.arrivalpathgoalpos) && distancesquared(self.pathgoalpos,self.swim.arrivalpathgoalpos) < 4; if(var_00) { thread swim_restartapproachlistener(); return; } swim_cancelcurrentapproach(); swim_setupapproach(); } //Function Number: 33 swim_cancelcurrentapproach() { self notify("swim_cancelapproach"); self.stopanimdistsq = 0; } //Function Number: 34 swim_waitforapproachpos(param_00,param_01) { self endon("swim_cancelwaitforapproachpos"); var_02 = param_01 + 60 * param_01 + 60; var_03 = distancesquared(param_00,self.origin); if(var_03 <= var_02) { return; } self.stopanimdistsq = var_02; self waittill("stop_soon"); self.stopanimdistsq = 0; } //Function Number: 35 swim_approachpos() { self endon("killanimscript"); self endon("swim_cancelapproach"); self endon("move_interrupt"); self endon("swim_killrestartlistener"); if(!isdefined(self.pathgoalpos)) { return; } var_00 = swim_getmaxanimdist("arrival_exposed"); swim_waitforapproachpos(self.pathgoalpos,var_00); swim_doposarrival(); } //Function Number: 36 swim_approachnode() { self endon("killanimscript"); self endon("swim_cancelapproach"); self endon("swim_killrestartlistener"); var_00 = animscripts\cover_arrival::getapproachent(); self.approachtype = swim_getapproachtype(var_00); self.requestarrivalnotify = 1; self waittill("cover_approach",var_01); var_00 = animscripts\cover_arrival::getapproachent(); var_02 = swim_getapproachtype(var_00); if(var_02 == "exposed") { if(isdefined(var_00)) { var_03 = var_00.origin; } else { var_03 = self.pathgoalpos; } var_04 = var_03 - self.origin; var_05 = vectortoangles(var_04); var_06 = (0,var_05[1],0); var_07 = (0,var_05[1],0); } else { var_03 = var_03.origin; var_06 = getnodeforwardangles(var_02); if(animscripts\utility::isspaceai()) { var_07 = animscripts\utility::gettruenodeangles(var_01); } else { var_07 = var_01.angles; } } thread swim_dofinalarrival(var_02,var_03,var_01,var_07,var_06); } //Function Number: 37 swim_doposarrival() { var_00 = animscripts\cover_arrival::getapproachent(); var_01 = self.pathgoalpos; var_02 = (0,self.angles[1],self.angles[2]); if(isdefined(var_00) && var_00.type != "Path" && var_00.type != "Path 3D") { var_02 = getnodeforwardangles(var_00); } else if(animscripts\cover_arrival::faceenemyatendofapproach()) { var_02 = vectortoangles(self.enemy.origin - var_01); } var_03 = vectornormalize(var_01 - self.origin); if(isdefined(var_00) && swim_isapproachablenode(var_00)) { var_04 = swim_getapproachtype(var_00); var_05 = getnodeforwardangles(var_00); var_02 = var_00.angles; if(animscripts\utility::isspaceai()) { var_02 = animscripts\utility::gettruenodeangles(var_00); } thread swim_dofinalarrival(var_04,var_00.origin,var_03,var_02,var_05); return; } thread swim_dofinalarrival("exposed",var_03,var_05,var_04,var_04); } //Function Number: 38 swim_determineapproachanim3d(param_00,param_01,param_02,param_03,param_04,param_05) { if(animscripts\utility::isspaceai()) { var_06 = (0,0,0); var_07 = (0,0,0); var_08 = combineangles(invertangles(param_04),param_05); var_09 = rotatevectorinverted(vectornormalize(self.origin - param_02),param_04) * -1; var_0A = swim_determineapproachanim(param_00,param_01,var_06,var_09,var_07,var_08,1,param_02,param_04); if(var_0A) { param_00.m_worldstartpos = rotatevector(param_00.m_worldstartpos,param_04) + param_02; } return var_0A; } return swim_determineapproachanim(param_05,var_06,var_07,var_08,var_09,var_0A,0); } //Function Number: 39 swim_dofinalarrival(param_00,param_01,param_02,param_03,param_04) { self endon("killanimscript"); self endon("swim_cancelapproach"); self.approachtype = param_00; var_05 = spawnstruct(); if(!swim_determineapproachanim3d(var_05,param_00,param_01,param_02,param_03,param_04)) { return; } var_06 = anglestoforward(self.angles); var_07 = var_05.m_worldstartpos - self.origin; var_08 = length(var_07); var_07 = var_07 / var_08; if(animscripts\utility::isspaceai()) { var_09 = param_01 - var_05.m_worldstartpos; var_0A = length(var_09); var_0B = vectordot(var_07,var_06); if(var_08 > var_0A * 0.4 && vectordot(var_07,var_06) < 0.5) { self notify("force_space_rotation_update",0,0); return; } } else if(var_08 < 100 && vectordot(var_07,var_06) < 0.5) { return; } if(var_08 > 4) { if(var_08 < 12 || self.fixednode || !isdefined(self.node) || !animscripts\cover_arrival::isthreatenedbyenemy()) { self.swim.arrivalpathgoalpos = var_05.m_worldstartpos; self setruntopos(var_05.m_worldstartpos); if(animscripts\utility::isspaceai()) { var_0C = 16384; for(;;) { if(distancesquared(self.origin,var_05.m_worldstartpos) < var_0C) { self.prevturnrate = self.turnrate; self.turnrate = 0.1; var_0D = calculatestartorientation(var_05.m_delta,var_05.m_angledelta,param_01,param_04); self notify("force_space_rotation_update",0,0,var_0D[1]); break; } wait(0.1); } } self waittill("runto_arrived"); } } self notify("swim_killrestartlistener"); var_0E = vectornormalize(param_01 - self.origin); if(!swim_determineapproachanim3d(var_05,param_00,param_01,var_0E,param_03,param_04)) { return; } self.swim.arrivalanim = var_05.m_anim; if(animscripts\utility::isspaceai()) { var_0F = self startcoverarrival(var_05.m_worldstartpos,param_04[1] - var_05.m_angledelta[1],param_04[0] - var_05.m_angledelta[0],param_04,var_05.m_angledelta); return; } self startcoverarrival(var_05.m_worldstartpos,param_04[1] - var_05.m_angledelta[1],param_04[0] - var_05.m_angledelta[0]); } //Function Number: 40 swim_coverarrival_main() { self endon("killanimscript"); self endon("abort_approach"); var_00 = "arrival_" + self.approachtype; var_01 = self.swim.arrivalanim; if(!self.fixednode) { thread animscripts\cover_arrival::abortapproachifthreatened(); } var_02 = 0.4; if(animscripts\utility::isspaceai()) { var_02 = 0.2; thread space_arrival_turnrate_delay(); } self clearanim(%body,0.2); self setflaggedanimrestart("coverArrival",var_01,1,var_02,self.movetransitionrate); animscripts\shared::donotetracks("coverArrival",::swim_handlestartcoveraim); if(!animhasnotetrack(var_01,"start_aim")) { swim_startcoveraim(); } self.a.pose = "stand"; self.a.movement = "stop"; self.a.arrivaltype = self.approachtype; if(animscripts\utility::isspaceai()) { self.turnrate = 0.16; self.prevturnrate = undefined; } self clearanim(%animscript_root,0.3); self.lastapproachaborttime = undefined; self.swim.arrivalanim = undefined; if(animscripts\utility::isspaceai() && self.approachtype == "exposed") { self notify("force_space_rotation_update",0,0,undefined,1); } } //Function Number: 41 space_arrival_turnrate_delay() { self endon("killanimscript"); self endon("abort_approach"); wait(0.22); self.prevturnrate = 0.16; self.turnrate = 5; } //Function Number: 42 swim_getanimstartpos(param_00,param_01,param_02,param_03,param_04) { if(param_04) { var_05 = calculatestartorientation(param_02,param_03,param_00,param_01); return var_05[0]; } var_06 = param_02 - param_04; var_07 = anglestoforward(var_06); var_08 = anglestoright(var_06); var_09 = anglestoup(var_06); var_0A = var_07 * param_03[0]; var_0B = var_08 * param_03[1]; var_0C = var_09 * param_03[2]; return param_01 - var_0A + var_0B - var_0C; } //Function Number: 43 swim_maymovefrompointtopoint(param_00,param_01,param_02,param_03,param_04) { if(param_02) { param_01 = rotatevector(param_01,param_04) + param_03; return self maymovefrompointtopoint(param_03,param_01,0,1); } return self maymovefrompointtopoint(param_00,param_01,0,1); } //Function Number: 44 swim_determineapproachanim(param_00,param_01,param_02,param_03,param_04,param_05,param_06,param_07,param_08) { if(lengthsquared(param_03) < 0.003) { return 0; } var_09 = vectortoangles(param_03); if(param_01 == "exposed") { var_0A = 4; var_0B = 4; } else { var_0C = angleclamp180(param_06[1] - var_0B[1]); var_0A = swim_getangleindex(var_0C); var_0B = swim_getangleindex(var_0C,25); } var_0D = angleclamp180(param_04[0] - var_09[0]); var_0E = swim_getangleindex(var_0D); var_0F = swim_getangleindex(var_0D,25); var_10 = "arrival_" + param_01; if(param_01 == "exposed" && !animscripts\utility::isincombat(0)) { var_10 = var_10 + "_noncombat"; } var_11 = getswimanim(var_10); if(!isdefined(var_11[var_0A]) || !isdefined(var_11[var_0A][var_0E])) { return 0; } var_12 = (var_0A != var_0B || var_0E != var_0F) && isdefined(var_11[var_0B]) && isdefined(var_11[var_0B][var_0F]); var_13 = 0; var_14 = 0; var_15 = undefined; var_16 = var_11[var_0A][var_0E]; if(var_12) { var_15 = var_11[var_0B][var_0F]; } var_17 = var_10 + "_delta"; var_11 = getswimanim(var_17); var_18 = var_11[var_0A][var_0E]; if(var_12) { var_13 = var_11[var_0B][var_0F]; } var_19 = var_10 + "_angleDelta"; var_11 = getswimanim(var_19); var_1A = var_11[var_0A][var_0E]; if(var_12) { var_14 = var_11[var_0B][var_0F]; } var_1B = swim_getanimstartpos(param_02,param_05,var_18,var_1A,param_06); if(!swim_maymovefrompointtopoint(param_02,var_1B,param_06,param_07,param_08) && var_12 && !animscripts\utility::isspaceai()) { var_16 = var_15; var_18 = var_13; var_1A = var_14; var_1B = swim_getanimstartpos(param_02,param_05,var_18,var_1A,param_06); if(!swim_maymovefrompointtopoint(param_02,var_1B,param_06,param_07,param_08)) { return 0; } } param_00.m_anim = var_16; param_00.m_delta = var_18; param_00.m_angledelta = var_1A; param_00.m_worldstartpos = var_1B; return 1; } //Function Number: 45 swim_getangleindex(param_00,param_01) { if(!isdefined(param_01)) { param_01 = 10; } if(param_00 < 0) { return int(ceil(180 + param_00 - param_01 / 45)); } return int(floor(180 + param_00 + param_01 / 45)); } //Function Number: 46 swim_getmaxanimdist(param_00) { var_01 = level.archetypes["soldier"]["swim"][param_00]["maxDelta"]; if(isdefined(self.animarchetype) && self.animarchetype != "soldier") { if(isdefined(level.archetypes[self.animarchetype]["swim"]) && isdefined(level.archetypes[self.animarchetype]["swim"][param_00])) { var_02 = level.archetypes[self.animarchetype]["swim"][param_00]["maxDelta"]; if(var_02 > var_01) { var_01 = var_02; } } } return var_01; } //Function Number: 47 swim_startcoveraim() { animscripts\animset::set_animarray_standing(); animscripts\combat::set_aim_and_turn_limits(); self.previouspitchdelta = 0; animscripts\combat_utility::setupaim(0); thread animscripts\track::trackshootentorpos(); } //Function Number: 48 swim_handlestartcoveraim(param_00) { if(param_00 != "start_aim") { return; } swim_startcoveraim(); } //Function Number: 49 swim_getapproachtype(param_00) { if(!isdefined(param_00)) { return "exposed"; } var_01 = param_00.type; if(!isdefined(var_01)) { return "exposed"; } switch(var_01) { case "Cover Right 3D": return "cover_corner_r"; case "Cover Left 3D": return "cover_corner_l"; case "Cover Up 3D": return "cover_u"; case "Path 3D": case "Exposed 3D": return "exposed"; default: break; } } //Function Number: 50 getnodeforwardangles(param_00) { if(getdvarint("player_spaceEnabled") == 1) { var_01 = animscripts\utility::gettruenodeangles(param_00); if(animscripts\utility::isnodecoverleft(param_00)) { var_02 = getswimanim("arrival_cover_corner_l_angleDelta"); var_03 = var_02[4][4][1]; } else if(animscripts\utility::isnodecoverright(var_01)) { var_02 = getswimanim("arrival_cover_corner_r_angleDelta"); var_03 = var_02[4][4][1]; } else { var_03 = 0; } var_01 = combineangles(var_01,(0,var_03,0)); return var_01; } else { var_01 = var_03.angles; } var_04 = var_03[1]; if(animscripts\utility::isnodecoverleft(var_01)) { var_02 = getswimanim("arrival_cover_corner_l_angleDelta"); var_04 = var_04 + var_02[4][4][1]; } else if(animscripts\utility::isnodecoverright(var_01)) { var_02 = getswimanim("arrival_cover_corner_r_angleDelta"); var_04 = var_04 + var_02[4][4][1]; } var_03 = (var_03[0],var_04,var_03[2]); return var_03; } //Function Number: 51 swim_dostrafe() { if(self.swim.movestate != "combat_strafe") { moveswim_combat_move_set("combat_strafe"); } var_00 = getswimanim("forward_aim"); self setflaggedanimknoblimited("swimanim",var_00,1,0.1,1,1); thread swim_updatestrafeanim(); animscripts\notetracks::donotetracksfortime(0.2,"swimanim"); self notify("end_swim_updatestrafeanim"); } //Function Number: 52 swim_updatestrafeanim() { self endon("killanimscript"); self endon("move_interrupt"); self endon("move_mode"); self endon("move_loop_restart"); self endon("end_swim_updatestrafeanim"); var_00 = 0; for(;;) { if(self.facemotion) { if(!var_00) { swim_setstrafeweights(1,0,0,0); swim_setstrafeaimweights(0,0,0,0); } } else { if(self.relativedir == 1) { var_01 = []; var_01["front"] = 1; var_01["back"] = 0; var_01["left"] = 0; var_01["right"] = 0; } else { var_01 = animscripts\utility::quadrantanimweights(self getmotionangle()); } if(isdefined(self.update_move_front_bias)) { var_01["back"] = 0; if(var_01["front"] < 0.2) { var_01["front"] = 0.2; } } var_02 = swim_setstrafeweights(var_01["front"],var_01["back"],var_01["left"],var_01["right"]); swim_setstrafeaimset(var_02); swim_updatestrafeaimanim(); } var_00 = self.facemotion; wait(0.05); waittillframeend; } } //Function Number: 53 swim_getstrafeblendtime() { if(animscripts\utility::isspaceai()) { return 0.5; } return 0.5; } //Function Number: 54 swim_setstrafeweights(param_00,param_01,param_02,param_03) { var_04 = swim_getstrafeblendtime(); self setanim(%combatrun_forward,param_00,var_04,1,1); self setanim(%combatrun_backward,param_01,var_04,1,1); self setanim(%combatrun_left,param_02,var_04,1,1); self setanim(%combatrun_right,param_03,var_04,1,1); if(param_00 > 0) { return "front"; } if(param_01 > 0) { return "back"; } if(param_02 > 0) { return "left"; } if(param_03 > 0) { return "right"; } } //Function Number: 55 swim_setstrafeaimset(param_00) { switch(param_00) { case "front": self setanimknoblimited(getswimanim("aim_move_U"),1,0.1); self setanimknoblimited(getswimanim("aim_move_D"),1,0.1); self setanimknoblimited(getswimanim("aim_move_L"),1,0.1); self setanimknoblimited(getswimanim("aim_move_R"),1,0.1); break; case "back": self setanimknoblimited(getswimanim("strafe_B_aim_U"),1,0.1); self setanimknoblimited(getswimanim("strafe_B_aim_D"),1,0.1); self setanimknoblimited(getswimanim("strafe_B_aim_L"),1,0.1); self setanimknoblimited(getswimanim("strafe_B_aim_R"),1,0.1); break; case "left": self setanimknoblimited(getswimanim("strafe_L_aim_U"),1,0.1); self setanimknoblimited(getswimanim("strafe_L_aim_D"),1,0.1); self setanimknoblimited(getswimanim("strafe_L_aim_L"),1,0.1); self setanimknoblimited(getswimanim("strafe_L_aim_R"),1,0.1); break; case "right": self setanimknoblimited(getswimanim("strafe_R_aim_U"),1,0.1); self setanimknoblimited(getswimanim("strafe_R_aim_D"),1,0.1); self setanimknoblimited(getswimanim("strafe_R_aim_L"),1,0.1); self setanimknoblimited(getswimanim("strafe_R_aim_R"),1,0.1); break; default: break; } } //Function Number: 56 swim_updatestrafeaimanim() { var_00 = self.angles[1]; var_01 = self.angles[0]; var_02 = 0; var_03 = 0; var_04 = 0; var_05 = 0; var_06 = 45; var_07 = 60; if(isdefined(self.enemy)) { var_08 = self.enemy.origin - self.origin; var_09 = vectortoangles(var_08); var_0A = angleclamp180(var_09[1] - var_00); var_0B = angleclamp180(var_09[0] - var_01); if(var_0A > 0) { var_04 = clamp(1 - var_06 - var_0A / var_06,0,1); } else { var_05 = clamp(1 - var_06 + var_0A / var_06,0,1); } if(var_0B > 0) { var_03 = clamp(1 - var_07 - var_0B / var_07,0,1); } else { var_02 = clamp(1 - var_07 + var_0B / var_07,0,1); } } swim_setstrafeaimweights(var_02,var_03,var_04,var_05); } //Function Number: 57 swim_setstrafeaimweights(param_00,param_01,param_02,param_03) { self setanim(%w_aim_4,param_02,0.2,1,1); self setanim(%w_aim_6,param_03,0.2,1,1); self setanim(%w_aim_8,param_00,0.2,1,1); self setanim(%w_aim_2,param_01,0.2,1,1); } //Function Number: 58 swim_pathchange_getturnanim(param_00,param_01) { var_02 = undefined; var_03 = undefined; var_04 = getswimanim("turn"); var_05 = swim_getangleindex(param_00); var_06 = swim_getangleindex(param_01); if(isdefined(var_04[var_05])) { var_02 = var_04[var_05][var_06]; } if(var_05 == 4) { if(var_06 > 4 && isdefined(var_04[4][var_06 + 1])) { var_02 = var_04[4][var_06 + 1]; } else if(var_06 < 4 && var_06 > 0 && isdefined(var_04[4][var_06 - 1])) { var_02 = var_04[4][var_06 - 1]; } } if(!isdefined(var_02)) { var_02 = var_04[var_05][4]; } if(isdefined(var_02)) { if(animscripts\move::pathchange_candoturnanim(var_02)) { return var_02; } } return undefined; } //Function Number: 59 swim_cleanupturnanim() { moveswim_set("nostate"); } //Function Number: 60 swim_updateleananim() { var_00 = clamp(self.leanamount / 20,-1,1); if(var_00 > 0) { if(self.prevleanfracyaw <= 0 && var_00 < 0.075) { var_00 = 0; } self setanim(%add_turn_l,var_00,0.2,1,1); self setanim(%add_turn_r,0,0.2,1,1); } else { if(self.prevleanfracyaw >= 0 && var_00 > -0.075) { var_00 = 0; } self setanim(%add_turn_l,0,0.2,1,1); self setanim(%add_turn_r,0 - var_00,0.2,1,1); } self.prevleanfracyaw = var_00; var_00 = clamp(self.pitchamount / 25,-1,1); if(var_00 > 0) { if(self.prevleanfracpitch <= 0 && var_00 < 0.075) { var_00 = 0; } self setanim(%add_turn_d,var_00,0.2,1,1); self setanim(%add_turn_u,0,0.2,1,1); } else { if(self.prevleanfracpitch >= 0 && var_00 > -0.075) { var_00 = 0; } self setanim(%add_turn_d,0,0.2,1,1); self setanim(%add_turn_u,0 - var_00,0.2,1,1); } self.prevleanfracpitch = var_00; } //Function Number: 61 swim_isapproachablenode(param_00) { switch(param_00.type) { case "Exposed 3D": case "Cover Right 3D": case "Cover Left 3D": case "Cover Up 3D": return 1; } return 0; } //Function Number: 62 space_getdefaultturnrate() { return 0.16; } //Function Number: 63 space_getorientturnrate() { return 0.1; }