IL-GSC/AW/PC/animscripts/shoot_behavior.gsc
InfinityLoader b2389dbcb9 Full AW Dump
2024-04-22 02:38:24 -04:00

747 lines
14 KiB
Plaintext

/*******************************************************************
* Decompiled By: Bog
* Decompiled File: shoot_behavior.gsc
* Game: Call of Duty: Advanced Warfare
* Platform: PC
* Function Count: 27
* Decompile Time: 393 ms
* Timestamp: 4/22/2024 2:00:56 AM
*******************************************************************/
//Function Number: 1
decidewhatandhowtoshoot(param_00)
{
self endon("killanimscript");
self notify("stop_deciding_how_to_shoot");
self endon("stop_deciding_how_to_shoot");
self endon("death");
maps\_gameskill::resetmisstime();
self.shootobjective = param_00;
self.shootent = undefined;
self.shootpos = undefined;
self.shootstyle = "none";
self.fastburst = 0;
self.shouldreturntocover = undefined;
if(!isdefined(self.changingcoverpos))
{
self.changingcoverpos = 0;
}
var_01 = isdefined(self.covernode) && self.covernode.type != "Cover Prone" && self.covernode.type != "Conceal Prone";
if(var_01)
{
wait(0.05);
}
var_02 = self.shootent;
var_03 = self.shootpos;
var_04 = self.shootstyle;
if(!isdefined(self.has_no_ir))
{
self.a.laseron = 1;
animscripts\shared::updatelaserstatus();
}
if(animscripts\combat_utility::issniper())
{
resetsniperaim();
}
if(var_01 && !self.a.atconcealmentnode || !animscripts\utility::canseeenemy())
{
thread watchforincomingfire();
}
thread runonshootbehaviorend();
self.ambushendtime = undefined;
for(;;)
{
if(isdefined(self.shootposoverride))
{
if(!isdefined(self.enemy))
{
self.shootpos = self.shootposoverride;
self.shootposoverride = undefined;
waitabit();
}
else
{
self.shootposoverride = undefined;
}
}
var_05 = undefined;
if(self.weapon == "none")
{
nogunshoot();
}
else if(animscripts\utility::usingrocketlauncher())
{
var_05 = rpgshoot();
}
else if(animscripts\utility::usingsidearm() || isdefined(self.alwaysusepistol))
{
var_05 = pistolshoot();
}
else
{
var_05 = rifleshoot();
}
if(isdefined(self.a.specialshootbehavior))
{
[[ self.a.specialshootbehavior ]]();
}
if(checkchanged(var_02,self.shootent) || !isdefined(self.shootent) && checkchanged(var_03,self.shootpos) || checkchanged(var_04,self.shootstyle))
{
self notify("shoot_behavior_change");
}
var_02 = self.shootent;
var_03 = self.shootpos;
var_04 = self.shootstyle;
if(!isdefined(var_05))
{
waitabit();
}
}
}
//Function Number: 2
waitabit()
{
self endon("enemy");
self endon("done_changing_cover_pos");
self endon("weapon_position_change");
self endon("enemy_visible");
if(isdefined(self.shootent))
{
self.shootent endon("death");
self endon("do_slow_things");
wait(0.05);
while(isdefined(self.shootent))
{
if(common_scripts\utility::flag("_cloaked_stealth_enabled"))
{
self.shootpos = animscripts\combat_utility::get_last_known_shoot_pos(self.shootent);
continue;
}
self.shootpos = self.shootent getshootatpos();
wait(0.05);
}
return;
}
self waittill("do_slow_things");
}
//Function Number: 3
nogunshoot()
{
self.shootent = undefined;
self.shootpos = undefined;
self.shootstyle = "none";
self.shootobjective = "normal";
}
//Function Number: 4
shouldsuppress()
{
return !animscripts\combat_utility::issniper() && !animscripts\utility::isshotgun(self.weapon);
}
//Function Number: 5
shouldshootenemyent()
{
if(!animscripts\utility::canseeenemy())
{
return 0;
}
if(!isdefined(self.covernode) && !self canshootenemy())
{
return 0;
}
return 1;
}
//Function Number: 6
rifleshootobjectivenormal()
{
if(!shouldshootenemyent())
{
if(animscripts\combat_utility::issniper())
{
resetsniperaim();
}
if(self.doingambush)
{
self.shootobjective = "ambush";
return "retry";
}
if(!isdefined(self.enemy))
{
havenothingtoshoot();
return;
}
markenemyposinvisible();
if((self.providecoveringfire || randomint(5) > 0) && shouldsuppress())
{
self.shootobjective = "suppress";
}
else
{
self.shootobjective = "ambush";
}
return "retry";
}
setshootenttoenemy();
setshootstyleforvisibleenemy();
}
//Function Number: 7
rifleshootobjectivesuppress(param_00)
{
if(!param_00)
{
havenothingtoshoot();
return;
}
self.shootent = undefined;
self.shootpos = animscripts\utility::getenemysightpos();
setshootstyleforsuppression();
}
//Function Number: 8
rifleshootobjectiveambush(param_00)
{
self.shootstyle = "none";
self.shootent = undefined;
if(!param_00)
{
getambushshootpos();
if(shouldstopambushing())
{
self.ambushendtime = undefined;
self notify("return_to_cover");
self.shouldreturntocover = 1;
return;
}
return;
}
self.shootpos = animscripts\utility::getenemysightpos();
if(shouldstopambushing())
{
self.ambushendtime = undefined;
if(shouldsuppress())
{
self.shootobjective = "suppress";
}
if(randomint(3) == 0)
{
self notify("return_to_cover");
self.shouldreturntocover = 1;
}
return "retry";
}
}
//Function Number: 9
getambushshootpos()
{
if(isdefined(self.enemy) && self cansee(self.enemy))
{
setshootenttoenemy();
return;
}
var_00 = self getanglestolikelyenemypath();
if(!isdefined(var_00))
{
if(isdefined(self.covernode))
{
var_00 = self.covernode.angles;
}
else if(isdefined(self.ambushnode))
{
var_00 = self.ambushnode.angles;
}
else if(isdefined(self.enemy))
{
var_00 = vectortoangles(self lastknownpos(self.enemy) - self.origin);
}
else
{
var_00 = self.angles;
}
}
var_01 = 1024;
if(isdefined(self.enemy))
{
var_01 = distance(self.origin,self.enemy.origin);
}
var_02 = self geteye() + anglestoforward(var_00) * var_01;
if(!isdefined(self.shootpos) || distancesquared(var_02,self.shootpos) > 25)
{
self.shootpos = var_02;
}
}
//Function Number: 10
rifleshoot()
{
if(self.shootobjective == "normal")
{
rifleshootobjectivenormal();
return;
}
if(shouldshootenemyent())
{
self.shootobjective = "normal";
self.ambushendtime = undefined;
return "retry";
}
markenemyposinvisible();
if(animscripts\combat_utility::issniper())
{
resetsniperaim();
}
var_00 = animscripts\utility::cansuppressenemy();
if(self.shootobjective == "suppress" || self.team == "allies" && !isdefined(self.enemy) && !var_00)
{
rifleshootobjectivesuppress(var_00);
return;
}
rifleshootobjectiveambush(var_00);
}
//Function Number: 11
shouldstopambushing()
{
if(!isdefined(self.ambushendtime))
{
if(self isbadguy())
{
self.ambushendtime = gettime() + randomintrange(10000,60000);
}
else
{
self.ambushendtime = gettime() + randomintrange(4000,10000);
}
}
return self.ambushendtime < gettime();
}
//Function Number: 12
rpgshoot()
{
if(!shouldshootenemyent())
{
markenemyposinvisible();
havenothingtoshoot();
return;
}
setshootenttoenemy();
setshootstyle("single",0);
var_00 = lengthsquared(self.origin - self.shootpos);
if(var_00 < squared(512))
{
self notify("return_to_cover");
self.shouldreturntocover = 1;
}
}
//Function Number: 13
pistolshoot()
{
if(self.shootobjective == "normal")
{
if(!shouldshootenemyent())
{
if(!isdefined(self.enemy))
{
havenothingtoshoot();
return;
}
markenemyposinvisible();
self.shootobjective = "ambush";
return "retry";
}
setshootenttoenemy();
setshootstyle("single",0);
return;
}
if(shouldshootenemyent())
{
self.shootobjective = "normal";
self.ambushendtime = undefined;
return "retry";
}
markenemyposinvisible();
self.shootent = undefined;
self.shootstyle = "none";
self.shootpos = animscripts\utility::getenemysightpos();
if(!isdefined(self.ambushendtime))
{
self.ambushendtime = gettime() + randomintrange(4000,8000);
}
if(self.ambushendtime < gettime())
{
self.shootobjective = "normal";
self.ambushendtime = undefined;
return "retry";
}
}
//Function Number: 14
markenemyposinvisible()
{
if(isdefined(self.enemy) && !self.changingcoverpos && self.script != "combat")
{
if(isai(self.enemy) && isdefined(self.enemy.script) && self.enemy.script == "cover_stand" || self.enemy.script == "cover_crouch")
{
if(isdefined(self.enemy.a.covermode) && self.enemy.a.covermode == "hide")
{
return;
}
}
self.couldntseeenemypos = self.enemy.origin;
}
}
//Function Number: 15
watchforincomingfire()
{
self endon("killanimscript");
self endon("stop_deciding_how_to_shoot");
for(;;)
{
self waittill("suppression");
if(self.suppressionmeter > self.suppressionthreshold)
{
if(readytoreturntocover())
{
self notify("return_to_cover");
self.shouldreturntocover = 1;
}
}
}
}
//Function Number: 16
readytoreturntocover()
{
if(self.changingcoverpos)
{
return 0;
}
if(!isdefined(self.enemy) || !self cansee(self.enemy))
{
return 1;
}
if(gettime() < self.coverposestablishedtime + 800)
{
return 0;
}
if(isplayer(self.enemy) && self.enemy.health < self.enemy.maxhealth * 0.5)
{
if(gettime() < self.coverposestablishedtime + 3000)
{
return 0;
}
}
return 1;
}
//Function Number: 17
runonshootbehaviorend()
{
self endon("death");
common_scripts\utility::waittill_any("killanimscript","stop_deciding_how_to_shoot");
self.a.laseron = 0;
animscripts\shared::updatelaserstatus();
}
//Function Number: 18
checkchanged(param_00,param_01)
{
if(isdefined(param_00) != isdefined(param_01))
{
return 1;
}
if(!isdefined(param_01))
{
return 0;
}
return param_00 != param_01;
}
//Function Number: 19
setshootenttoenemy()
{
self.shootent = self.enemy;
if(common_scripts\utility::flag("_cloaked_stealth_enabled"))
{
if(isdefined(self.enemy_who_surprised_me) && self.enemy_who_surprised_me == self.enemy)
{
self.shootpos = self.shootent getshootatpos();
return;
}
self.shootpos = animscripts\combat_utility::get_last_known_shoot_pos(self.shootent);
return;
}
self.shootpos = self.shootent getshootatpos();
}
//Function Number: 20
havenothingtoshoot()
{
self.shootent = undefined;
self.shootpos = undefined;
self.shootstyle = "none";
if(self.doingambush)
{
self.shootobjective = "ambush";
}
if(!self.changingcoverpos)
{
self notify("return_to_cover");
self.shouldreturntocover = 1;
}
}
//Function Number: 21
shouldbeajerk()
{
return level.gameskill == 3 && isplayer(self.enemy);
}
//Function Number: 22
setshootstyleforvisibleenemy()
{
if(isdefined(self.shootent.enemy) && isdefined(self.shootent.enemy.syncedmeleetarget))
{
return setshootstyle("single",0);
}
if(animscripts\combat_utility::issniper())
{
return setshootstyle("single",0);
}
if(animscripts\utility::isshotgun(self.weapon))
{
if(animscripts\utility::weapon_pump_action_shotgun())
{
return setshootstyle("single",0);
}
else
{
return setshootstyle("semi",0);
}
}
if(weaponclass(self.weapon) == "grenade")
{
return setshootstyle("single",0);
}
if(weaponburstcount(self.weapon) > 0)
{
return setshootstyle("burst",0);
}
if((isdefined(self.juggernaut) && self.juggernaut) || isdefined(self.mech) && self.mech)
{
return setshootstyle("full",1);
}
var_00 = distancesquared(self getshootatpos(),self.shootpos);
var_01 = weaponclass(self.weapon) == "mg";
if(self.providecoveringfire && var_01)
{
return setshootstyle("full",0);
}
if(var_00 < 62500)
{
if(isdefined(self.shootent) && isdefined(self.shootent.magic_bullet_shield))
{
return setshootstyle("single",0);
}
else
{
return setshootstyle("full",0);
}
}
else if(var_00 < 810000 || shouldbeajerk())
{
if(weaponissemiauto(self.weapon) || shoulddosemiforvariety())
{
return setshootstyle("semi",1);
}
else
{
return setshootstyle("burst",1);
}
}
else if(self.providecoveringfire || var_01 || var_00 < 2560000)
{
if(shoulddosemiforvariety())
{
return setshootstyle("semi",0);
}
else
{
return setshootstyle("burst",0);
}
}
return setshootstyle("single",0);
}
//Function Number: 23
setshootstyleforsuppression()
{
var_00 = distancesquared(self getshootatpos(),self.shootpos);
if(weaponissemiauto(self.weapon))
{
if(var_00 < 2560000)
{
return setshootstyle("semi",0);
}
return setshootstyle("single",0);
}
if(weaponclass(self.weapon) == "mg")
{
return setshootstyle("full",0);
}
if(self.providecoveringfire || var_00 < 2560000)
{
if(shoulddosemiforvariety())
{
return setshootstyle("semi",0);
}
else
{
return setshootstyle("burst",0);
}
}
return setshootstyle("single",0);
}
//Function Number: 24
setshootstyle(param_00,param_01)
{
self.shootstyle = param_00;
self.fastburst = param_01;
}
//Function Number: 25
shoulddosemiforvariety()
{
if(weaponclass(self.weapon) != "rifle")
{
return 0;
}
if(self.team != "allies")
{
return 0;
}
var_00 = animscripts\utility::safemod(int(self.origin[1]),10000) + 2000;
var_01 = int(self.origin[0]) + gettime();
return var_01 % 2 * var_00 > var_00;
}
//Function Number: 26
resetsniperaim()
{
self.snipershotcount = 0;
self.sniperhitcount = 0;
thread sniper_glint_behavior();
}
//Function Number: 27
sniper_glint_behavior()
{
self endon("killanimscript");
self endon("enemy");
self endon("return_to_cover");
self notify("new_glint_thread");
self endon("new_glint_thread");
if(isdefined(self.disable_sniper_glint) && self.disable_sniper_glint)
{
return;
}
if(!isdefined(level._effect["sniper_glint"]))
{
return;
}
if(!isalive(self.enemy))
{
return;
}
var_00 = common_scripts\utility::getfx("sniper_glint");
wait(0.2);
for(;;)
{
if(self.weapon == self.primaryweapon && animscripts\combat_utility::player_sees_my_scope())
{
if(distancesquared(self.origin,self.enemy.origin) > 65536)
{
playfxontag(var_00,self,"tag_flash");
}
var_01 = randomfloatrange(3,5);
wait(var_01);
}
wait(0.2);
}
}