686 lines
15 KiB
Plaintext
686 lines
15 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
placeweaponon( var_0, var_1, var_2 )
|
|
{
|
|
self notify( "weapon_position_change" );
|
|
var_3 = self.weaponinfo[var_0].position;
|
|
|
|
if ( var_1 != "none" && self.a.weaponpos[var_1] == var_0 )
|
|
return;
|
|
|
|
detachallweaponmodels();
|
|
|
|
if ( var_3 != "none" )
|
|
detachweapon( var_0 );
|
|
|
|
if ( var_1 == "none" )
|
|
{
|
|
updateattachedweaponmodels();
|
|
return;
|
|
}
|
|
|
|
if ( self.a.weaponpos[var_1] != "none" )
|
|
detachweapon( self.a.weaponpos[var_1] );
|
|
|
|
if ( !isdefined( var_2 ) )
|
|
var_2 = 1;
|
|
|
|
if ( var_2 && ( var_1 == "left" || var_1 == "right" ) )
|
|
{
|
|
attachweapon( var_0, var_1 );
|
|
self.weapon = var_0;
|
|
}
|
|
else
|
|
attachweapon( var_0, var_1 );
|
|
|
|
updateattachedweaponmodels();
|
|
}
|
|
|
|
detachweapon( var_0 )
|
|
{
|
|
self.a.weaponpos[self.weaponinfo[var_0].position] = "none";
|
|
self.weaponinfo[var_0].position = "none";
|
|
}
|
|
|
|
attachweapon( var_0, var_1 )
|
|
{
|
|
self.weaponinfo[var_0].position = var_1;
|
|
self.a.weaponpos[var_1] = var_0;
|
|
|
|
if ( self.a.weaponposdropping[var_1] != "none" )
|
|
{
|
|
self notify( "end_weapon_drop_" + var_1 );
|
|
self.a.weaponposdropping[var_1] = "none";
|
|
}
|
|
}
|
|
|
|
getweaponforpos( var_0 )
|
|
{
|
|
var_1 = self.a.weaponpos[var_0];
|
|
|
|
if ( var_1 == "none" )
|
|
return self.a.weaponposdropping[var_0];
|
|
|
|
return var_1;
|
|
}
|
|
|
|
detachallweaponmodels()
|
|
{
|
|
var_0 = [];
|
|
var_0[var_0.size] = "right";
|
|
var_0[var_0.size] = "left";
|
|
var_0[var_0.size] = "chest";
|
|
var_0[var_0.size] = "back";
|
|
self laseroff();
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
var_3 = getweaponforpos( var_2 );
|
|
|
|
if ( var_3 == "none" )
|
|
continue;
|
|
|
|
if ( weapontype( var_3 ) == "riotshield" && isdefined( self.shieldmodelvariant ) )
|
|
{
|
|
if ( isdefined( self.shieldbroken ) && self.shieldbroken )
|
|
{
|
|
playfxontag( common_scripts\utility::getfx( "riot_shield_dmg" ), self, "TAG_BRASS" );
|
|
self.shieldbroken = undefined;
|
|
}
|
|
}
|
|
}
|
|
|
|
self updateentitywithweapons();
|
|
}
|
|
|
|
updateattachedweaponmodels()
|
|
{
|
|
var_0 = [];
|
|
var_1 = [];
|
|
var_2 = [];
|
|
var_0[var_0.size] = "right";
|
|
var_0[var_0.size] = "left";
|
|
var_0[var_0.size] = "chest";
|
|
var_0[var_0.size] = "back";
|
|
|
|
foreach ( var_4 in var_0 )
|
|
{
|
|
var_1[var_1.size] = getweaponforpos( var_4 );
|
|
var_2[var_2.size] = gettagforpos( var_4 );
|
|
}
|
|
|
|
self updateentitywithweapons( var_1[0], var_2[0], var_1[1], var_2[1], var_1[2], var_2[2], var_1[3], var_2[3] );
|
|
|
|
foreach ( var_4 in var_0 )
|
|
{
|
|
var_7 = getweaponforpos( var_4 );
|
|
|
|
if ( var_7 == "none" )
|
|
continue;
|
|
|
|
if ( self.weaponinfo[var_7].useclip && !self.weaponinfo[var_7].hasclip )
|
|
self hidepart( "tag_clip" );
|
|
}
|
|
|
|
updatelaserstatus();
|
|
}
|
|
|
|
updatelaserstatus()
|
|
{
|
|
if ( isdefined( self.custom_laser_function ) )
|
|
[[ self.custom_laser_function ]]();
|
|
else
|
|
{
|
|
if ( self.a.weaponpos["right"] == "none" )
|
|
return;
|
|
|
|
if ( canuselaser() )
|
|
{
|
|
self laseron();
|
|
return;
|
|
}
|
|
|
|
self laseroff();
|
|
}
|
|
}
|
|
|
|
canuselaser()
|
|
{
|
|
if ( !self.a.laseron )
|
|
return 0;
|
|
|
|
if ( animscripts\utility::isshotgun( self.weapon ) )
|
|
return 0;
|
|
|
|
return isalive( self );
|
|
}
|
|
|
|
gettagforpos( var_0 )
|
|
{
|
|
switch ( var_0 )
|
|
{
|
|
case "chest":
|
|
return "tag_weapon_chest";
|
|
case "back":
|
|
return "tag_stowed_back";
|
|
case "left":
|
|
return "tag_weapon_left";
|
|
case "right":
|
|
return "tag_weapon_right";
|
|
case "hand":
|
|
return "tag_inhand";
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
dropaiweapon( var_0 )
|
|
{
|
|
if ( !isdefined( var_0 ) )
|
|
var_0 = self.weapon;
|
|
|
|
if ( var_0 == "none" )
|
|
return;
|
|
|
|
if ( isdefined( self.nodrop ) )
|
|
return;
|
|
|
|
detachallweaponmodels();
|
|
var_1 = self.weaponinfo[var_0].position;
|
|
|
|
if ( self.dropweapon && var_1 != "none" )
|
|
thread dropweaponwrapper( var_0, var_1 );
|
|
|
|
detachweapon( var_0 );
|
|
|
|
if ( var_0 == self.weapon )
|
|
self.weapon = "none";
|
|
|
|
updateattachedweaponmodels();
|
|
}
|
|
|
|
dropallaiweapons()
|
|
{
|
|
if ( isdefined( self.nodrop ) )
|
|
return "none";
|
|
|
|
var_0 = [];
|
|
var_0[var_0.size] = "left";
|
|
var_0[var_0.size] = "right";
|
|
var_0[var_0.size] = "chest";
|
|
var_0[var_0.size] = "back";
|
|
detachallweaponmodels();
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
var_3 = self.a.weaponpos[var_2];
|
|
|
|
if ( var_3 == "none" )
|
|
continue;
|
|
|
|
self.weaponinfo[var_3].position = "none";
|
|
self.a.weaponpos[var_2] = "none";
|
|
|
|
if ( self.dropweapon )
|
|
thread dropweaponwrapper( var_3, var_2 );
|
|
}
|
|
|
|
self.weapon = "none";
|
|
updateattachedweaponmodels();
|
|
}
|
|
|
|
dropweaponwrapper( var_0, var_1 )
|
|
{
|
|
if ( self isragdoll() )
|
|
return "none";
|
|
|
|
self.a.weaponposdropping[var_1] = var_0;
|
|
var_2 = var_0;
|
|
|
|
if ( issubstr( tolower( var_2 ), "rpg" ) )
|
|
var_2 = "rpg_player";
|
|
else if ( issubstr( tolower( var_2 ), "panzerfaust3" ) )
|
|
var_2 = "panzerfaust3_player";
|
|
|
|
self dropweapon( var_2, var_1, 0 );
|
|
self endon( "end_weapon_drop_" + var_1 );
|
|
wait 0.1;
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
detachallweaponmodels();
|
|
self.a.weaponposdropping[var_1] = "none";
|
|
updateattachedweaponmodels();
|
|
}
|
|
|
|
donotetracks( var_0, var_1, var_2 )
|
|
{
|
|
for (;;)
|
|
{
|
|
self waittill( var_0, var_3 );
|
|
|
|
if ( !isdefined( var_3 ) )
|
|
var_3 = "undefined";
|
|
|
|
var_4 = animscripts\notetracks::handlenotetrack( var_3, var_0, var_1 );
|
|
|
|
if ( isdefined( var_4 ) )
|
|
return var_4;
|
|
}
|
|
}
|
|
|
|
getpredictedaimyawtoshootentorpos( var_0 )
|
|
{
|
|
if ( !isdefined( self.shootent ) )
|
|
{
|
|
if ( !isdefined( self.shootpos ) )
|
|
return 0;
|
|
|
|
return getaimyawtopoint( self.shootpos );
|
|
}
|
|
|
|
var_1 = self.shootent.origin + self.shootentvelocity * var_0;
|
|
return getaimyawtopoint( var_1 );
|
|
}
|
|
|
|
getaimyawtoshootentorpos()
|
|
{
|
|
if ( !isdefined( self.shootent ) )
|
|
{
|
|
if ( !isdefined( self.shootpos ) )
|
|
return 0;
|
|
|
|
return getaimyawtopoint( self.shootpos );
|
|
}
|
|
|
|
return getaimyawtopoint( self.shootent getshootatpos() );
|
|
}
|
|
|
|
getaimpitchtoshootentorpos()
|
|
{
|
|
var_0 = getpitchtoshootentorpos();
|
|
|
|
if ( self.script == "cover_crouch" && isdefined( self.a.covermode ) && self.a.covermode == "lean" )
|
|
var_0 = var_0 - anim.covercrouchleanpitch;
|
|
|
|
return var_0;
|
|
}
|
|
|
|
getpitchtoshootentorpos()
|
|
{
|
|
if ( !isdefined( self.shootent ) )
|
|
{
|
|
if ( !isdefined( self.shootpos ) )
|
|
return 0;
|
|
|
|
return animscripts\combat_utility::getpitchtospot( self.shootpos );
|
|
}
|
|
|
|
return animscripts\combat_utility::getpitchtospot( self.shootent getshootatpos() );
|
|
}
|
|
|
|
getshootfrompos()
|
|
{
|
|
if ( isdefined( self.usemuzzlesideoffset ) )
|
|
{
|
|
var_0 = self getmuzzlesideoffsetpos();
|
|
return ( var_0[0], var_0[1], self geteye()[2] );
|
|
}
|
|
|
|
return ( self.origin[0], self.origin[1], self geteye()[2] );
|
|
}
|
|
|
|
getaimyawtopoint( var_0 )
|
|
{
|
|
var_1 = animscripts\utility::getyawtospot( var_0 );
|
|
var_2 = distance( self.origin, var_0 );
|
|
|
|
if ( var_2 > 3 )
|
|
{
|
|
var_3 = asin( -3 / var_2 );
|
|
var_1 = var_1 + var_3;
|
|
}
|
|
|
|
var_1 = angleclamp180( var_1 );
|
|
return var_1;
|
|
}
|
|
|
|
#using_animtree("generic_human");
|
|
|
|
ramboaim( var_0 )
|
|
{
|
|
self endon( "killanimscript" );
|
|
ramboaiminternal( var_0 );
|
|
self clearanim( %generic_aim_left, 0.5 );
|
|
self clearanim( %generic_aim_right, 0.5 );
|
|
}
|
|
|
|
ramboaiminternal( var_0 )
|
|
{
|
|
self endon( "rambo_aim_end" );
|
|
waittillframeend;
|
|
self clearanim( %generic_aim_left, 0.2 );
|
|
self clearanim( %generic_aim_right, 0.2 );
|
|
self setanimlimited( %generic_aim_45l, 1, 0.2 );
|
|
self setanimlimited( %generic_aim_45r, 1, 0.2 );
|
|
var_1 = 0.2;
|
|
var_2 = 0;
|
|
|
|
for (;;)
|
|
{
|
|
if ( isdefined( self.shootpos ) )
|
|
{
|
|
var_3 = animscripts\utility::getyaw( self.shootpos ) - self.covernode.angles[1];
|
|
var_3 = angleclamp180( var_3 - var_0 );
|
|
|
|
if ( abs( var_3 - var_2 ) > 10 )
|
|
{
|
|
if ( var_3 > var_2 )
|
|
var_3 = var_2 + 10;
|
|
else
|
|
var_3 = var_2 - 10;
|
|
}
|
|
|
|
var_2 = var_3;
|
|
}
|
|
|
|
if ( var_2 < 0 )
|
|
{
|
|
var_4 = var_2 / -45;
|
|
|
|
if ( var_4 > 1 )
|
|
var_4 = 1;
|
|
|
|
self setanimlimited( %generic_aim_right, var_4, var_1 );
|
|
self setanimlimited( %generic_aim_left, 0, var_1 );
|
|
}
|
|
else
|
|
{
|
|
var_4 = var_2 / 45;
|
|
|
|
if ( var_4 > 1 )
|
|
var_4 = 1;
|
|
|
|
self setanimlimited( %generic_aim_left, var_4, var_1 );
|
|
self setanimlimited( %generic_aim_right, 0, var_1 );
|
|
}
|
|
|
|
wait( var_1 );
|
|
}
|
|
}
|
|
|
|
decidenumshotsforburst()
|
|
{
|
|
var_0 = 0;
|
|
var_1 = weaponburstcount( self.weapon );
|
|
|
|
if ( var_1 )
|
|
var_0 = var_1;
|
|
else if ( animscripts\weaponlist::usingsemiautoweapon() )
|
|
var_0 = anim.semifirenumshots[randomint( anim.semifirenumshots.size )];
|
|
else if ( self.fastburst )
|
|
var_0 = anim.fastburstfirenumshots[randomint( anim.fastburstfirenumshots.size )];
|
|
else
|
|
var_0 = anim.burstfirenumshots[randomint( anim.burstfirenumshots.size )];
|
|
|
|
if ( var_0 <= self.bulletsinclip )
|
|
return var_0;
|
|
|
|
if ( self.bulletsinclip <= 0 )
|
|
return 1;
|
|
|
|
return self.bulletsinclip;
|
|
}
|
|
|
|
decidenumshotsforfull()
|
|
{
|
|
var_0 = self.bulletsinclip;
|
|
|
|
if ( weaponclass( self.weapon ) == "mg" )
|
|
{
|
|
var_1 = randomfloat( 10 );
|
|
|
|
if ( var_1 < 3 )
|
|
var_0 = randomintrange( 2, 6 );
|
|
else if ( var_1 < 8 )
|
|
var_0 = randomintrange( 6, 12 );
|
|
else
|
|
var_0 = randomintrange( 12, 20 );
|
|
}
|
|
|
|
return var_0;
|
|
}
|
|
|
|
handledropclip( var_0 )
|
|
{
|
|
self endon( "killanimscript" );
|
|
self endon( "abort_reload" );
|
|
var_1 = undefined;
|
|
|
|
if ( self.weaponinfo[self.weapon].useclip )
|
|
var_1 = getweaponclipmodel( self.weapon );
|
|
|
|
if ( self.weaponinfo[self.weapon].hasclip )
|
|
{
|
|
if ( animscripts\utility::usingsidearm() )
|
|
self playsound( "weap_reload_pistol_clipout_npc" );
|
|
else
|
|
self playsound( "weap_reload_smg_clipout_npc" );
|
|
|
|
if ( isdefined( var_1 ) )
|
|
{
|
|
self hidepart( "tag_clip" );
|
|
thread dropclipmodel( var_1, "tag_clip" );
|
|
self.weaponinfo[self.weapon].hasclip = 0;
|
|
thread resetcliponabort( var_1 );
|
|
}
|
|
}
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( var_0, var_2 );
|
|
|
|
switch ( var_2 )
|
|
{
|
|
case "attach clip right":
|
|
case "attach clip left":
|
|
if ( isdefined( var_1 ) )
|
|
{
|
|
self attach( var_1, "tag_inhand" );
|
|
thread resetcliponabort( var_1, "tag_inhand" );
|
|
|
|
if ( !self.weaponinfo[self.weapon].hasclip )
|
|
self hidepart( "tag_clip" );
|
|
}
|
|
|
|
animscripts\weaponlist::refillclip();
|
|
break;
|
|
case "detach clip nohand":
|
|
if ( isdefined( var_1 ) )
|
|
self detach( var_1, "tag_inhand" );
|
|
|
|
break;
|
|
case "detach clip right":
|
|
case "detach clip left":
|
|
if ( isdefined( var_1 ) )
|
|
{
|
|
self detach( var_1, "tag_inhand" );
|
|
self showpart( "tag_clip" );
|
|
self notify( "clip_detached" );
|
|
self.weaponinfo[self.weapon].hasclip = 1;
|
|
}
|
|
|
|
if ( animscripts\utility::usingsidearm() )
|
|
self playsound( "weap_reload_pistol_clipin_npc" );
|
|
else
|
|
self playsound( "weap_reload_smg_clipin_npc" );
|
|
|
|
self.a.needstorechamber = 0;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
resetcliponabort( var_0, var_1 )
|
|
{
|
|
self notify( "clip_detached" );
|
|
self endon( "clip_detached" );
|
|
common_scripts\utility::waittill_any( "killanimscript", "abort_reload" );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
if ( isdefined( var_1 ) )
|
|
self detach( var_0, var_1 );
|
|
|
|
if ( isalive( self ) )
|
|
{
|
|
if ( self.weapon != "none" && self.weaponinfo[self.weapon].position != "none" )
|
|
self showpart( "tag_clip" );
|
|
|
|
self.weaponinfo[self.weapon].hasclip = 1;
|
|
}
|
|
else if ( isdefined( var_1 ) )
|
|
dropclipmodel( var_0, var_1 );
|
|
}
|
|
|
|
dropclipmodel( var_0, var_1 )
|
|
{
|
|
var_2 = spawn( "script_model", self gettagorigin( var_1 ) );
|
|
var_2 setmodel( var_0 );
|
|
var_2.angles = self gettagangles( var_1 );
|
|
var_2 physicslaunchclient( var_2.origin, ( 0, 0, 0 ) );
|
|
wait 10;
|
|
|
|
if ( isdefined( var_2 ) )
|
|
var_2 delete();
|
|
}
|
|
|
|
movetonodeovertime( var_0, var_1 )
|
|
{
|
|
self endon( "killanimscript" );
|
|
var_2 = var_0.origin;
|
|
var_3 = distancesquared( self.origin, var_2 );
|
|
|
|
if ( var_3 < 1 )
|
|
{
|
|
self safeteleport( var_2 );
|
|
return;
|
|
}
|
|
|
|
if ( var_3 > 256 && !self maymovetopoint( var_2, !self.swimmer ) )
|
|
return;
|
|
|
|
self.keepclaimednodeifvalid = 1;
|
|
var_4 = distance( self.origin, var_2 );
|
|
var_5 = int( var_1 * 20 );
|
|
|
|
for ( var_6 = 0; var_6 < var_5; var_6++ )
|
|
{
|
|
var_2 = var_0.origin;
|
|
var_7 = self.origin - var_2;
|
|
var_7 = vectornormalize( var_7 );
|
|
var_8 = var_2 + var_7 * var_4;
|
|
var_9 = var_8 + ( var_2 - var_8 ) * ( ( var_6 + 1 ) / var_5 );
|
|
self safeteleport( var_9 );
|
|
wait 0.05;
|
|
}
|
|
|
|
self.keepclaimednodeifvalid = 0;
|
|
}
|
|
|
|
returntrue()
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
playlookanimation( var_0, var_1, var_2 )
|
|
{
|
|
if ( !isdefined( var_2 ) )
|
|
var_2 = ::returntrue;
|
|
|
|
for ( var_3 = 0; var_3 < var_1 * 10; var_3++ )
|
|
{
|
|
if ( isalive( self.enemy ) )
|
|
{
|
|
if ( animscripts\utility::canseeenemy() && [[ var_2 ]]() )
|
|
return;
|
|
}
|
|
|
|
if ( animscripts\utility::issuppressedwrapper() && [[ var_2 ]]() )
|
|
return;
|
|
|
|
self setanimknoball( var_0, %body, 1, 0.1 );
|
|
wait 0.1;
|
|
}
|
|
}
|
|
|
|
throwdownweapon( var_0 )
|
|
{
|
|
self endon( "killanimscript" );
|
|
placeweaponon( self.secondaryweapon, "right" );
|
|
maps\_gameskill::didsomethingotherthanshooting();
|
|
}
|
|
|
|
rpgplayerrepulsor()
|
|
{
|
|
var_0 = rpgplayerrepulsor_getnummisses();
|
|
|
|
if ( var_0 == 0 )
|
|
return;
|
|
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
level waittill( "an_enemy_shot", var_1 );
|
|
|
|
if ( var_1 != self )
|
|
continue;
|
|
|
|
if ( !isdefined( var_1.enemy ) )
|
|
continue;
|
|
|
|
if ( var_1.enemy != level.player )
|
|
continue;
|
|
|
|
if ( isdefined( level.createrpgrepulsors ) && level.createrpgrepulsors == 0 )
|
|
continue;
|
|
|
|
thread rpgplayerrepulsor_create();
|
|
var_0--;
|
|
|
|
if ( var_0 <= 0 )
|
|
return;
|
|
}
|
|
}
|
|
|
|
rpgplayerrepulsor_getnummisses()
|
|
{
|
|
var_0 = maps\_utility::getdifficulty();
|
|
|
|
switch ( var_0 )
|
|
{
|
|
case "gimp":
|
|
case "easy":
|
|
return 2;
|
|
case "difficult":
|
|
case "hard":
|
|
case "medium":
|
|
return 1;
|
|
case "fu":
|
|
return 0;
|
|
}
|
|
|
|
return 2;
|
|
}
|
|
|
|
rpgplayerrepulsor_create()
|
|
{
|
|
var_0 = missile_createrepulsorent( level.player, 5000, 800 );
|
|
wait 4.0;
|
|
missile_deleteattractor( var_0 );
|
|
}
|