527 lines
16 KiB
Plaintext
527 lines
16 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
#using_animtree("dog");
|
|
|
|
meleestrugglevsai_first_attack( var_0 )
|
|
{
|
|
self.safetochangescript = 0;
|
|
self animmode( "zonly_physics" );
|
|
self.pushable = 0;
|
|
self clearpitchorient();
|
|
self.meleekilltarget = 1;
|
|
self.originaltarget = self.enemy;
|
|
self.enemy.battlechatter = 0;
|
|
self.enemy.ignoreall = 1;
|
|
self.enemy clearenemy();
|
|
self.enemy.diequietly = 1;
|
|
self.originaltarget.attack_dir = "F";
|
|
var_1 = vectortoangles( self.origin - self.enemy.origin );
|
|
var_1 = ( 0, var_1[1], 0 );
|
|
var_2 = [];
|
|
var_2[0] = %body;
|
|
var_2[1] = %iw6_dog_kill_front_nml;
|
|
var_3 = 1;
|
|
|
|
if ( isdefined( self.controlling_dog ) && self.controlling_dog )
|
|
thread maps\_utility::play_sound_on_entity( "scn_nml_dog_attack_intro_plr" );
|
|
else
|
|
thread maps\_utility::play_sound_on_entity( "scn_nml_dog_attack_front_npc" );
|
|
|
|
return domeleevsai( var_2, var_3, var_1 );
|
|
}
|
|
|
|
meleestrugglevsai_supershort( var_0 )
|
|
{
|
|
self.safetochangescript = 0;
|
|
self animmode( "zonly_physics" );
|
|
self.pushable = 0;
|
|
self clearpitchorient();
|
|
self.meleekilltarget = !isdefined( self.enemy.magic_bullet_shield ) && ( isdefined( self.enemy.a.doinglongdeath ) || isdefined( self.meleealwayswin ) || randomint( 100 ) > 50 );
|
|
self.originaltarget = self.enemy;
|
|
self.enemy.battlechatter = 0;
|
|
self.enemy.ignoreall = 1;
|
|
self.enemy clearenemy();
|
|
self.enemy.diequietly = 1;
|
|
var_1 = 0;
|
|
|
|
if ( isdefined( self.enemy.use_old_dog_attack ) )
|
|
var_1 = 1;
|
|
|
|
return meleestrugglevsai_short( var_0, var_1 );
|
|
}
|
|
|
|
domeleevsdog( var_0, var_1, var_2 )
|
|
{
|
|
self endon( "killanimscript" );
|
|
self endon( "death" );
|
|
self endon( "end_melee_struggle" );
|
|
self endon( "end_melee_all" );
|
|
|
|
if ( !isdefined( self.syncedmeleetarget ) )
|
|
return;
|
|
|
|
self stopsounds();
|
|
|
|
if ( isdefined( var_2 ) )
|
|
[[ var_2 ]]();
|
|
|
|
self orientmode( "face angle", var_1 );
|
|
self animmode( "gravity" );
|
|
self.olddontattackme = self.dontattackme;
|
|
self.dontattackme = 1;
|
|
self.battlechatter = 0;
|
|
self.a.pose = "stand";
|
|
self.a.special = "none";
|
|
|
|
if ( animscripts\utility::usingsidearm() )
|
|
animscripts\shared::placeweaponon( self.primaryweapon, "right" );
|
|
|
|
self.ragdoll_immediate = 1;
|
|
self.meleeseq = 0;
|
|
thread meleestrugglevsdog_interruptedcheck();
|
|
self clearanim( var_0[0], 0.1 );
|
|
self setflaggedanimrestart( "aianim", var_0[1], 1, 0.1, 1 );
|
|
thread animscripts\shared::donotetracks( "aianim" );
|
|
wait 0.15;
|
|
self.syncedmeleetarget linkto( self, "tag_sync", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
thread meleestrugglevsdog_collision();
|
|
self waittillmatch( "aianim", "end" );
|
|
|
|
if ( !isdefined( self.magic_bullet_shield ) )
|
|
{
|
|
self.forceragdollimmediate = 1;
|
|
self.a.nodeath = 1;
|
|
animscripts\shared::dropallaiweapons();
|
|
self kill( self.dog_attacking_me.origin, self.dog_attacking_me );
|
|
}
|
|
|
|
meleestrugglevsdog_end();
|
|
}
|
|
|
|
meleestruggle_istraverse()
|
|
{
|
|
var_0 = self getdogattackbeginnode();
|
|
return isdefined( var_0 );
|
|
}
|
|
|
|
meleestrugglevsai_traverse( var_0 )
|
|
{
|
|
self.safetochangescript = 0;
|
|
self animmode( "zonly_physics" );
|
|
self.pushable = 0;
|
|
self clearpitchorient();
|
|
self.meleekilltarget = !isdefined( self.enemy.magic_bullet_shield ) && ( isdefined( self.enemy.a.doinglongdeath ) || isdefined( self.meleealwayswin ) || randomint( 100 ) > 50 );
|
|
self.originaltarget = self.enemy;
|
|
self.enemy.battlechatter = 0;
|
|
var_1 = vectortoangles( self.origin - self.enemy.origin );
|
|
var_1 = ( 0, var_1[1], 0 );
|
|
var_2 = [];
|
|
var_2[0] = %body;
|
|
var_2[1] = %iw6_dog_kill_front_long_1;
|
|
var_3 = 1;
|
|
return domeleevsai( var_2, var_3, var_1, ::meleestrugglevsdog_traverse );
|
|
}
|
|
|
|
meleestrugglevsai_short( var_0, var_1 )
|
|
{
|
|
if ( meleestruggle_istraverse() )
|
|
return meleestrugglevsai_traverse( var_0 );
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = 0;
|
|
|
|
self.safetochangescript = 0;
|
|
self animmode( "zonly_physics" );
|
|
self.pushable = 0;
|
|
self clearpitchorient();
|
|
self.meleekilltarget = !isdefined( self.enemy.magic_bullet_shield ) && ( isdefined( self.enemy.a.doinglongdeath ) || isdefined( self.meleealwayswin ) || randomint( 100 ) > 50 );
|
|
self.originaltarget = self.enemy;
|
|
self.enemy.battlechatter = 0;
|
|
self.enemy.ignoreall = 1;
|
|
self.enemy clearenemy();
|
|
self.enemy.diequietly = 1;
|
|
var_2 = vectortoangles( self.origin - self.enemy.origin );
|
|
var_2 = ( 0, var_2[1], 0 );
|
|
|
|
if ( var_1 )
|
|
{
|
|
self.enemy.use_old_dog_attack = 1;
|
|
var_3 = [];
|
|
var_3[0] = %body;
|
|
var_3[1] = %iw6_dog_kill_front_quick_1;
|
|
var_4 = 1;
|
|
thread maps\_utility::play_sound_on_entity( "scn_nml_dog_attack_short" );
|
|
}
|
|
else
|
|
{
|
|
var_3 = [];
|
|
var_3[0] = %body;
|
|
var_3[1] = %iw6_dog_kill_front_long_1;
|
|
var_4 = 1;
|
|
|
|
switch ( var_0 )
|
|
{
|
|
case "R":
|
|
self.enemy.use_old_dog_attack = 1;
|
|
var_3 = [];
|
|
var_3[0] = %body;
|
|
var_3[1] = %iw6_dog_kill_right_quick_1;
|
|
var_4 = 1;
|
|
thread maps\_utility::play_sound_on_entity( "scn_nml_dog_attack_short" );
|
|
break;
|
|
case "L":
|
|
self.enemy.use_old_dog_attack = 1;
|
|
var_3 = [];
|
|
var_3[0] = %body;
|
|
var_3[1] = %iw6_dog_kill_left_quick_1;
|
|
var_4 = 1;
|
|
thread maps\_utility::play_sound_on_entity( "scn_nml_dog_attack_short" );
|
|
break;
|
|
case "B":
|
|
var_3 = [];
|
|
var_3[0] = %body;
|
|
var_3[1] = %iw6_dog_kill_back_quick_1;
|
|
var_4 = 1;
|
|
var_2 = var_2 - ( 0, 180, 0 );
|
|
|
|
if ( isdefined( self.controlling_dog ) && self.controlling_dog )
|
|
thread maps\_utility::play_sound_on_entity( "scn_nml_dog_attack_quick_back_plr" );
|
|
else
|
|
thread maps\_utility::play_sound_on_entity( "scn_nml_dog_attack_quick_back_npc" );
|
|
|
|
break;
|
|
default:
|
|
if ( isdefined( self.controlling_dog ) && self.controlling_dog )
|
|
thread maps\_utility::play_sound_on_entity( "scn_nml_dog_attack_front_plr" );
|
|
else
|
|
thread maps\_utility::play_sound_on_entity( "scn_nml_dog_attack_front_npc" );
|
|
}
|
|
}
|
|
|
|
return domeleevsai( var_3, var_4, var_2 );
|
|
}
|
|
|
|
domeleevsai( var_0, var_1, var_2, var_3 )
|
|
{
|
|
self notify( "stop_pant" );
|
|
self setcandamage( 0 );
|
|
self clearanim( var_0[0], 0.1 );
|
|
self animrelative( "meleeanim", self.enemy.origin, var_2, var_0[1] );
|
|
self.enemy.fndogmeleevictim = var_3;
|
|
|
|
if ( !animhasnotetrack( var_0[1], "ai_attack_start" ) )
|
|
handlestartaipart( "ai_attack_start" );
|
|
|
|
animscripts\shared::donotetracks( "meleeanim", ::handlestartaipart );
|
|
self setcandamage( 1 );
|
|
self animmode( "zonly_physics" );
|
|
|
|
for ( var_4 = 1; var_4 < var_1; var_4++ )
|
|
{
|
|
if ( isdefined( level._effect["dog_bite"] ) && isdefined( level._effect["dog_bite"][var_4] ) && isdefined( self.enemy ) )
|
|
playfxontag( level._effect["dog_bite"][var_4], self.enemy, "TAG_EYE" );
|
|
|
|
self clearanim( var_0[var_4], 0 );
|
|
|
|
if ( !animscripts\dog\dog_combat::insyncmeleewithtarget() )
|
|
break;
|
|
|
|
if ( !self.meleekilltarget && var_4 + 1 == var_1 )
|
|
self.health = 1;
|
|
|
|
self setflaggedanimrestart( "meleeanim", var_0[var_4 + 1], 1, 0, 1 );
|
|
animscripts\shared::donotetracks( "meleeanim" );
|
|
}
|
|
|
|
self unlink();
|
|
|
|
if ( !self.meleekilltarget )
|
|
{
|
|
if ( !isdefined( self.magic_bullet_shield ) )
|
|
self kill();
|
|
}
|
|
else
|
|
{
|
|
self.pushable = 1;
|
|
self.safetochangescript = 1;
|
|
self.flashbangimmunity = 0;
|
|
}
|
|
|
|
thread ragdoll_corpses();
|
|
return 1;
|
|
}
|
|
|
|
handlestartaipart( var_0 )
|
|
{
|
|
if ( var_0 != "ai_attack_start" )
|
|
{
|
|
handlevxnotetrack( var_0 );
|
|
return undefined;
|
|
}
|
|
|
|
if ( !isdefined( self.enemy ) )
|
|
return 1;
|
|
|
|
if ( self.enemy != self.originaltarget )
|
|
return 1;
|
|
|
|
if ( isdefined( self.enemy.syncedmeleetarget ) )
|
|
return 1;
|
|
|
|
self.flashbangimmunity = 1;
|
|
self.enemy.syncedmeleetarget = self;
|
|
|
|
if ( isdefined( self.enemy.fndogmeleevictim ) )
|
|
self.enemy animcustom( self.enemy.fndogmeleevictim );
|
|
else
|
|
self.enemy animcustom( ::meleestrugglevsdog_short );
|
|
}
|
|
|
|
handlevxnotetrack( var_0 )
|
|
{
|
|
if ( common_scripts\utility::string_starts_with( var_0, "vfx" ) )
|
|
{
|
|
if ( isdefined( level._effect[var_0] ) )
|
|
playfxontag( common_scripts\utility::getfx( var_0 ), self, "TAG_MOUTH_FX" );
|
|
}
|
|
else if ( common_scripts\utility::string_starts_with( var_0, "screen_blood" ) )
|
|
{
|
|
if ( isdefined( self.controlling_dog ) )
|
|
{
|
|
var_1 = "bottom";
|
|
|
|
if ( issubstr( var_0, "right" ) )
|
|
var_1 = "right";
|
|
else if ( issubstr( var_0, "left" ) )
|
|
var_1 = "left";
|
|
|
|
self notify( "screen_blood", var_1 );
|
|
}
|
|
}
|
|
}
|
|
|
|
#using_animtree("generic_human");
|
|
|
|
meleestrugglevsdog_short()
|
|
{
|
|
self endon( "killanimscript" );
|
|
self endon( "death" );
|
|
self endon( "end_melee_struggle" );
|
|
self endon( "end_melee_all" );
|
|
|
|
if ( !isdefined( self.syncedmeleetarget ) )
|
|
return;
|
|
|
|
self stopsounds();
|
|
var_0 = vectortoangles( self.syncedmeleetarget.origin - self.origin );
|
|
var_0 = var_0[1];
|
|
|
|
if ( isdefined( self.use_old_dog_attack ) && self.use_old_dog_attack )
|
|
{
|
|
var_1 = [];
|
|
var_1[0] = %body;
|
|
var_1[1] = %iw6_dog_kill_front_quick_guy_1;
|
|
var_2 = 1;
|
|
maps\_utility::gun_remove();
|
|
}
|
|
else
|
|
{
|
|
var_1 = [];
|
|
var_1[0] = %body;
|
|
var_1[1] = %iw6_dog_kill_front_long_guy_1;
|
|
var_2 = 1;
|
|
|
|
switch ( self.dog_attack_dir )
|
|
{
|
|
case "R":
|
|
var_3 = [];
|
|
var_1[0] = %body;
|
|
var_1[1] = %iw6_dog_kill_right_quick_guy_1;
|
|
var_2 = 1;
|
|
var_0 = vectortoangles( self.syncedmeleetarget.origin - self.origin );
|
|
var_0 = var_0[1] + 90;
|
|
|
|
if ( isdefined( self.syncedmeleetarget.controlling_dog ) )
|
|
thread animscripts\face::saygenericdialogue( "dogdeathshortplr" );
|
|
else
|
|
thread animscripts\face::saygenericdialogue( "dogdeathshort" );
|
|
|
|
break;
|
|
case "L":
|
|
var_3 = [];
|
|
var_1[0] = %body;
|
|
var_1[1] = %iw6_dog_kill_left_quick_guy_1;
|
|
var_2 = 1;
|
|
var_0 = vectortoangles( self.syncedmeleetarget.origin - self.origin );
|
|
var_0 = var_0[1] - 90;
|
|
|
|
if ( isdefined( self.syncedmeleetarget.controlling_dog ) )
|
|
thread animscripts\face::saygenericdialogue( "dogdeathshortplr" );
|
|
else
|
|
thread animscripts\face::saygenericdialogue( "dogdeathshort" );
|
|
|
|
break;
|
|
case "B":
|
|
var_3 = [];
|
|
var_1[0] = %body;
|
|
var_1[1] = %iw6_dog_kill_back_quick_guy_1;
|
|
var_2 = 1;
|
|
var_0 = vectortoangles( self.syncedmeleetarget.origin - self.origin );
|
|
var_0 = var_0[1] - 180;
|
|
|
|
if ( isdefined( self.syncedmeleetarget.controlling_dog ) )
|
|
thread animscripts\face::saygenericdialogue( "dogdeathshortplr" );
|
|
else
|
|
thread animscripts\face::saygenericdialogue( "dogdeathshort" );
|
|
|
|
break;
|
|
default:
|
|
if ( isdefined( self.syncedmeleetarget.controlling_dog ) )
|
|
thread animscripts\face::saygenericdialogue( "dogdeathlongplr" );
|
|
else
|
|
thread animscripts\face::saygenericdialogue( "dogdeathlong" );
|
|
}
|
|
}
|
|
|
|
self orientmode( "face angle", var_0 );
|
|
self animmode( "gravity" );
|
|
self.olddontattackme = self.dontattackme;
|
|
self.dontattackme = 1;
|
|
self.battlechatter = 0;
|
|
self.a.pose = "stand";
|
|
self.a.special = "none";
|
|
|
|
if ( animscripts\utility::usingsidearm() )
|
|
animscripts\shared::placeweaponon( self.primaryweapon, "right" );
|
|
|
|
self.ragdoll_immediate = 1;
|
|
self.meleeseq = 0;
|
|
thread meleestrugglevsdog_interruptedcheck();
|
|
self clearanim( var_1[0], 0.1 );
|
|
self setflaggedanimrestart( "aianim", var_1[1], 1, 0.1, 1 );
|
|
thread animscripts\shared::donotetracks( "aianim" );
|
|
wait 0.15;
|
|
self.syncedmeleetarget linkto( self, "tag_sync", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
thread meleestrugglevsdog_collision();
|
|
self waittillmatch( "aianim", "end" );
|
|
|
|
if ( !isdefined( self.magic_bullet_shield ) )
|
|
{
|
|
self.forceragdollimmediate = 1;
|
|
self.a.nodeath = 1;
|
|
animscripts\shared::dropallaiweapons();
|
|
self kill();
|
|
}
|
|
|
|
meleestrugglevsdog_end();
|
|
}
|
|
|
|
meleestrugglevsdog_traverse()
|
|
{
|
|
if ( !isdefined( self.syncedmeleetarget ) )
|
|
return;
|
|
|
|
var_0 = vectortoangles( self.syncedmeleetarget.origin - self.origin );
|
|
var_1 = var_0[1];
|
|
var_2 = [];
|
|
var_2[0] = %body;
|
|
var_2[1] = %iw6_dog_kill_front_long_guy_1;
|
|
domeleevsdog( var_2, var_1 );
|
|
}
|
|
|
|
meleestrugglevsdog_interruptedcheck()
|
|
{
|
|
self endon( "killanimscript" );
|
|
self endon( "death" );
|
|
self endon( "end_melee_all" );
|
|
var_0 = [];
|
|
var_0[1] = %ai_attacked_german_shepherd_02_getup_a;
|
|
var_0[2] = %ai_attacked_german_shepherd_02_getup_a;
|
|
|
|
if ( self.syncedmeleetarget.meleekilltarget )
|
|
var_0[4] = %ai_attacked_german_shepherd_04_getup_a;
|
|
|
|
for (;;)
|
|
{
|
|
if ( !isdefined( self.syncedmeleetarget ) || !isalive( self.syncedmeleetarget ) )
|
|
break;
|
|
|
|
wait 0.1;
|
|
}
|
|
|
|
self.ragdoll_immediate = undefined;
|
|
|
|
if ( self.meleeseq > 0 )
|
|
{
|
|
if ( !isdefined( var_0[self.meleeseq] ) )
|
|
return;
|
|
|
|
self clearanim( %melee_dog, 0.1 );
|
|
self setflaggedanimrestart( "getupanim", var_0[self.meleeseq], 1, 0.1, 1 );
|
|
animscripts\shared::donotetracks( "getupanim" );
|
|
}
|
|
|
|
meleestrugglevsdog_end();
|
|
}
|
|
|
|
meleestrugglevsdog_end()
|
|
{
|
|
self orientmode( "face default" );
|
|
self.syncedmeleetarget = undefined;
|
|
self.meleeseq = undefined;
|
|
self.allowpain = 1;
|
|
self.battlechatter = 1;
|
|
self.use_old_dog_attack = undefined;
|
|
self.dog_attacking_me = undefined;
|
|
animscripts\dog\dog_combat::setnextdogattackallowtime( 1000 );
|
|
|
|
if ( isdefined( self.olddontattackme ) )
|
|
{
|
|
self.dontattackme = self.olddontattackme;
|
|
self.olddontattackme = undefined;
|
|
}
|
|
|
|
self notify( "end_melee_all" );
|
|
}
|
|
|
|
meleestrugglevsdog_collision()
|
|
{
|
|
self endon( "killanimscript" );
|
|
self endon( "death" );
|
|
self endon( "end_melee_all" );
|
|
var_0 = self.syncedmeleetarget;
|
|
|
|
for (;;)
|
|
{
|
|
var_1 = var_0 aiphysicstrace( self.origin, var_0.origin, undefined, undefined, 1, 1 );
|
|
|
|
if ( var_1["fraction"] >= 1 )
|
|
{
|
|
wait 0.05;
|
|
continue;
|
|
}
|
|
|
|
var_2 = var_1["position"] - var_0.origin;
|
|
var_3 = vectordot( var_2, var_1["normal"] );
|
|
var_4 = self.origin + var_3 * var_1["normal"];
|
|
var_5 = var_4 + ( 0, 0, 9 );
|
|
var_6 = var_4 + ( 0, 0, -9 );
|
|
var_4 = self aiphysicstrace( var_5, var_6 );
|
|
self forceteleport( var_4, self.angles, 60 );
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
ragdoll_corpses()
|
|
{
|
|
wait 0.1;
|
|
var_0 = getcorpsearray();
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
if ( var_2 isragdoll() == 0 )
|
|
var_2 startragdoll();
|
|
}
|
|
}
|