602 lines
14 KiB
Plaintext
602 lines
14 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
decidewhatandhowtoshoot( var_0 )
|
|
{
|
|
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 = var_0;
|
|
self.shootent = undefined;
|
|
self.shootpos = undefined;
|
|
self.shootstyle = "none";
|
|
self.fastburst = 0;
|
|
self.shouldreturntocover = undefined;
|
|
|
|
if ( !isdefined( self.changingcoverpos ) )
|
|
self.changingcoverpos = 0;
|
|
|
|
var_1 = isdefined( self.covernode ) && self.covernode.type != "Cover Prone" && self.covernode.type != "Conceal Prone";
|
|
|
|
if ( var_1 )
|
|
wait 0.05;
|
|
|
|
var_2 = self.shootent;
|
|
var_3 = self.shootpos;
|
|
var_4 = self.shootstyle;
|
|
|
|
if ( !isdefined( self.has_no_ir ) )
|
|
{
|
|
self.a.laseron = 1;
|
|
animscripts\shared::updatelaserstatus();
|
|
}
|
|
|
|
if ( animscripts\combat_utility::issniper() )
|
|
resetsniperaim();
|
|
|
|
if ( var_1 && ( !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_5 = undefined;
|
|
|
|
if ( self.weapon == "none" )
|
|
nogunshoot();
|
|
else if ( animscripts\utility::usingrocketlauncher() )
|
|
var_5 = rpgshoot();
|
|
else if ( animscripts\utility::usingsidearm() )
|
|
var_5 = pistolshoot();
|
|
else
|
|
var_5 = rifleshoot();
|
|
|
|
if ( isdefined( self.a.specialshootbehavior ) )
|
|
[[ self.a.specialshootbehavior ]]();
|
|
|
|
if ( checkchanged( var_2, self.shootent ) || !isdefined( self.shootent ) && checkchanged( var_3, self.shootpos ) || checkchanged( var_4, self.shootstyle ) )
|
|
self notify( "shoot_behavior_change" );
|
|
|
|
var_2 = self.shootent;
|
|
var_3 = self.shootpos;
|
|
var_4 = self.shootstyle;
|
|
|
|
if ( !isdefined( var_5 ) )
|
|
waitabit();
|
|
}
|
|
}
|
|
|
|
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 ) )
|
|
{
|
|
self.shootpos = self.shootent getshootatpos();
|
|
wait 0.05;
|
|
}
|
|
}
|
|
else
|
|
self waittill( "do_slow_things" );
|
|
}
|
|
|
|
nogunshoot()
|
|
{
|
|
self.shootent = undefined;
|
|
self.shootpos = undefined;
|
|
self.shootstyle = "none";
|
|
self.shootobjective = "normal";
|
|
}
|
|
|
|
shouldsuppress()
|
|
{
|
|
return !animscripts\combat_utility::issniper() && !animscripts\utility::isshotgun( self.weapon );
|
|
}
|
|
|
|
shouldshootenemyent()
|
|
{
|
|
if ( !animscripts\utility::canseeenemy() )
|
|
return 0;
|
|
|
|
if ( !isdefined( self.covernode ) && !self canshootenemy() )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
rifleshootobjectivenormal()
|
|
{
|
|
if ( !shouldshootenemyent() )
|
|
{
|
|
if ( animscripts\combat_utility::issniper() )
|
|
resetsniperaim();
|
|
|
|
if ( self.doingambush )
|
|
{
|
|
self.shootobjective = "ambush";
|
|
return "retry";
|
|
}
|
|
|
|
if ( !isdefined( self.enemy ) )
|
|
havenothingtoshoot();
|
|
else
|
|
{
|
|
markenemyposinvisible();
|
|
|
|
if ( ( self.providecoveringfire || randomint( 5 ) > 0 ) && shouldsuppress() )
|
|
self.shootobjective = "suppress";
|
|
else
|
|
self.shootobjective = "ambush";
|
|
|
|
return "retry";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
setshootenttoenemy();
|
|
setshootstyleforvisibleenemy();
|
|
}
|
|
}
|
|
|
|
rifleshootobjectivesuppress( var_0 )
|
|
{
|
|
if ( !var_0 )
|
|
havenothingtoshoot();
|
|
else
|
|
{
|
|
self.shootent = undefined;
|
|
self.shootpos = animscripts\utility::getenemysightpos();
|
|
setshootstyleforsuppression();
|
|
}
|
|
}
|
|
|
|
rifleshootobjectiveambush( var_0 )
|
|
{
|
|
self.shootstyle = "none";
|
|
self.shootent = undefined;
|
|
|
|
if ( !var_0 )
|
|
{
|
|
getambushshootpos();
|
|
|
|
if ( shouldstopambushing() )
|
|
{
|
|
self.ambushendtime = undefined;
|
|
self notify( "return_to_cover" );
|
|
self.shouldreturntocover = 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
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";
|
|
}
|
|
}
|
|
}
|
|
|
|
getambushshootpos()
|
|
{
|
|
if ( isdefined( self.enemy ) && self cansee( self.enemy ) )
|
|
{
|
|
setshootenttoenemy();
|
|
return;
|
|
}
|
|
|
|
var_0 = self getanglestolikelyenemypath();
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
{
|
|
if ( isdefined( self.covernode ) )
|
|
var_0 = self.covernode.angles;
|
|
else if ( isdefined( self.ambushnode ) )
|
|
var_0 = self.ambushnode.angles;
|
|
else if ( isdefined( self.enemy ) )
|
|
var_0 = vectortoangles( self lastknownpos( self.enemy ) - self.origin );
|
|
else
|
|
var_0 = self.angles;
|
|
}
|
|
|
|
var_1 = 1024;
|
|
|
|
if ( isdefined( self.enemy ) )
|
|
var_1 = distance( self.origin, self.enemy.origin );
|
|
|
|
var_2 = self geteye() + anglestoforward( var_0 ) * var_1;
|
|
|
|
if ( !isdefined( self.shootpos ) || distancesquared( var_2, self.shootpos ) > 25 )
|
|
self.shootpos = var_2;
|
|
}
|
|
|
|
rifleshoot()
|
|
{
|
|
if ( self.shootobjective == "normal" )
|
|
rifleshootobjectivenormal();
|
|
else
|
|
{
|
|
if ( shouldshootenemyent() )
|
|
{
|
|
self.shootobjective = "normal";
|
|
self.ambushendtime = undefined;
|
|
return "retry";
|
|
}
|
|
|
|
markenemyposinvisible();
|
|
|
|
if ( animscripts\combat_utility::issniper() )
|
|
resetsniperaim();
|
|
|
|
var_0 = animscripts\utility::cansuppressenemy();
|
|
|
|
if ( self.shootobjective == "suppress" || self.team == "allies" && !isdefined( self.enemy ) && !var_0 )
|
|
rifleshootobjectivesuppress( var_0 );
|
|
else
|
|
rifleshootobjectiveambush( var_0 );
|
|
}
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
rpgshoot()
|
|
{
|
|
if ( !shouldshootenemyent() )
|
|
{
|
|
markenemyposinvisible();
|
|
havenothingtoshoot();
|
|
return;
|
|
}
|
|
|
|
setshootenttoenemy();
|
|
setshootstyle( "single", 0 );
|
|
var_0 = lengthsquared( self.origin - self.shootpos );
|
|
|
|
if ( var_0 < squared( 512 ) )
|
|
{
|
|
self notify( "return_to_cover" );
|
|
self.shouldreturntocover = 1;
|
|
return;
|
|
}
|
|
}
|
|
|
|
pistolshoot()
|
|
{
|
|
if ( self.shootobjective == "normal" )
|
|
{
|
|
if ( !shouldshootenemyent() )
|
|
{
|
|
if ( !isdefined( self.enemy ) )
|
|
{
|
|
havenothingtoshoot();
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
markenemyposinvisible();
|
|
self.shootobjective = "ambush";
|
|
return "retry";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
setshootenttoenemy();
|
|
setshootstyle( "single", 0 );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
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";
|
|
}
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
runonshootbehaviorend()
|
|
{
|
|
self endon( "death" );
|
|
common_scripts\utility::waittill_any( "killanimscript", "stop_deciding_how_to_shoot" );
|
|
self.a.laseron = 0;
|
|
animscripts\shared::updatelaserstatus();
|
|
}
|
|
|
|
checkchanged( var_0, var_1 )
|
|
{
|
|
if ( isdefined( var_0 ) != isdefined( var_1 ) )
|
|
return 1;
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
return 0;
|
|
|
|
return var_0 != var_1;
|
|
}
|
|
|
|
setshootenttoenemy()
|
|
{
|
|
self.shootent = self.enemy;
|
|
self.shootpos = self.shootent getshootatpos();
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
|
|
shouldbeajerk()
|
|
{
|
|
return level.gameskill == 3 && isplayer( self.enemy );
|
|
}
|
|
|
|
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 )
|
|
return setshootstyle( "full", 1 );
|
|
|
|
var_0 = distancesquared( self getshootatpos(), self.shootpos );
|
|
var_1 = weaponclass( self.weapon ) == "mg";
|
|
|
|
if ( self.providecoveringfire && var_1 )
|
|
return setshootstyle( "full", 0 );
|
|
|
|
if ( var_0 < 62500 )
|
|
{
|
|
if ( isdefined( self.shootent ) && isdefined( self.shootent.magic_bullet_shield ) )
|
|
return setshootstyle( "single", 0 );
|
|
else
|
|
return setshootstyle( "full", 0 );
|
|
}
|
|
else if ( var_0 < 810000 || shouldbeajerk() )
|
|
{
|
|
if ( weaponissemiauto( self.weapon ) || shoulddosemiforvariety() )
|
|
return setshootstyle( "semi", 1 );
|
|
else
|
|
return setshootstyle( "burst", 1 );
|
|
}
|
|
else if ( self.providecoveringfire || var_1 || var_0 < 2560000 )
|
|
{
|
|
if ( shoulddosemiforvariety() )
|
|
return setshootstyle( "semi", 0 );
|
|
else
|
|
return setshootstyle( "burst", 0 );
|
|
}
|
|
|
|
return setshootstyle( "single", 0 );
|
|
}
|
|
|
|
setshootstyleforsuppression()
|
|
{
|
|
var_0 = distancesquared( self getshootatpos(), self.shootpos );
|
|
|
|
if ( weaponissemiauto( self.weapon ) )
|
|
{
|
|
if ( var_0 < 2560000 )
|
|
return setshootstyle( "semi", 0 );
|
|
|
|
return setshootstyle( "single", 0 );
|
|
}
|
|
|
|
if ( weaponclass( self.weapon ) == "mg" )
|
|
return setshootstyle( "full", 0 );
|
|
|
|
if ( self.providecoveringfire || var_0 < 2560000 )
|
|
{
|
|
if ( shoulddosemiforvariety() )
|
|
return setshootstyle( "semi", 0 );
|
|
else
|
|
return setshootstyle( "burst", 0 );
|
|
}
|
|
|
|
return setshootstyle( "single", 0 );
|
|
}
|
|
|
|
setshootstyle( var_0, var_1 )
|
|
{
|
|
self.shootstyle = var_0;
|
|
self.fastburst = var_1;
|
|
}
|
|
|
|
shoulddosemiforvariety()
|
|
{
|
|
if ( weaponclass( self.weapon ) != "rifle" )
|
|
return 0;
|
|
|
|
if ( self.team != "allies" )
|
|
return 0;
|
|
|
|
var_0 = animscripts\utility::safemod( int( self.origin[1] ), 10000 ) + 2000;
|
|
var_1 = int( self.origin[0] ) + gettime();
|
|
return var_1 % ( 2 * var_0 ) > var_0;
|
|
}
|
|
|
|
resetsniperaim()
|
|
{
|
|
self.snipershotcount = 0;
|
|
self.sniperhitcount = 0;
|
|
thread sniper_glint_behavior();
|
|
}
|
|
|
|
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_0 = 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_0, self, "tag_flash" );
|
|
|
|
var_1 = randomfloatrange( 3, 5 );
|
|
wait( var_1 );
|
|
}
|
|
|
|
wait 0.2;
|
|
}
|
|
}
|