mirror of
https://github.com/InfinityLoader/IL-GSC.git
synced 2025-06-09 01:57:51 -05:00
2063 lines
40 KiB
Plaintext
2063 lines
40 KiB
Plaintext
/*******************************************************************
|
|
* Decompiled By: Bog
|
|
* Decompiled File: combat_utility.gsc
|
|
* Game: Call of Duty: Advanced Warfare
|
|
* Platform: PC
|
|
* Function Count: 87
|
|
* Decompile Time: 1308 ms
|
|
* Timestamp: 4/22/2024 2:00:10 AM
|
|
*******************************************************************/
|
|
|
|
//Function Number: 1
|
|
gettargetangleoffset(param_00)
|
|
{
|
|
var_01 = self getshootatpos() + (0,0,-3);
|
|
var_02 = (var_01[0] - param_00[0],var_01[1] - param_00[1],var_01[2] - param_00[2]);
|
|
var_02 = vectornormalize(var_02);
|
|
var_03 = var_02[2] * -1;
|
|
return var_03;
|
|
}
|
|
|
|
//Function Number: 2
|
|
getsniperburstdelaytime()
|
|
{
|
|
if(isplayer(self.enemy))
|
|
{
|
|
return randomfloatrange(self.enemy.gs.min_sniper_burst_delay_time,self.enemy.gs.max_sniper_burst_delay_time);
|
|
}
|
|
|
|
return randomfloatrange(level.min_sniper_burst_delay_time,level.max_sniper_burst_delay_time);
|
|
}
|
|
|
|
//Function Number: 3
|
|
getremainingburstdelaytime()
|
|
{
|
|
var_00 = gettime() - self.a.lastshoottime / 1000;
|
|
var_01 = getburstdelaytime();
|
|
if(var_01 > var_00)
|
|
{
|
|
return var_01 - var_00;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 4
|
|
getfastburstdelaytime()
|
|
{
|
|
if(!isdefined(self.fastburstcount))
|
|
{
|
|
self.fastburstcount = 1;
|
|
self.fastburstmodtime = 3;
|
|
}
|
|
|
|
var_00 = 0.2;
|
|
var_01 = 0.45;
|
|
if(self.fastburstcount % self.fastburstmodtime == 0)
|
|
{
|
|
if(randomint(5) < 3)
|
|
{
|
|
var_00 = 0.45;
|
|
var_01 = 1;
|
|
}
|
|
|
|
self.fastburstmodtime = randomintrange(2,5);
|
|
}
|
|
|
|
self.fastburstcount++;
|
|
return randomfloatrange(var_00,var_01);
|
|
}
|
|
|
|
//Function Number: 5
|
|
getburstdelaytime()
|
|
{
|
|
if(animscripts\utility::usingsidearm())
|
|
{
|
|
return randomfloatrange(0.15,0.55);
|
|
}
|
|
|
|
if(animscripts\utility::weapon_pump_action_shotgun())
|
|
{
|
|
return randomfloatrange(1,1.7);
|
|
}
|
|
|
|
if(issniper())
|
|
{
|
|
return getsniperburstdelaytime();
|
|
}
|
|
|
|
if(self.fastburst)
|
|
{
|
|
return getfastburstdelaytime();
|
|
}
|
|
|
|
return randomfloatrange(0.4,0.9);
|
|
}
|
|
|
|
//Function Number: 6
|
|
burstdelay()
|
|
{
|
|
if(self.bulletsinclip)
|
|
{
|
|
if(self.shootstyle == "full" && !self.fastburst)
|
|
{
|
|
if(self.a.lastshoottime == gettime())
|
|
{
|
|
wait(0.05);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
var_00 = getremainingburstdelaytime();
|
|
if(var_00)
|
|
{
|
|
wait(var_00);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 7
|
|
cheatammoifnecessary()
|
|
{
|
|
if(!isdefined(self.enemy))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self.team != "allies")
|
|
{
|
|
if(!isplayer(self.enemy))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self.enemy maps\_utility::ent_flag("player_is_invulnerable"))
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
if(animscripts\utility::usingsidearm() || animscripts\utility::usingrocketlauncher())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(gettime() - self.ammocheattime < self.ammocheatinterval)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(!self cansee(self.enemy) && distancesquared(self.origin,self.enemy.origin) > 65536)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
self.bulletsinclip = int(weaponclipsize(self.weapon) / 2);
|
|
if(self.bulletsinclip > weaponclipsize(self.weapon))
|
|
{
|
|
self.bulletsinclip = weaponclipsize(self.weapon);
|
|
}
|
|
|
|
self.ammocheattime = gettime();
|
|
return 1;
|
|
}
|
|
|
|
//Function Number: 8
|
|
aimbutdontshoot()
|
|
{
|
|
for(var_00 = int(60);var_00 > 0;var_00--)
|
|
{
|
|
if(isdefined(self.dontevershoot) || isdefined(self.enemy) && isdefined(self.enemy.dontattackme))
|
|
{
|
|
wait(0.05);
|
|
continue;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//Function Number: 9
|
|
shootuntilshootbehaviorchange()
|
|
{
|
|
if(isdefined(self.currently_burst_firing) && self.currently_burst_firing)
|
|
{
|
|
burstdelay();
|
|
self.currently_burst_firing = 0;
|
|
self notify("shoot_behavior_change");
|
|
}
|
|
|
|
self endon("shoot_behavior_change");
|
|
self endon("stopShooting");
|
|
if(islongrangeai())
|
|
{
|
|
if(isdefined(self.enemy) && isai(self.enemy) && distancesquared(level.player.origin,self.enemy.origin) < 147456)
|
|
{
|
|
self.enemy animscripts\battlechatter_ai::addthreatevent("infantry",self,1);
|
|
}
|
|
|
|
if(animscripts\utility::usingrocketlauncher() && issentient(self.enemy))
|
|
{
|
|
wait(randomfloat(2));
|
|
}
|
|
}
|
|
|
|
if(isdefined(self.enemy) && distancesquared(self.origin,self.enemy.origin) > 160000)
|
|
{
|
|
var_00 = randomintrange(1,5);
|
|
}
|
|
else
|
|
{
|
|
var_00 = 10;
|
|
}
|
|
|
|
var_01 = 1;
|
|
self.currently_burst_firing = 1;
|
|
for(;;)
|
|
{
|
|
if(!var_01)
|
|
{
|
|
burstdelay();
|
|
}
|
|
|
|
var_01 = 0;
|
|
if(aimbutdontshoot())
|
|
{
|
|
break;
|
|
}
|
|
|
|
if(self.shootstyle == "full")
|
|
{
|
|
if(isdefined(self.mech) && self.mech)
|
|
{
|
|
fireuntiloutofammo(animscripts\utility::animarray("fire"),0,100);
|
|
}
|
|
else
|
|
{
|
|
fireuntiloutofammo(animscripts\utility::animarray("fire"),1,animscripts\shared::decidenumshotsforfull());
|
|
}
|
|
}
|
|
else if(self.shootstyle == "burst" || self.shootstyle == "semi")
|
|
{
|
|
var_02 = animscripts\shared::decidenumshotsforburst();
|
|
if(var_02 == 1)
|
|
{
|
|
fireuntiloutofammo(animscripts\utility::animarraypickrandom("single"),1,var_02);
|
|
}
|
|
else
|
|
{
|
|
fireuntiloutofammo(animscripts\utility::animarray(self.shootstyle + var_02),1,var_02);
|
|
}
|
|
}
|
|
else if(self.shootstyle == "single")
|
|
{
|
|
fireuntiloutofammo(animscripts\utility::animarraypickrandom("single"),1,1);
|
|
}
|
|
else
|
|
{
|
|
self waittill("hell freezes over");
|
|
}
|
|
|
|
if(!self.bulletsinclip)
|
|
{
|
|
break;
|
|
}
|
|
|
|
var_00--;
|
|
if(var_00 < 0)
|
|
{
|
|
self.shouldreturntocover = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
self.currently_burst_firing = 0;
|
|
}
|
|
|
|
//Function Number: 10
|
|
getuniqueflagnameindex()
|
|
{
|
|
level.animflagnameindex++;
|
|
return level.animflagnameindex;
|
|
}
|
|
|
|
//Function Number: 11
|
|
setupaim(param_00)
|
|
{
|
|
self setanim(%exposed_aiming,1,param_00);
|
|
self setanimknoblimited(animscripts\utility::animarray("straight_level"),1,param_00);
|
|
self setanimknoblimited(animscripts\utility::animarray("add_aim_up"),1,param_00);
|
|
self setanimknoblimited(animscripts\utility::animarray("add_aim_down"),1,param_00);
|
|
self setanimknoblimited(animscripts\utility::animarray("add_aim_left"),1,param_00);
|
|
self setanimknoblimited(animscripts\utility::animarray("add_aim_right"),1,param_00);
|
|
self.facialidx = animscripts\face::playfacialanim(undefined,"aim",self.facialidx);
|
|
}
|
|
|
|
//Function Number: 12
|
|
startfireandaimidlethread()
|
|
{
|
|
maps\_dds::evaluatecombatevent();
|
|
if(!isdefined(self.a.aimidlethread))
|
|
{
|
|
var_00 = 0.2;
|
|
if(isdefined(self.aimsetupblendtime))
|
|
{
|
|
var_00 = self.aimsetupblendtime;
|
|
}
|
|
|
|
setupaim(var_00);
|
|
thread aimidlethread();
|
|
thread animscripts\track::trackshootentorpos();
|
|
}
|
|
}
|
|
|
|
//Function Number: 13
|
|
endfireandanimidlethread()
|
|
{
|
|
endaimidlethread();
|
|
self clearanim(%add_fire,0.1);
|
|
self notify("stop tracking");
|
|
}
|
|
|
|
//Function Number: 14
|
|
showfirehideaimidle()
|
|
{
|
|
if(isdefined(self.a.aimidlethread))
|
|
{
|
|
self setanim(%add_idle,0,0.2);
|
|
}
|
|
|
|
self setanim(%add_fire,1,0.1);
|
|
}
|
|
|
|
//Function Number: 15
|
|
hidefireshowaimidle()
|
|
{
|
|
if(isdefined(self.a.aimidlethread))
|
|
{
|
|
self setanim(%add_idle,1,0.2);
|
|
}
|
|
|
|
self setanim(%add_fire,0,0.1);
|
|
}
|
|
|
|
//Function Number: 16
|
|
aimidlethread(param_00)
|
|
{
|
|
self endon("killanimscript");
|
|
self endon("end_aim_idle_thread");
|
|
if(isdefined(self.a.aimidlethread))
|
|
{
|
|
return;
|
|
}
|
|
|
|
self.a.aimidlethread = 1;
|
|
wait(0.1);
|
|
self setanimlimited(%add_idle,1,0.2);
|
|
var_01 = %add_idle;
|
|
var_02 = 0;
|
|
for(;;)
|
|
{
|
|
var_03 = "idle" + var_02;
|
|
if(isdefined(self.a.leanaim))
|
|
{
|
|
var_04 = animscripts\utility::animarraypickrandom("lean_idle");
|
|
}
|
|
else if(animscripts\utility::animarrayanyexist("exposed_idle"))
|
|
{
|
|
var_04 = animscripts\utility::animarraypickrandom("exposed_idle");
|
|
}
|
|
else
|
|
{
|
|
wait(0.5);
|
|
}
|
|
else
|
|
{
|
|
if(var_04 == var_01)
|
|
{
|
|
self setflaggedanimlimitedrestart(var_03,var_04,1,0.2);
|
|
}
|
|
else
|
|
{
|
|
self setflaggedanimknoblimitedrestart(var_03,var_04,1,0.2);
|
|
}
|
|
|
|
var_01 = var_04;
|
|
self waittillmatch("end",var_03);
|
|
}
|
|
|
|
var_02++;
|
|
}
|
|
|
|
self clearanim(%add_idle,0.1);
|
|
}
|
|
|
|
//Function Number: 17
|
|
endaimidlethread()
|
|
{
|
|
self notify("end_aim_idle_thread");
|
|
self.a.aimidlethread = undefined;
|
|
self clearanim(%add_idle,0.1);
|
|
}
|
|
|
|
//Function Number: 18
|
|
shotgunfirerate()
|
|
{
|
|
if(animscripts\utility::weapon_pump_action_shotgun())
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(animscripts\weaponlist::usingautomaticweapon())
|
|
{
|
|
return animscripts\weaponlist::autoshootanimrate() * 0.7;
|
|
}
|
|
|
|
return 0.4;
|
|
}
|
|
|
|
//Function Number: 19
|
|
fireuntiloutofammo(param_00,param_01,param_02)
|
|
{
|
|
var_03 = "fireAnim_" + getuniqueflagnameindex();
|
|
maps\_gameskill::resetmisstime();
|
|
while(!aimedatshootentorpos())
|
|
{
|
|
wait(0.05);
|
|
}
|
|
|
|
showfirehideaimidle();
|
|
var_04 = 1;
|
|
if(isdefined(self.shootrateoverride))
|
|
{
|
|
var_04 = self.shootrateoverride;
|
|
}
|
|
else if(self.shootstyle == "full")
|
|
{
|
|
var_04 = animscripts\weaponlist::autoshootanimrate();
|
|
}
|
|
else if(self.shootstyle == "burst")
|
|
{
|
|
var_04 = animscripts\weaponlist::burstshootanimrate();
|
|
}
|
|
else if(animscripts\utility::usingsidearm())
|
|
{
|
|
var_04 = 3;
|
|
}
|
|
else if(animscripts\utility::usingshotgun())
|
|
{
|
|
var_04 = shotgunfirerate();
|
|
}
|
|
|
|
self setflaggedanimknobrestart(var_03,param_00,1,0.2,var_04);
|
|
self updateplayersightaccuracy();
|
|
var_05 = weaponfiretime(self.weapon);
|
|
fireuntiloutofammointernal(var_03,param_00,param_01,param_02,var_05);
|
|
hidefireshowaimidle();
|
|
}
|
|
|
|
//Function Number: 20
|
|
fireuntiloutofammo_waittillended()
|
|
{
|
|
self endon("killanimscript");
|
|
self endon("fireAnimEnd");
|
|
self notify("FireUntilOutOfAmmo_WaitTillEnded");
|
|
self endon("FireUntilOutOfAmmo_WaitTillEnded");
|
|
var_00 = thisthread;
|
|
for(;;)
|
|
{
|
|
waittillframeend;
|
|
if(!isdefined(var_00))
|
|
{
|
|
self shootstopsound();
|
|
return;
|
|
}
|
|
|
|
wait(0.05);
|
|
}
|
|
}
|
|
|
|
//Function Number: 21
|
|
fireuntiloutofammointernal(param_00,param_01,param_02,param_03,param_04)
|
|
{
|
|
self endon("enemy");
|
|
if(isplayer(self.enemy) && self.shootstyle == "full" || self.shootstyle == "semi")
|
|
{
|
|
level endon("player_becoming_invulnerable");
|
|
}
|
|
|
|
if(param_02)
|
|
{
|
|
thread notifyonanimend(param_00,"fireAnimEnd");
|
|
self endon("fireAnimEnd");
|
|
}
|
|
|
|
if(!isdefined(param_03))
|
|
{
|
|
param_03 = -1;
|
|
}
|
|
|
|
var_05 = 0;
|
|
var_06 = animhasnotetrack(param_01,"fire");
|
|
var_07 = weaponclass(self.weapon) == "rocketlauncher";
|
|
thread fireuntiloutofammo_waittillended();
|
|
while(var_05 < param_03 && param_03 > 0)
|
|
{
|
|
if(var_06)
|
|
{
|
|
wait(param_04);
|
|
}
|
|
|
|
if(!self.bulletsinclip)
|
|
{
|
|
if(!cheatammoifnecessary())
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(!aimedatshootentorpos())
|
|
{
|
|
break;
|
|
}
|
|
|
|
shootatshootentorpos();
|
|
if(isplayer(self.enemy) && self.enemy maps\_utility::ent_flag("player_is_invulnerable"))
|
|
{
|
|
if(randomint(3) == 0)
|
|
{
|
|
self.bulletsinclip--;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
self.bulletsinclip--;
|
|
}
|
|
|
|
if(var_07)
|
|
{
|
|
if(isdefined(self.shootent) && isdefined(self.shootent.team))
|
|
{
|
|
self.shootent maps\_dds::dds_notify("react_rpg",self.shootent.team == "allies");
|
|
}
|
|
|
|
self.a.rockets--;
|
|
if(issubstr(tolower(self.weapon),"rpg") || issubstr(tolower(self.weapon),"panzerfaust"))
|
|
{
|
|
self hidepart("tag_rocket");
|
|
self.a.rocketvisible = 0;
|
|
}
|
|
}
|
|
|
|
var_05++;
|
|
thread shotgunpumpsound(param_00);
|
|
if(self.fastburst && var_05 == param_03)
|
|
{
|
|
break;
|
|
}
|
|
|
|
if(!var_06 || param_03 == 1 && self.shootstyle == "single")
|
|
{
|
|
self waittillmatch("end",param_00);
|
|
}
|
|
}
|
|
|
|
self shootstopsound();
|
|
if(param_02)
|
|
{
|
|
self notify("fireAnimEnd");
|
|
}
|
|
}
|
|
|
|
//Function Number: 22
|
|
aimedatshootentorpos()
|
|
{
|
|
if(!isdefined(self.shootpos))
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
var_00 = self getmuzzleangle();
|
|
var_01 = animscripts\shared::getshootfrompos();
|
|
var_02 = vectortoangles(self.shootpos - var_01);
|
|
var_03 = level.aimyawdifffartolerance;
|
|
if(isdefined(self.aimfaryawtolerance))
|
|
{
|
|
var_03 = self.aimfaryawtolerance;
|
|
}
|
|
|
|
var_04 = animscripts\utility::absangleclamp180(var_00[1] - var_02[1]);
|
|
if(var_04 > var_03)
|
|
{
|
|
if(distancesquared(self geteye(),self.shootpos) > level.aimyawdiffclosedistsq || var_04 > level.aimyawdiffclosetolerance)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return animscripts\utility::absangleclamp180(var_00[0] - var_02[0]) <= level.aimpitchdifftolerance;
|
|
}
|
|
|
|
//Function Number: 23
|
|
notifyonanimend(param_00,param_01)
|
|
{
|
|
self endon("killanimscript");
|
|
self endon(param_01);
|
|
self waittillmatch("end",param_00);
|
|
self notify(param_01);
|
|
}
|
|
|
|
//Function Number: 24
|
|
issingleshot()
|
|
{
|
|
if(weaponburstcount(self.weapon) > 0)
|
|
{
|
|
return 0;
|
|
}
|
|
else if(weaponisauto(self.weapon))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//Function Number: 25
|
|
shootatshootentorpos()
|
|
{
|
|
var_00 = issingleshot();
|
|
if(isdefined(self.shootent))
|
|
{
|
|
if(isdefined(self.enemy) && self.shootent == self.enemy)
|
|
{
|
|
animscripts\utility::shootenemywrapper(var_00);
|
|
return;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
self [[ level.shootposwrapper_func ]](self.shootpos,var_00);
|
|
}
|
|
|
|
//Function Number: 26
|
|
decrementbulletsinclip()
|
|
{
|
|
if(self.bulletsinclip)
|
|
{
|
|
self.bulletsinclip--;
|
|
}
|
|
}
|
|
|
|
//Function Number: 27
|
|
shotgunpumpsound(param_00)
|
|
{
|
|
if(!animscripts\utility::weapon_pump_action_shotgun())
|
|
{
|
|
return;
|
|
}
|
|
|
|
self endon("killanimscript");
|
|
self notify("shotgun_pump_sound_end");
|
|
self endon("shotgun_pump_sound_end");
|
|
thread stopshotgunpumpaftertime(2);
|
|
self waittillmatch("rechamber",param_00);
|
|
self playsound("ai_shotgun_pump");
|
|
self notify("shotgun_pump_sound_end");
|
|
}
|
|
|
|
//Function Number: 28
|
|
stopshotgunpumpaftertime(param_00)
|
|
{
|
|
self endon("killanimscript");
|
|
self endon("shotgun_pump_sound_end");
|
|
wait(param_00);
|
|
self notify("shotgun_pump_sound_end");
|
|
}
|
|
|
|
//Function Number: 29
|
|
rechamber(param_00)
|
|
{
|
|
}
|
|
|
|
//Function Number: 30
|
|
needtoreload(param_00)
|
|
{
|
|
if(self.weapon == "none")
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(isdefined(self.noreload))
|
|
{
|
|
if(self.bulletsinclip < weaponclipsize(self.weapon) * 0.5)
|
|
{
|
|
self.bulletsinclip = int(weaponclipsize(self.weapon) * 0.5);
|
|
}
|
|
|
|
if(self.bulletsinclip <= 0)
|
|
{
|
|
self.bulletsinclip = 0;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
if(self.bulletsinclip <= weaponclipsize(self.weapon) * param_00)
|
|
{
|
|
if(param_00 == 0)
|
|
{
|
|
if(cheatammoifnecessary())
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 31
|
|
putgunbackinhandonkillanimscript()
|
|
{
|
|
self endon("weapon_switch_done");
|
|
self endon("death");
|
|
self waittill("killanimscript");
|
|
animscripts\shared::placeweaponon(self.primaryweapon,"right");
|
|
}
|
|
|
|
//Function Number: 32
|
|
reload(param_00,param_01)
|
|
{
|
|
self endon("killanimscript");
|
|
if(!needtoreload(param_00))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
animscripts\battlechatter_ai::evaluatereloadevent();
|
|
animscripts\battlechatter::playbattlechatter();
|
|
maps\_dds::dds_notify_reload(undefined,self.team == "allies");
|
|
if(isdefined(param_01))
|
|
{
|
|
self setflaggedanimknoball("reloadanim",param_01,%body,1,0.1,1);
|
|
animscripts\shared::donotetracks("reloadanim");
|
|
animscripts\weaponlist::refillclip();
|
|
self.a.needstorechamber = 0;
|
|
}
|
|
else
|
|
{
|
|
if(self.a.pose == "prone")
|
|
{
|
|
self setflaggedanimknoball("reloadanim",%prone_reload,%body,1,0.1,1);
|
|
self updateprone(%prone_legs_up,%prone_legs_down,1,0.1,1);
|
|
}
|
|
else
|
|
{
|
|
wait(2);
|
|
return;
|
|
}
|
|
|
|
animscripts\shared::donotetracks("reloadanim");
|
|
animscripts\weaponlist::refillclip();
|
|
self.a.needstorechamber = 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//Function Number: 33
|
|
addgrenadethrowanimoffset(param_00,param_01)
|
|
{
|
|
if(!isdefined(level.grenadethrowanims))
|
|
{
|
|
anim.grenadethrowanims = [];
|
|
anim.grenadethrowoffsets = [];
|
|
}
|
|
|
|
var_02 = level.grenadethrowanims.size;
|
|
level.grenadethrowanims[var_02] = param_00;
|
|
level.grenadethrowoffsets[var_02] = param_01;
|
|
}
|
|
|
|
//Function Number: 34
|
|
initgrenadethrowanims()
|
|
{
|
|
addgrenadethrowanimoffset(%exposed_grenadethrowb,(41.5391,7.28883,72.2128));
|
|
addgrenadethrowanimoffset(%exposed_grenadethrowc,(34.8849,-4.77048,74.0488));
|
|
addgrenadethrowanimoffset(%corner_standl_grenade_a,(41.605,6.80107,81.4785));
|
|
addgrenadethrowanimoffset(%corner_standl_grenade_b,(24.1585,-14.7221,29.2992));
|
|
addgrenadethrowanimoffset(%cornercrl_grenadea,(25.8988,-10.2811,30.4813));
|
|
addgrenadethrowanimoffset(%cornercrl_grenadeb,(24.688,45.0702,64.377));
|
|
addgrenadethrowanimoffset(%corner_standr_grenade_a,(37.1254,-32.7053,76.5745));
|
|
addgrenadethrowanimoffset(%corner_standr_grenade_b,(19.356,15.5341,16.5036));
|
|
addgrenadethrowanimoffset(%cornercrr_grenadea,(39.8857,5.92472,24.5878));
|
|
addgrenadethrowanimoffset(%covercrouch_grenadea,(-1.6363,-0.693674,60.1009));
|
|
addgrenadethrowanimoffset(%covercrouch_grenadeb,(-1.6363,-0.693674,60.1009));
|
|
addgrenadethrowanimoffset(%coverstand_grenadea,(10.8573,7.12614,77.2356));
|
|
addgrenadethrowanimoffset(%coverstand_grenadeb,(19.1804,5.68214,73.2278));
|
|
addgrenadethrowanimoffset(%prone_grenade_a,(12.2859,-1.3019,33.4307));
|
|
addgrenadethrowanimoffset(%cqb_stand_grenade_throw,(35.7494,26.6052,37.7086));
|
|
addgrenadethrowanimoffset(%s1_covercrouch_grenadea,(-15.5413,-16.7719,19.4304));
|
|
addgrenadethrowanimoffset(%s1_coverstand_grenadea,(3.99694,-2.76588,32.8777));
|
|
addgrenadethrowanimoffset(%s1_coverstand_grenadeb,(5.51904,2.92983,32.8406));
|
|
addgrenadethrowanimoffset(%s1_exposed_crouch_fast_grenade_1,(16.4611,-8.55309,30.1018));
|
|
addgrenadethrowanimoffset(%s1_exposed_crouch_fast_grenade_2,(30.5886,-7.6374,47.3139));
|
|
addgrenadethrowanimoffset(%s1_exposed_grenadethrowc,(13.433,-0.473915,43.3545));
|
|
addgrenadethrowanimoffset(%s1_exposed_grenadethrowb,(-31.425,-7.62042,42.4334));
|
|
addgrenadethrowanimoffset(%s1_cornercrr_grenade_2,(37.4516,-2.01701,22.6517));
|
|
addgrenadethrowanimoffset(%s1_corner_standl_grenade_a,(41.605,6.80107,81.4785));
|
|
addgrenadethrowanimoffset(%s1_cornercrr_grenadea,(39.8857,5.92472,24.5878));
|
|
}
|
|
|
|
//Function Number: 35
|
|
getgrenadethrowoffset(param_00)
|
|
{
|
|
var_01 = (0,0,64);
|
|
if(isdefined(param_00))
|
|
{
|
|
foreach(var_04, var_03 in level.grenadethrowanims)
|
|
{
|
|
if(param_00 == var_03)
|
|
{
|
|
var_01 = level.grenadethrowoffsets[var_04];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(var_01[2] == 64)
|
|
{
|
|
if(!isdefined(param_00))
|
|
{
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
|
|
return var_01;
|
|
}
|
|
|
|
//Function Number: 36
|
|
throwgrenadeatplayerasap_combat_utility()
|
|
{
|
|
for(var_00 = 0;var_00 < level.players.size;var_00++)
|
|
{
|
|
if(level.players[var_00].numgrenadesinprogresstowardsplayer == 0)
|
|
{
|
|
level.players[var_00].grenadetimers["fraggrenade"] = 0;
|
|
level.players[var_00].grenadetimers["flash_grenade"] = 0;
|
|
}
|
|
}
|
|
|
|
anim.throwgrenadeatplayerasap = 1;
|
|
}
|
|
|
|
//Function Number: 37
|
|
setactivegrenadetimer(param_00)
|
|
{
|
|
self.activegrenadetimer = spawnstruct();
|
|
if(isplayer(param_00))
|
|
{
|
|
self.activegrenadetimer.isplayertimer = 1;
|
|
self.activegrenadetimer.player = param_00;
|
|
self.activegrenadetimer.timername = self.grenadeweapon;
|
|
return;
|
|
}
|
|
|
|
self.activegrenadetimer.isplayertimer = 0;
|
|
self.activegrenadetimer.timername = "AI_" + self.grenadeweapon;
|
|
}
|
|
|
|
//Function Number: 38
|
|
usingplayergrenadetimer()
|
|
{
|
|
return self.activegrenadetimer.isplayertimer;
|
|
}
|
|
|
|
//Function Number: 39
|
|
setgrenadetimer(param_00,param_01)
|
|
{
|
|
if(param_00.isplayertimer)
|
|
{
|
|
var_02 = param_00.player;
|
|
var_03 = var_02.grenadetimers[param_00.timername];
|
|
var_02.grenadetimers[param_00.timername] = max(param_01,var_03);
|
|
return;
|
|
}
|
|
|
|
var_03 = level.grenadetimers[param_01.timername];
|
|
level.grenadetimers[param_00.timername] = max(param_01,var_03);
|
|
}
|
|
|
|
//Function Number: 40
|
|
getdesiredgrenadetimervalue()
|
|
{
|
|
var_00 = undefined;
|
|
if(usingplayergrenadetimer())
|
|
{
|
|
var_01 = self.activegrenadetimer.player;
|
|
var_00 = gettime() + var_01.gs.playergrenadebasetime + randomint(var_01.gs.playergrenaderangetime);
|
|
}
|
|
else
|
|
{
|
|
var_00 = gettime() + 30000 + randomint(30000);
|
|
}
|
|
|
|
return var_00;
|
|
}
|
|
|
|
//Function Number: 41
|
|
getgrenadetimertime(param_00)
|
|
{
|
|
if(param_00.isplayertimer)
|
|
{
|
|
return param_00.player.grenadetimers[param_00.timername];
|
|
}
|
|
|
|
return level.grenadetimers[param_00.timername];
|
|
}
|
|
|
|
//Function Number: 42
|
|
considerchangingtarget(param_00)
|
|
{
|
|
if(!isplayer(param_00) && self isbadguy())
|
|
{
|
|
if(gettime() < getgrenadetimertime(self.activegrenadetimer))
|
|
{
|
|
if(level.player.ignoreme)
|
|
{
|
|
return param_00;
|
|
}
|
|
|
|
var_01 = self getthreatbiasgroup();
|
|
var_02 = level.player getthreatbiasgroup();
|
|
if(var_01 != "" && var_02 != "" && getthreatbias(var_02,var_01) < -10000)
|
|
{
|
|
return param_00;
|
|
}
|
|
|
|
if(self cansee(level.player) || isai(param_00) && param_00 cansee(level.player))
|
|
{
|
|
if(isdefined(self.covernode))
|
|
{
|
|
var_03 = vectortoangles(level.player.origin - self.origin);
|
|
var_04 = angleclamp180(self.covernode.angles[1] - var_03[1]);
|
|
}
|
|
else
|
|
{
|
|
var_04 = animscripts\utility::getyawtospot(level.player.origin);
|
|
}
|
|
|
|
if(abs(var_04) < 60)
|
|
{
|
|
param_00 = level.player;
|
|
setactivegrenadetimer(param_00);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return param_00;
|
|
}
|
|
|
|
//Function Number: 43
|
|
maythrowdoublegrenade(param_00)
|
|
{
|
|
if(maps\_utility::player_died_recently())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(!param_00.gs.double_grenades_allowed)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
var_01 = gettime();
|
|
if(var_01 < param_00.grenadetimers["double_grenade"])
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(var_01 > param_00.lastfraggrenadetoplayerstart + 3000)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(var_01 < param_00.lastfraggrenadetoplayerstart + 500)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return param_00.numgrenadesinprogresstowardsplayer < 2;
|
|
}
|
|
|
|
//Function Number: 44
|
|
mygrenadecooldownelapsed()
|
|
{
|
|
return gettime() >= self.a.nextgrenadetrytime;
|
|
}
|
|
|
|
//Function Number: 45
|
|
grenadecooldownelapsed(param_00)
|
|
{
|
|
if(maps\_utility::player_died_recently())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self.script_forcegrenade == 1)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(!mygrenadecooldownelapsed())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(gettime() >= getgrenadetimertime(self.activegrenadetimer))
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(self.activegrenadetimer.isplayertimer && self.activegrenadetimer.timername == "fraggrenade")
|
|
{
|
|
return maythrowdoublegrenade(param_00);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 46
|
|
trygrenadeposproc(param_00,param_01,param_02,param_03)
|
|
{
|
|
if(!self isgrenadepossafe(param_00,param_01))
|
|
{
|
|
return 0;
|
|
}
|
|
else if(distancesquared(self.origin,param_01) < 40000)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
var_04 = physicstrace(param_01 + (0,0,1),param_01 + (0,0,-500));
|
|
if(var_04 == param_01 + (0,0,-500))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
var_04 = var_04 + (0,0,0.1);
|
|
return trygrenadethrow(param_00,var_04,param_02,param_03);
|
|
}
|
|
|
|
//Function Number: 47
|
|
trygrenade(param_00,param_01)
|
|
{
|
|
if(self.weapon == "mg42" || self.grenadeammo <= 0)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
setactivegrenadetimer(param_00);
|
|
param_00 = considerchangingtarget(param_00);
|
|
if(!grenadecooldownelapsed(param_00))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
var_02 = getgrenadethrowoffset(param_01);
|
|
if(isdefined(self.enemy) && param_00 == self.enemy)
|
|
{
|
|
if(!checkgrenadethrowdist())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(isplayer(self.enemy) && maps\_utility::is_player_down(self.enemy))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(animscripts\utility::canseeenemyfromexposed())
|
|
{
|
|
if(!self isgrenadepossafe(param_00,param_00.origin))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return trygrenadethrow(param_00,undefined,param_01,var_02);
|
|
}
|
|
else if(animscripts\utility::cansuppressenemyfromexposed())
|
|
{
|
|
return trygrenadeposproc(param_00,animscripts\utility::getenemysightpos(),param_01,var_02);
|
|
}
|
|
else
|
|
{
|
|
if(common_scripts\utility::flag("_cloaked_stealth_enabled"))
|
|
{
|
|
var_03 = self lastknownpos(param_00);
|
|
}
|
|
else
|
|
{
|
|
var_03 = param_01.origin;
|
|
}
|
|
|
|
if(!self isgrenadepossafe(param_00,var_03))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return trygrenadethrow(param_00,undefined,param_01,var_02);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
if(common_scripts\utility::flag("_cloaked_stealth_enabled"))
|
|
{
|
|
var_03 = self lastknownpos(param_01);
|
|
}
|
|
else
|
|
{
|
|
var_03 = param_01.origin;
|
|
}
|
|
|
|
return trygrenadeposproc(param_00,var_03,param_01,var_02);
|
|
}
|
|
|
|
//Function Number: 48
|
|
trygrenadethrow(param_00,param_01,param_02,param_03,param_04,param_05,param_06)
|
|
{
|
|
if(gettime() < 10000 && !isdefined(level.ignoregrenadesafetime))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(!isdefined(param_05))
|
|
{
|
|
param_05 = 1;
|
|
}
|
|
|
|
if(isdefined(param_02))
|
|
{
|
|
var_07 = param_02;
|
|
var_08 = self.a.gunhand;
|
|
}
|
|
else
|
|
{
|
|
switch(self.a.special)
|
|
{
|
|
case "cover_crouch":
|
|
case "none":
|
|
if(self.a.pose == "stand")
|
|
{
|
|
param_05 = (0,0,80);
|
|
var_07 = %stand_grenade_throw;
|
|
}
|
|
else
|
|
{
|
|
param_05 = (0,0,65);
|
|
var_07 = %crouch_grenade_throw;
|
|
}
|
|
|
|
var_08 = "left";
|
|
break;
|
|
|
|
default:
|
|
var_07 = undefined;
|
|
var_08 = undefined;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(!isdefined(var_07))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(isdefined(param_01))
|
|
{
|
|
if(!isdefined(param_04))
|
|
{
|
|
var_09 = self checkgrenadethrowpos(param_03,param_01,param_05,"min energy","min time","max time");
|
|
}
|
|
else
|
|
{
|
|
var_09 = self checkgrenadethrowpos(param_04,param_02,param_06,"min time","min energy");
|
|
}
|
|
}
|
|
else if(common_scripts\utility::flag("_cloaked_stealth_enabled"))
|
|
{
|
|
var_09 = self checkgrenadethrowpos(param_04,self lastknownpos(param_01),param_06,"min energy","min time","max time");
|
|
}
|
|
else
|
|
{
|
|
var_0A = distance(param_01.origin,self.origin);
|
|
var_0B = self.randomgrenaderange;
|
|
if(var_0A < 800)
|
|
{
|
|
if(var_0A < 256)
|
|
{
|
|
var_0B = 0;
|
|
}
|
|
else
|
|
{
|
|
var_0B = var_0B * var_0A - 256 / 544;
|
|
}
|
|
}
|
|
|
|
if(!isdefined(param_04))
|
|
{
|
|
var_09 = self checkgrenadethrow(param_03,var_0B,"min energy","min time","max time");
|
|
}
|
|
else
|
|
{
|
|
var_09 = self checkgrenadethrow(param_03,var_0B,"min time","min energy");
|
|
}
|
|
}
|
|
|
|
self.a.nextgrenadetrytime = gettime() + randomintrange(1000,2000);
|
|
if(isdefined(var_09))
|
|
{
|
|
if(!isdefined(self.oldgrenawareness))
|
|
{
|
|
self.oldgrenawareness = self.grenadeawareness;
|
|
}
|
|
|
|
self.grenadeawareness = 0;
|
|
var_0C = getdesiredgrenadetimervalue();
|
|
setgrenadetimer(self.activegrenadetimer,min(gettime() + 3000,var_0C));
|
|
var_0D = 0;
|
|
if(usingplayergrenadetimer())
|
|
{
|
|
param_00.numgrenadesinprogresstowardsplayer++;
|
|
thread reducegiptponkillanimscript(param_00);
|
|
if(param_00.numgrenadesinprogresstowardsplayer > 1)
|
|
{
|
|
var_0D = 1;
|
|
}
|
|
|
|
if(self.activegrenadetimer.timername == "fraggrenade")
|
|
{
|
|
if(param_00.numgrenadesinprogresstowardsplayer <= 1)
|
|
{
|
|
param_00.lastfraggrenadetoplayerstart = gettime();
|
|
}
|
|
}
|
|
}
|
|
|
|
if(isdefined(param_06))
|
|
{
|
|
thread dogrenadethrow(var_07,var_09,var_0C,var_0D);
|
|
}
|
|
else
|
|
{
|
|
dogrenadethrow(var_07,var_09,var_0C,var_0D);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 49
|
|
reducegiptponkillanimscript(param_00)
|
|
{
|
|
self endon("dont_reduce_giptp_on_killanimscript");
|
|
self waittill("killanimscript");
|
|
param_00.numgrenadesinprogresstowardsplayer--;
|
|
}
|
|
|
|
//Function Number: 50
|
|
dogrenadethrow(param_00,param_01,param_02,param_03)
|
|
{
|
|
self endon("killanimscript");
|
|
if(self.script == "combat" || self.script == "move")
|
|
{
|
|
self orientmode("face direction",param_01);
|
|
}
|
|
|
|
animscripts\battlechatter_ai::evaluateattackevent(self.grenadeweapon);
|
|
maps\_dds::dds_notify_grenade(self.grenadeweapon,self.team == "allies",0);
|
|
self notify("stop_aiming_at_enemy");
|
|
self setflaggedanimknoballrestart("throwanim",param_00,%body,fasteranimspeed(),0.1,1);
|
|
thread animscripts\notetracks::donotetracksforever("throwanim","killanimscript");
|
|
var_04 = animscripts\utility::getgrenademodel();
|
|
var_05 = "none";
|
|
for(;;)
|
|
{
|
|
self waittill("throwanim",var_06);
|
|
if(var_06 == "grenade_left" || var_06 == "grenade_right")
|
|
{
|
|
var_05 = attachgrenademodel(var_04,"TAG_INHAND");
|
|
self.isholdinggrenade = 1;
|
|
}
|
|
|
|
if(var_06 == "grenade_throw" || var_06 == "grenade throw")
|
|
{
|
|
break;
|
|
}
|
|
|
|
if(var_06 == "end")
|
|
{
|
|
self.activegrenadetimer.player.numgrenadesinprogresstowardsplayer--;
|
|
self notify("dont_reduce_giptp_on_killanimscript");
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
self notify("dont_reduce_giptp_on_killanimscript");
|
|
if(usingplayergrenadetimer())
|
|
{
|
|
thread watchgrenadetowardsplayer(self.activegrenadetimer.player,param_02);
|
|
}
|
|
|
|
self throwgrenade();
|
|
if(!usingplayergrenadetimer())
|
|
{
|
|
setgrenadetimer(self.activegrenadetimer,param_02);
|
|
}
|
|
|
|
if(param_03)
|
|
{
|
|
var_0D = self.activegrenadetimer.player;
|
|
if(var_0D.numgrenadesinprogresstowardsplayer > 1 || gettime() - var_0D.lastgrenadelandednearplayertime < 2000)
|
|
{
|
|
var_0D.grenadetimers["double_grenade"] = gettime() + min(5000,var_0D.gs.playerdoublegrenadetime);
|
|
}
|
|
}
|
|
|
|
self notify("stop grenade check");
|
|
if(var_05 != "none")
|
|
{
|
|
self detach(var_04,var_05);
|
|
}
|
|
else
|
|
{
|
|
}
|
|
|
|
self.isholdinggrenade = undefined;
|
|
self.grenadeawareness = self.oldgrenawareness;
|
|
self.oldgrenawareness = undefined;
|
|
self waittillmatch("end","throwanim");
|
|
self notify("done_grenade_throw");
|
|
self notify("weapon_switch_done");
|
|
self setanim(%exposed_modern,1,0.2);
|
|
self setanim(%exposed_aiming,1);
|
|
self clearanim(param_00,0.2);
|
|
}
|
|
|
|
//Function Number: 51
|
|
watchgrenadetowardsplayer(param_00,param_01)
|
|
{
|
|
param_00 endon("death");
|
|
watchgrenadetowardsplayerinternal(param_01);
|
|
param_00.numgrenadesinprogresstowardsplayer--;
|
|
}
|
|
|
|
//Function Number: 52
|
|
watchgrenadetowardsplayerinternal(param_00)
|
|
{
|
|
var_01 = self.activegrenadetimer;
|
|
var_02 = spawnstruct();
|
|
var_02 thread watchgrenadetowardsplayertimeout(5);
|
|
var_02 endon("watchGrenadeTowardsPlayerTimeout");
|
|
var_03 = self.grenadeweapon;
|
|
var_04 = getgrenadeithrew();
|
|
if(!isdefined(var_04))
|
|
{
|
|
return;
|
|
}
|
|
|
|
setgrenadetimer(var_01,min(gettime() + 5000,param_00));
|
|
var_05 = 62500;
|
|
var_06 = 160000;
|
|
if(var_03 == "flash_grenade")
|
|
{
|
|
var_05 = 810000;
|
|
var_06 = 1690000;
|
|
}
|
|
|
|
var_07 = level.players;
|
|
var_08 = var_04.origin;
|
|
for(;;)
|
|
{
|
|
wait(0.1);
|
|
if(!isdefined(var_04))
|
|
{
|
|
break;
|
|
}
|
|
|
|
if(distancesquared(var_04.origin,var_08) < 400)
|
|
{
|
|
var_09 = [];
|
|
for(var_0A = 0;var_0A < var_07.size;var_0A++)
|
|
{
|
|
var_0B = var_07[var_0A];
|
|
var_0C = distancesquared(var_04.origin,var_0B.origin);
|
|
if(var_0C < var_05)
|
|
{
|
|
var_0B grenadelandednearplayer(var_01,param_00);
|
|
continue;
|
|
}
|
|
|
|
if(var_0C < var_06)
|
|
{
|
|
var_09[var_09.size] = var_0B;
|
|
}
|
|
}
|
|
|
|
var_07 = var_09;
|
|
if(var_07.size == 0)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
var_08 = var_04.origin;
|
|
}
|
|
}
|
|
|
|
//Function Number: 53
|
|
grenadelandednearplayer(param_00,param_01)
|
|
{
|
|
var_02 = self;
|
|
anim.throwgrenadeatplayerasap = undefined;
|
|
if(gettime() - var_02.lastgrenadelandednearplayertime < 3000)
|
|
{
|
|
var_02.grenadetimers["double_grenade"] = gettime() + var_02.gs.playerdoublegrenadetime;
|
|
}
|
|
|
|
var_02.lastgrenadelandednearplayertime = gettime();
|
|
var_03 = var_02.grenadetimers[param_00.timername];
|
|
var_02.grenadetimers[param_00.timername] = max(param_01,var_03);
|
|
}
|
|
|
|
//Function Number: 54
|
|
getgrenadeithrew()
|
|
{
|
|
self endon("killanimscript");
|
|
self waittill("grenade_fire",var_00);
|
|
return var_00;
|
|
}
|
|
|
|
//Function Number: 55
|
|
watchgrenadetowardsplayertimeout(param_00)
|
|
{
|
|
wait(param_00);
|
|
self notify("watchGrenadeTowardsPlayerTimeout");
|
|
}
|
|
|
|
//Function Number: 56
|
|
attachgrenademodel(param_00,param_01)
|
|
{
|
|
self attach(param_00,param_01);
|
|
thread detachgrenadeonscriptchange(param_00,param_01);
|
|
return param_01;
|
|
}
|
|
|
|
//Function Number: 57
|
|
detachgrenadeonscriptchange(param_00,param_01)
|
|
{
|
|
self endon("stop grenade check");
|
|
self waittill("killanimscript");
|
|
if(!isdefined(self))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(isdefined(self.oldgrenawareness))
|
|
{
|
|
self.grenadeawareness = self.oldgrenawareness;
|
|
self.oldgrenawareness = undefined;
|
|
}
|
|
|
|
self detach(param_00,param_01);
|
|
}
|
|
|
|
//Function Number: 58
|
|
offsettoorigin(param_00)
|
|
{
|
|
var_01 = anglestoforward(self.angles);
|
|
var_02 = anglestoright(self.angles);
|
|
var_03 = anglestoup(self.angles);
|
|
var_01 = var_01 * param_00[0];
|
|
var_02 = var_02 * param_00[1];
|
|
var_03 = var_03 * param_00[2];
|
|
return var_01 + var_02 + var_03;
|
|
}
|
|
|
|
//Function Number: 59
|
|
grenadeline(param_00,param_01)
|
|
{
|
|
level notify("armoffset");
|
|
level endon("armoffset");
|
|
param_00 = self.origin + offsettoorigin(param_00);
|
|
wait(0.05);
|
|
}
|
|
|
|
//Function Number: 60
|
|
getgrenadedropvelocity()
|
|
{
|
|
var_00 = randomfloat(360);
|
|
var_01 = randomfloatrange(30,75);
|
|
var_02 = sin(var_01);
|
|
var_03 = cos(var_01);
|
|
var_04 = cos(var_00) * var_03;
|
|
var_05 = sin(var_00) * var_03;
|
|
var_06 = randomfloatrange(100,200);
|
|
var_07 = (var_04,var_05,var_02) * var_06;
|
|
return var_07;
|
|
}
|
|
|
|
//Function Number: 61
|
|
dropgrenade()
|
|
{
|
|
var_00 = self gettagorigin("tag_inhand");
|
|
var_01 = getgrenadedropvelocity();
|
|
self magicgrenademanual(var_00,var_01,3);
|
|
}
|
|
|
|
//Function Number: 62
|
|
lookforbettercover()
|
|
{
|
|
if(!isdefined(self.enemy))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self.fixednode || self.doingambush)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
var_00 = getbestcovernodeifavailable();
|
|
if(isdefined(var_00))
|
|
{
|
|
return usecovernodeifpossible(var_00);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 63
|
|
getbestcovernodeifavailable()
|
|
{
|
|
var_00 = self findbestcovernode();
|
|
if(!isdefined(var_00))
|
|
{
|
|
return undefined;
|
|
}
|
|
|
|
var_01 = animscripts\utility::getclaimednode();
|
|
if(isdefined(var_01) && var_00 == var_01)
|
|
{
|
|
return undefined;
|
|
}
|
|
|
|
if(isdefined(self.covernode) && var_00 == self.covernode)
|
|
{
|
|
return undefined;
|
|
}
|
|
|
|
return var_00;
|
|
}
|
|
|
|
//Function Number: 64
|
|
usecovernodeifpossible(param_00)
|
|
{
|
|
var_01 = self.keepclaimednodeifvalid;
|
|
var_02 = self.keepclaimednode;
|
|
self.keepclaimednodeifvalid = 0;
|
|
self.keepclaimednode = 0;
|
|
if(self usecovernode(param_00))
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
}
|
|
|
|
self.keepclaimednodeifvalid = var_01;
|
|
self.keepclaimednode = var_02;
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 65
|
|
shouldhelpadvancingteammate()
|
|
{
|
|
if(level.advancetoenemygroup[self.team] > 0 && level.advancetoenemygroup[self.team] < level.advancetoenemygroupmax)
|
|
{
|
|
if(gettime() - level.lastadvancetoenemytime[self.team] > 4000)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
var_00 = level.lastadvancetoenemyattacker[self.team];
|
|
if(var_00 == self)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
var_01 = isdefined(var_00) && distancesquared(self.origin,var_00.origin) < 65536;
|
|
if((var_01 || distancesquared(self.origin,level.lastadvancetoenemysrc[self.team]) < 65536) && !isdefined(self.enemy) || distancesquared(self.enemy.origin,level.lastadvancetoenemydest[self.team]) < 262144)
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 66
|
|
checkadvanceonenemyconditions()
|
|
{
|
|
if(!isdefined(level.lastadvancetoenemytime[self.team]))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(shouldhelpadvancingteammate())
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(gettime() - level.lastadvancetoenemytime[self.team] < level.advancetoenemyinterval)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(!issentient(self.enemy))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(level.advancetoenemygroup[self.team])
|
|
{
|
|
level.advancetoenemygroup[self.team] = 0;
|
|
}
|
|
|
|
var_00 = isdefined(self.advance_regardless_of_numbers) && self.advance_regardless_of_numbers;
|
|
if(!var_00 && getaicount(self.team) < getaicount(self.enemy.team))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//Function Number: 67
|
|
tryrunningtoenemy(param_00)
|
|
{
|
|
if(!isdefined(self.enemy))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self.fixednode)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self.combatmode == "ambush" || self.combatmode == "ambush_nodes_only")
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(!self isingoal(self.enemy.origin))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(islongrangeai())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(!checkadvanceonenemyconditions())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
self findreacquiredirectpath(param_00);
|
|
if(self reacquiremove())
|
|
{
|
|
self.keepclaimednodeifvalid = 0;
|
|
self.keepclaimednode = 0;
|
|
self.a.magicreloadwhenreachenemy = 1;
|
|
if(level.advancetoenemygroup[self.team] == 0)
|
|
{
|
|
level.lastadvancetoenemytime[self.team] = gettime();
|
|
level.lastadvancetoenemyattacker[self.team] = self;
|
|
}
|
|
|
|
level.lastadvancetoenemysrc[self.team] = self.origin;
|
|
level.lastadvancetoenemydest[self.team] = self.enemy.origin;
|
|
level.advancetoenemygroup[self.team]++;
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 68
|
|
delayedbadplace(param_00)
|
|
{
|
|
self endon("death");
|
|
wait(0.5);
|
|
var_01 = "" + level.badplaceint;
|
|
badplace_cylinder(var_01,5,param_00,16,64,self.team);
|
|
level.badplaces[level.badplaces.size] = var_01;
|
|
if(level.badplaces.size >= 10)
|
|
{
|
|
var_02 = [];
|
|
for(var_03 = 1;var_03 < level.badplaces.size;var_03++)
|
|
{
|
|
var_02[var_02.size] = level.badplaces[var_03];
|
|
}
|
|
|
|
badplace_delete(level.badplaces[0]);
|
|
anim.badplaces = var_02;
|
|
}
|
|
|
|
level.badplaceint++;
|
|
if(level.badplaceint > 10)
|
|
{
|
|
anim.badplaceint = level.badplaceint - 20;
|
|
}
|
|
}
|
|
|
|
//Function Number: 69
|
|
valueiswithin(param_00,param_01,param_02)
|
|
{
|
|
if(param_00 > param_01 && param_00 < param_02)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 70
|
|
getgunyawtoshootentorpos()
|
|
{
|
|
if(!isdefined(self.shootpos))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
var_00 = self getmuzzleangle()[1] - animscripts\utility::getyaw(self.shootpos);
|
|
var_00 = angleclamp180(var_00);
|
|
return var_00;
|
|
}
|
|
|
|
//Function Number: 71
|
|
getgunpitchtoshootentorpos()
|
|
{
|
|
if(!isdefined(self.shootpos))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
var_00 = self getmuzzleangle()[0] - vectortoangles(self.shootpos - self getmuzzlepos())[0];
|
|
var_00 = angleclamp180(var_00);
|
|
return var_00;
|
|
}
|
|
|
|
//Function Number: 72
|
|
getpitchtoenemy()
|
|
{
|
|
if(!isdefined(self.enemy))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(common_scripts\utility::flag("_cloaked_stealth_enabled"))
|
|
{
|
|
var_00 = get_last_known_shoot_pos(self.enemy);
|
|
}
|
|
else
|
|
{
|
|
var_00 = self.enemy getshootatpos();
|
|
}
|
|
|
|
var_01 = var_00 - self getshootatpos();
|
|
var_01 = vectornormalize(var_01);
|
|
var_02 = 360 - vectortoangles(var_01)[0];
|
|
return angleclamp180(var_02);
|
|
}
|
|
|
|
//Function Number: 73
|
|
getpitchtospot(param_00)
|
|
{
|
|
if(!isdefined(param_00))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
var_01 = param_00 - self getshootatpos();
|
|
var_01 = vectornormalize(var_01);
|
|
var_02 = 360 - vectortoangles(var_01)[0];
|
|
return angleclamp180(var_02);
|
|
}
|
|
|
|
//Function Number: 74
|
|
getpitchtoorgfromorg(param_00,param_01)
|
|
{
|
|
if(!isdefined(param_00) || !isdefined(param_01))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(isdefined(self) && animscripts\utility::isspaceai())
|
|
{
|
|
var_02 = anglestoforward(self.angles);
|
|
var_03 = rotatepointaroundvector(var_02,param_00 - self.origin,self.angles[2] * -1);
|
|
param_00 = var_03 + self.origin;
|
|
}
|
|
|
|
var_04 = param_00 - param_01;
|
|
var_04 = vectornormalize(var_04);
|
|
var_05 = 360 - vectortoangles(var_04)[0];
|
|
return angleclamp180(var_05);
|
|
}
|
|
|
|
//Function Number: 75
|
|
watchreloading()
|
|
{
|
|
self.isreloading = 0;
|
|
self.lastreloadstarttime = -1;
|
|
for(;;)
|
|
{
|
|
self waittill("reload_start");
|
|
maps\_dds::dds_notify_reload(self getcurrentweapon(),self.team == "allies");
|
|
self.isreloading = 1;
|
|
self.lastreloadstarttime = gettime();
|
|
waittillreloadfinished();
|
|
self.isreloading = 0;
|
|
}
|
|
}
|
|
|
|
//Function Number: 76
|
|
waittillreloadfinished()
|
|
{
|
|
thread timednotify(4,"reloadtimeout");
|
|
self endon("reloadtimeout");
|
|
self endon("weapon_taken");
|
|
for(;;)
|
|
{
|
|
self waittill("reload");
|
|
var_00 = self getcurrentweapon();
|
|
if(var_00 == "none")
|
|
{
|
|
break;
|
|
}
|
|
|
|
if(self getcurrentweaponclipammo() >= weaponclipsize(var_00))
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
self notify("reloadtimeout");
|
|
}
|
|
|
|
//Function Number: 77
|
|
timednotify(param_00,param_01)
|
|
{
|
|
self endon(param_01);
|
|
wait(param_00);
|
|
self notify(param_01);
|
|
}
|
|
|
|
//Function Number: 78
|
|
checkgrenadethrowdist()
|
|
{
|
|
var_00 = self.enemy.origin - self.origin;
|
|
var_01 = lengthsquared((var_00[0],var_00[1],0));
|
|
if(self.grenadeweapon == "flash_grenade")
|
|
{
|
|
return var_01 < 589824;
|
|
}
|
|
|
|
return var_01 >= 40000 && var_01 <= 1562500;
|
|
}
|
|
|
|
//Function Number: 79
|
|
monitorflash()
|
|
{
|
|
self endon("death");
|
|
if(!isdefined(level.neverstopmonitoringflash))
|
|
{
|
|
self endon("stop_monitoring_flash");
|
|
}
|
|
|
|
for(;;)
|
|
{
|
|
var_00 = undefined;
|
|
var_01 = undefined;
|
|
var_02 = undefined;
|
|
var_03 = undefined;
|
|
var_04 = undefined;
|
|
self waittill("flashbang",var_01,var_00,var_02,var_03,var_04);
|
|
if(isdefined(self.flashbangimmunity) && self.flashbangimmunity)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(isdefined(self.script_immunetoflash) && self.script_immunetoflash != 0)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(isdefined(self.team) && isdefined(var_04) && self.team == var_04)
|
|
{
|
|
var_00 = 3 * var_00 - 0.75;
|
|
if(var_00 < 0)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(isdefined(self.teamflashbangimmunity))
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
|
|
var_05 = 0.2;
|
|
if(var_00 > 1 - var_05)
|
|
{
|
|
var_00 = 1;
|
|
}
|
|
else
|
|
{
|
|
var_00 = var_00 / 1 - var_05;
|
|
}
|
|
|
|
var_06 = 4.5 * var_00;
|
|
if(var_06 < 0.25)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
self.flashingteam = var_04;
|
|
maps\_utility::flashbangstart(var_06);
|
|
self notify("doFlashBanged",var_01,var_03);
|
|
}
|
|
}
|
|
|
|
//Function Number: 80
|
|
isshotgunai()
|
|
{
|
|
return animscripts\utility::isshotgun(self.primaryweapon);
|
|
}
|
|
|
|
//Function Number: 81
|
|
issniper()
|
|
{
|
|
return animscripts\utility::issniperrifle(self.primaryweapon);
|
|
}
|
|
|
|
//Function Number: 82
|
|
islongrangeai()
|
|
{
|
|
return issniper() || animscripts\utility::usingrocketlauncher();
|
|
}
|
|
|
|
//Function Number: 83
|
|
fasteranimspeed()
|
|
{
|
|
return 1.5;
|
|
}
|
|
|
|
//Function Number: 84
|
|
randomfasteranimspeed()
|
|
{
|
|
return randomfloatrange(1,1.2);
|
|
}
|
|
|
|
//Function Number: 85
|
|
getrandomcovermode(param_00)
|
|
{
|
|
if(param_00.size == 0)
|
|
{
|
|
return undefined;
|
|
}
|
|
|
|
if(param_00.size == 1)
|
|
{
|
|
return param_00[0];
|
|
}
|
|
|
|
if(isdefined(self.a.prevattack) && randomint(100) > 20)
|
|
{
|
|
foreach(var_03, var_02 in param_00)
|
|
{
|
|
if(var_02 == self.a.prevattack)
|
|
{
|
|
if(var_03 < param_00.size - 1)
|
|
{
|
|
param_00[var_03] = param_00[param_00.size - 1];
|
|
}
|
|
|
|
param_00[param_00.size - 1] = undefined;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return param_00[randomint(param_00.size)];
|
|
}
|
|
|
|
//Function Number: 86
|
|
player_sees_my_scope()
|
|
{
|
|
var_00 = self geteye();
|
|
foreach(var_02 in level.players)
|
|
{
|
|
if(!self cansee(var_02))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
var_03 = var_02 geteye();
|
|
var_04 = vectortoangles(var_00 - var_03);
|
|
var_05 = anglestoforward(var_04);
|
|
var_06 = var_02 getplayerangles();
|
|
var_07 = anglestoforward(var_06);
|
|
var_08 = vectordot(var_05,var_07);
|
|
if(var_08 < 0.805)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(common_scripts\utility::cointoss() && var_08 >= 0.996)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 87
|
|
get_last_known_shoot_pos(param_00)
|
|
{
|
|
var_01 = self lastknownpos(param_00);
|
|
var_02 = param_00 getshootatpos() - param_00.origin;
|
|
return var_01 + var_02;
|
|
} |