init
This commit is contained in:
260
maps/mp/agents/dog/_dog_idle.gsc
Normal file
260
maps/mp/agents/dog/_dog_idle.gsc
Normal file
@ -0,0 +1,260 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self.animsubstate = "none";
|
||||
settimeofnextsound();
|
||||
self.timeofnextsound = self.timeofnextsound + 2000;
|
||||
self.bidlehitreaction = 0;
|
||||
self scragentsetgoalpos( self.origin );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetphysicsmode( "gravity" );
|
||||
updatestate();
|
||||
}
|
||||
|
||||
end_script()
|
||||
{
|
||||
if ( isdefined( self.prevturnrate ) )
|
||||
{
|
||||
self scragentsetmaxturnspeed( self.prevturnrate );
|
||||
self.prevturnrate = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
updatestate()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "cancelidleloop" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
var_0 = self.animsubstate;
|
||||
var_1 = determinestate();
|
||||
|
||||
if ( var_1 != self.animsubstate )
|
||||
enterstate( var_1 );
|
||||
|
||||
updateangle();
|
||||
|
||||
switch ( self.animsubstate )
|
||||
{
|
||||
case "idle_combat":
|
||||
wait 0.2;
|
||||
break;
|
||||
case "idle_noncombat":
|
||||
if ( var_0 == "none" )
|
||||
{
|
||||
if ( self.movemode == "run" || self.movemode == "sprint" )
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "anml_wolf_pants_mp_fast", "anml_dog_pants_mp_fast" ) );
|
||||
else
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "anml_wolf_pants_mp_med", "anml_dog_pants_mp_med" ) );
|
||||
}
|
||||
else if ( gettime() > self.timeofnextsound )
|
||||
{
|
||||
if ( randomint( 10 ) < 4 )
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "anml_wolf_whine", "anml_dog_whine" ) );
|
||||
else
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "anml_wolf_pants_mp_med", "anml_dog_pants_mp_med" ) );
|
||||
|
||||
settimeofnextsound();
|
||||
}
|
||||
|
||||
wait 0.5;
|
||||
break;
|
||||
default:
|
||||
wait 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
determinestate()
|
||||
{
|
||||
if ( shouldattackidle() )
|
||||
return "idle_combat";
|
||||
else
|
||||
return "idle_noncombat";
|
||||
}
|
||||
|
||||
enterstate( var_0 )
|
||||
{
|
||||
exitstate( self.animsubstate );
|
||||
self.animsubstate = var_0;
|
||||
playidleanim();
|
||||
}
|
||||
|
||||
exitstate( var_0 )
|
||||
{
|
||||
if ( isdefined( self.prevturnrate ) )
|
||||
{
|
||||
self scragentsetmaxturnspeed( self.prevturnrate );
|
||||
self.prevturnrate = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
playidleanim()
|
||||
{
|
||||
if ( self.animsubstate == "idle_combat" )
|
||||
self setanimstate( "attack_idle" );
|
||||
else
|
||||
self setanimstate( "casual_idle" );
|
||||
}
|
||||
|
||||
updateangle()
|
||||
{
|
||||
var_0 = undefined;
|
||||
|
||||
if ( isdefined( self.enemy ) && distancesquared( self.enemy.origin, self.origin ) < 1048576 )
|
||||
var_0 = self.enemy;
|
||||
else if ( isdefined( self.owner ) && distancesquared( self.owner.origin, self.origin ) > 576 )
|
||||
var_0 = self.owner;
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
{
|
||||
var_1 = var_0.origin - self.origin;
|
||||
var_2 = vectortoangles( var_1 );
|
||||
|
||||
if ( abs( angleclamp180( var_2[1] - self.angles[1] ) ) > 1 )
|
||||
turntoangle( var_2[1] );
|
||||
}
|
||||
}
|
||||
|
||||
shouldattackidle()
|
||||
{
|
||||
return isdefined( self.enemy ) && maps\mp\_utility::isreallyalive( self.enemy ) && distancesquared( self.origin, self.enemy.origin ) < 1000000;
|
||||
}
|
||||
|
||||
getturnanimstate( var_0 )
|
||||
{
|
||||
if ( shouldattackidle() )
|
||||
{
|
||||
if ( var_0 < -135 || var_0 > 135 )
|
||||
return "attack_turn_180";
|
||||
else if ( var_0 < 0 )
|
||||
return "attack_turn_right_90";
|
||||
else
|
||||
return "attack_turn_left_90";
|
||||
}
|
||||
else if ( var_0 < -135 || var_0 > 135 )
|
||||
return "casual_turn_180";
|
||||
else if ( var_0 < 0 )
|
||||
return "casual_turn_right_90";
|
||||
else
|
||||
return "casual_turn_left_90";
|
||||
}
|
||||
|
||||
turntoangle( var_0 )
|
||||
{
|
||||
var_1 = self.angles[1];
|
||||
var_2 = angleclamp180( var_0 - var_1 );
|
||||
|
||||
if ( -0.5 < var_2 && var_2 < 0.5 )
|
||||
return;
|
||||
|
||||
if ( -10 < var_2 && var_2 < 10 )
|
||||
{
|
||||
rotatetoangle( var_0, 2 );
|
||||
return;
|
||||
}
|
||||
|
||||
var_3 = getturnanimstate( var_2 );
|
||||
var_4 = self getanimentry( var_3, 0 );
|
||||
var_5 = getanimlength( var_4 );
|
||||
var_6 = getangledelta3d( var_4 );
|
||||
self scragentsetanimmode( "anim angle delta" );
|
||||
|
||||
if ( animhasnotetrack( var_4, "turn_begin" ) && animhasnotetrack( var_4, "turn_end" ) )
|
||||
{
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_3, 0, "turn_in_place" );
|
||||
var_7 = getnotetracktimes( var_4, "turn_begin" );
|
||||
var_8 = getnotetracktimes( var_4, "turn_end" );
|
||||
var_9 = ( var_8[0] - var_7[0] ) * var_5;
|
||||
var_10 = angleclamp180( var_2 - var_6[1] );
|
||||
var_11 = abs( var_10 ) / var_9 / 20;
|
||||
var_11 = var_11 * 3.14159 / 180;
|
||||
var_12 = ( 0, angleclamp180( self.angles[1] + var_10 ), 0 );
|
||||
self.prevturnrate = self scragentgetmaxturnspeed();
|
||||
self scragentsetmaxturnspeed( var_11 );
|
||||
self scragentsetorientmode( "face angle abs", var_12 );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "turn_in_place", "turn_end" );
|
||||
self scragentsetmaxturnspeed( self.prevturnrate );
|
||||
self.prevturnrate = undefined;
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "turn_in_place", "end" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.prevturnrate = self scragentgetmaxturnspeed();
|
||||
var_11 = abs( angleclamp180( var_2 - var_6[1] ) ) / var_5 / 20;
|
||||
var_11 = var_11 * 3.14159 / 180;
|
||||
self scragentsetmaxturnspeed( var_11 );
|
||||
var_12 = ( 0, angleclamp180( var_0 - var_6[1] ), 0 );
|
||||
self scragentsetorientmode( "face angle abs", var_12 );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_3, 0, "turn_in_place" );
|
||||
self scragentsetmaxturnspeed( self.prevturnrate );
|
||||
self.prevturnrate = undefined;
|
||||
}
|
||||
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
playidleanim();
|
||||
}
|
||||
|
||||
rotatetoangle( var_0, var_1 )
|
||||
{
|
||||
if ( abs( angleclamp180( var_0 - self.angles[1] ) ) <= var_1 )
|
||||
return;
|
||||
|
||||
var_2 = ( 0, var_0, 0 );
|
||||
self scragentsetorientmode( "face angle abs", var_2 );
|
||||
|
||||
while ( angleclamp180( var_0 - self.angles[1] ) > var_1 )
|
||||
wait 0.1;
|
||||
}
|
||||
|
||||
settimeofnextsound()
|
||||
{
|
||||
self.timeofnextsound = gettime() + 8000 + randomint( 5000 );
|
||||
}
|
||||
|
||||
dohitreaction( var_0 )
|
||||
{
|
||||
self.blockgoalpos = 1;
|
||||
self.statelocked = 1;
|
||||
self.bidlehitreaction = 1;
|
||||
var_1 = angleclamp180( var_0 - self.angles[1] );
|
||||
|
||||
if ( var_1 > 0 )
|
||||
var_2 = 1;
|
||||
else
|
||||
var_2 = 0;
|
||||
|
||||
self notify( "cancelidleloop" );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "stand_pain", var_2, "stand_pain" );
|
||||
self.blockgoalpos = 0;
|
||||
self.statelocked = 0;
|
||||
self.bidlehitreaction = 0;
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
self.animsubstate = "none";
|
||||
thread updatestate();
|
||||
}
|
||||
|
||||
ondamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
if ( self.bidlehitreaction )
|
||||
return;
|
||||
|
||||
var_10 = vectortoangles( var_7 );
|
||||
var_11 = var_10[1] - 180;
|
||||
dohitreaction( var_11 );
|
||||
}
|
||||
|
||||
onflashbanged( var_0, var_1, var_2, var_3, var_4, var_5 )
|
||||
{
|
||||
if ( self.bidlehitreaction )
|
||||
return;
|
||||
|
||||
dohitreaction( self.angles[1] + 180 );
|
||||
}
|
330
maps/mp/agents/dog/_dog_melee.gsc
Normal file
330
maps/mp/agents/dog/_dog_melee.gsc
Normal file
@ -0,0 +1,330 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "killanimscript" );
|
||||
self.curmeleetarget endon( "disconnect" );
|
||||
var_0 = self.curmeleetarget.origin - self.origin;
|
||||
var_1 = length( var_0 );
|
||||
var_2 = 1;
|
||||
|
||||
if ( var_1 < self.attackoffset )
|
||||
{
|
||||
var_3 = self.origin;
|
||||
var_2 = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
var_0 = var_0 / var_1;
|
||||
var_3 = self.curmeleetarget.origin - var_0 * self.attackoffset;
|
||||
}
|
||||
|
||||
var_4 = 0;
|
||||
var_5 = self.origin + ( 0, 0, 30 );
|
||||
var_6 = self.curmeleetarget.origin + ( 0, 0, 30 );
|
||||
var_7 = physicstrace( var_5, var_6 );
|
||||
|
||||
if ( distancesquared( var_7, var_6 ) > 1 )
|
||||
meleefailed();
|
||||
else
|
||||
{
|
||||
if ( var_2 )
|
||||
var_8 = maps\mp\agents\_scriptedagents::canmovepointtopoint( self.origin, var_3 );
|
||||
else
|
||||
var_8 = 1;
|
||||
|
||||
var_9 = undefined;
|
||||
|
||||
if ( !var_8 )
|
||||
var_10 = 0;
|
||||
else
|
||||
{
|
||||
var_9 = shoulddoextendedkill( self.curmeleetarget );
|
||||
var_10 = isdefined( var_9 );
|
||||
}
|
||||
|
||||
self.blockgoalpos = 1;
|
||||
|
||||
if ( var_10 )
|
||||
{
|
||||
doextendedkill( var_9 );
|
||||
return;
|
||||
}
|
||||
|
||||
dostandardkill( var_3, var_8 );
|
||||
}
|
||||
}
|
||||
|
||||
end_script()
|
||||
{
|
||||
self scragentsetanimscale( 1, 1 );
|
||||
self.blockgoalpos = 0;
|
||||
}
|
||||
|
||||
getmeleeanimstate()
|
||||
{
|
||||
return "attack_run_and_jump";
|
||||
}
|
||||
|
||||
shoulddoextendedkill( var_0 )
|
||||
{
|
||||
if ( !self.enableextendedkill )
|
||||
return undefined;
|
||||
|
||||
var_1 = 4;
|
||||
|
||||
if ( !maps\mp\_utility::isgameparticipant( var_0 ) )
|
||||
return undefined;
|
||||
|
||||
if ( isprotectedbyriotshield( var_0 ) )
|
||||
return undefined;
|
||||
|
||||
if ( var_0 maps\mp\_utility::isjuggernaut() )
|
||||
return undefined;
|
||||
|
||||
var_2 = self.origin - var_0.origin;
|
||||
|
||||
if ( abs( var_2[2] ) > var_1 )
|
||||
return undefined;
|
||||
|
||||
var_3 = vectornormalize( ( var_2[0], var_2[1], 0 ) );
|
||||
var_4 = anglestoforward( var_0.angles );
|
||||
var_5 = vectordot( var_4, var_3 );
|
||||
|
||||
if ( var_5 > 0.707 )
|
||||
{
|
||||
var_6 = 0;
|
||||
var_7 = rotatevector( ( 1, 0, 0 ), var_0.angles );
|
||||
}
|
||||
else if ( var_5 < -0.707 )
|
||||
{
|
||||
var_6 = 1;
|
||||
var_7 = rotatevector( ( -1, 0, 0 ), var_0.angles );
|
||||
}
|
||||
else
|
||||
{
|
||||
var_8 = maps\mp\agents\dog\_dog_think::cross2d( var_2, var_4 );
|
||||
|
||||
if ( var_8 > 0 )
|
||||
{
|
||||
var_6 = 3;
|
||||
var_7 = rotatevector( ( 0, -1, 0 ), var_0.angles );
|
||||
}
|
||||
else
|
||||
{
|
||||
var_6 = 2;
|
||||
var_7 = rotatevector( ( 0, 1, 0 ), var_0.angles );
|
||||
}
|
||||
}
|
||||
|
||||
if ( var_6 == 1 )
|
||||
var_9 = 128;
|
||||
else
|
||||
var_9 = 96;
|
||||
|
||||
var_10 = var_0.origin - var_9 * var_7;
|
||||
var_11 = maps\mp\agents\_scriptedagents::droppostoground( var_10 );
|
||||
|
||||
if ( !isdefined( var_11 ) )
|
||||
return undefined;
|
||||
|
||||
if ( abs( var_11[2] - var_10[2] ) > var_1 )
|
||||
return undefined;
|
||||
|
||||
if ( !self aiphysicstracepassed( var_0.origin + ( 0, 0, 4 ), var_11 + ( 0, 0, 4 ), self.radius, self.height ) )
|
||||
return undefined;
|
||||
|
||||
return var_6;
|
||||
}
|
||||
|
||||
doextendedkill( var_0 )
|
||||
{
|
||||
var_1 = "attack_extended";
|
||||
domeleedamage( self.curmeleetarget, self.curmeleetarget.health, "MOD_MELEE_DOG" );
|
||||
var_2 = self getanimentry( var_1, var_0 );
|
||||
thread extendedkill_sticktovictim( var_2, self.curmeleetarget.origin, self.curmeleetarget.angles );
|
||||
|
||||
if ( var_0 == 1 )
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "mp_wolf_attack_quick_back_npc", "mp_dog_attack_quick_back_npc" ) );
|
||||
else
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "mp_wolf_attack_short_npc", "mp_dog_attack_short_npc" ) );
|
||||
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_1, var_0, "attack", "end" );
|
||||
self notify( "kill_stick" );
|
||||
self.curmeleetarget = undefined;
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self unlink();
|
||||
}
|
||||
|
||||
extendedkill_sticktovictim( var_0, var_1, var_2 )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "killanimscript" );
|
||||
self endon( "kill_stick" );
|
||||
wait 0.05;
|
||||
|
||||
if ( isalive( self.curmeleetarget ) )
|
||||
return;
|
||||
|
||||
var_3 = self.curmeleetarget getcorpseentity();
|
||||
self linkto( var_3 );
|
||||
self scragentdoanimrelative( var_0, var_1, var_2 );
|
||||
}
|
||||
|
||||
dostandardkill( var_0, var_1 )
|
||||
{
|
||||
var_2 = getmeleeanimstate();
|
||||
var_3 = 0;
|
||||
|
||||
if ( !var_1 )
|
||||
{
|
||||
if ( self agentcanseesentient( self.curmeleetarget ) )
|
||||
{
|
||||
var_4 = maps\mp\agents\_scriptedagents::droppostoground( self.curmeleetarget.origin );
|
||||
|
||||
if ( isdefined( var_4 ) )
|
||||
{
|
||||
var_3 = 1;
|
||||
var_0 = var_4;
|
||||
}
|
||||
else
|
||||
{
|
||||
meleefailed();
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
meleefailed();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
self.lastmeleefailedmypos = undefined;
|
||||
self.lastmeleefailedpos = undefined;
|
||||
var_5 = self getanimentry( var_2, 0 );
|
||||
var_6 = getanimlength( var_5 );
|
||||
var_7 = getnotetracktimes( var_5, "dog_melee" );
|
||||
|
||||
if ( var_7.size > 0 )
|
||||
var_8 = var_7[0] * var_6;
|
||||
else
|
||||
var_8 = var_6;
|
||||
|
||||
self scragentdoanimlerp( self.origin, var_0, var_8 );
|
||||
thread updatelerppos( self.curmeleetarget, var_8, var_1 );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 0, "attack", "dog_melee" );
|
||||
self notify( "cancel_updatelerppos" );
|
||||
var_9 = 0;
|
||||
|
||||
if ( isdefined( self.curmeleetarget ) )
|
||||
var_9 = self.curmeleetarget.health;
|
||||
|
||||
if ( isdefined( self.meleedamage ) )
|
||||
var_9 = self.meleedamage;
|
||||
|
||||
if ( isdefined( self.curmeleetarget ) )
|
||||
domeleedamage( self.curmeleetarget, var_9, "MOD_IMPACT" );
|
||||
|
||||
self.curmeleetarget = undefined;
|
||||
|
||||
if ( var_3 )
|
||||
self scragentsetanimscale( 0, 1 );
|
||||
else
|
||||
self scragentsetanimscale( 1, 1 );
|
||||
|
||||
self scragentsetphysicsmode( "gravity" );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "attack", "end" );
|
||||
}
|
||||
|
||||
updatelerppos( var_0, var_1, var_2 )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "death" );
|
||||
self endon( "cancel_updatelerppos" );
|
||||
var_0 endon( "disconnect" );
|
||||
var_0 endon( "death" );
|
||||
var_3 = var_1;
|
||||
var_4 = 0.05;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait( var_4 );
|
||||
var_3 = var_3 - var_4;
|
||||
|
||||
if ( var_3 <= 0 )
|
||||
break;
|
||||
|
||||
var_5 = getupdatedattackpos( var_0, var_2 );
|
||||
|
||||
if ( !isdefined( var_5 ) )
|
||||
break;
|
||||
|
||||
self scragentdoanimlerp( self.origin, var_5, var_3 );
|
||||
}
|
||||
}
|
||||
|
||||
getupdatedattackpos( var_0, var_1 )
|
||||
{
|
||||
if ( !var_1 )
|
||||
{
|
||||
var_2 = maps\mp\agents\_scriptedagents::droppostoground( var_0.origin );
|
||||
return var_2;
|
||||
}
|
||||
else
|
||||
{
|
||||
var_3 = var_0.origin - self.origin;
|
||||
var_4 = length( var_3 );
|
||||
|
||||
if ( var_4 < self.attackoffset )
|
||||
return self.origin;
|
||||
else
|
||||
{
|
||||
var_3 = var_3 / var_4;
|
||||
var_5 = var_0.origin - var_3 * self.attackoffset;
|
||||
|
||||
if ( maps\mp\agents\_scriptedagents::canmovepointtopoint( self.origin, var_5 ) )
|
||||
return var_5;
|
||||
else
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
isprotectedbyriotshield( var_0 )
|
||||
{
|
||||
if ( isdefined( var_0.hasriotshield ) && var_0.hasriotshield )
|
||||
{
|
||||
var_1 = self.origin - var_0.origin;
|
||||
var_2 = vectornormalize( ( var_1[0], var_1[1], 0 ) );
|
||||
var_3 = anglestoforward( var_0.angles );
|
||||
var_4 = vectordot( var_3, var_1 );
|
||||
|
||||
if ( var_0.hasriotshieldequipped )
|
||||
{
|
||||
if ( var_4 > 0.766 )
|
||||
return 1;
|
||||
}
|
||||
else if ( var_4 < -0.766 )
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
domeleedamage( var_0, var_1, var_2 )
|
||||
{
|
||||
if ( isprotectedbyriotshield( var_0 ) )
|
||||
return;
|
||||
|
||||
var_0 dodamage( var_1, self.origin, self, self, var_2 );
|
||||
}
|
||||
|
||||
meleefailed()
|
||||
{
|
||||
self.lastmeleefailedmypos = self.origin;
|
||||
self.lastmeleefailedpos = self.curmeleetarget.origin;
|
||||
}
|
433
maps/mp/agents/dog/_dog_move.gsc
Normal file
433
maps/mp/agents/dog/_dog_move.gsc
Normal file
@ -0,0 +1,433 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self.blockgoalpos = 0;
|
||||
self scragentsetphysicsmode( "gravity" );
|
||||
startmove();
|
||||
continuemovement();
|
||||
}
|
||||
|
||||
end_script()
|
||||
{
|
||||
self.blockgoalpos = 0;
|
||||
cancelallbut( undefined );
|
||||
self scragentsetanimscale( 1, 1 );
|
||||
}
|
||||
|
||||
setupmovement()
|
||||
{
|
||||
thread waitforrunwalkchange();
|
||||
thread waitforsharpturn();
|
||||
thread waitforstop();
|
||||
}
|
||||
|
||||
continuemovement()
|
||||
{
|
||||
setupmovement();
|
||||
self scragentsetanimmode( "code_move" );
|
||||
self scragentsetorientmode( "face motion" );
|
||||
self scragentsetanimscale( 1, 1 );
|
||||
setmoveanim( self.movemode );
|
||||
}
|
||||
|
||||
setmoveanim( var_0 )
|
||||
{
|
||||
self setanimstate( var_0 );
|
||||
}
|
||||
|
||||
waitforrunwalkchange()
|
||||
{
|
||||
self endon( "dogmove_endwait_runwalk" );
|
||||
var_0 = self.movemode;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( var_0 != self.movemode )
|
||||
{
|
||||
setmoveanim( self.movemode );
|
||||
var_0 = self.movemode;
|
||||
}
|
||||
|
||||
wait 0.1;
|
||||
}
|
||||
}
|
||||
|
||||
dosharpturn( var_0 )
|
||||
{
|
||||
var_1 = vectortoangles( var_0 );
|
||||
var_2 = angleclamp180( var_1[1] - self.angles[1] );
|
||||
var_3 = maps\mp\agents\_scriptedagents::getangleindex( var_2 );
|
||||
|
||||
if ( var_3 == 4 )
|
||||
{
|
||||
continuemovement();
|
||||
return;
|
||||
}
|
||||
|
||||
var_4 = "sharp_turn";
|
||||
var_5 = self getanimentry( var_4, var_3 );
|
||||
var_6 = getangledelta( var_5 );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", ( 0, angleclamp180( var_1[1] - var_6 ), 0 ) );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_4, var_3, "sharp_turn" );
|
||||
continuemovement();
|
||||
}
|
||||
|
||||
waitforsharpturn()
|
||||
{
|
||||
self endon( "dogmove_endwait_sharpturn" );
|
||||
self waittill( "path_dir_change", var_0 );
|
||||
cancelallbut( "sharpturn" );
|
||||
dosharpturn( var_0 );
|
||||
}
|
||||
|
||||
waitforstop()
|
||||
{
|
||||
self endon( "dogmove_endwait_stop" );
|
||||
self waittill( "stop_soon" );
|
||||
|
||||
if ( isdefined( self.barrivalsenabled ) && !self.barrivalsenabled )
|
||||
{
|
||||
thread waitforstop();
|
||||
return;
|
||||
}
|
||||
|
||||
var_0 = getstopanimstate();
|
||||
var_1 = self getanimentry( var_0.state, var_0.index );
|
||||
var_2 = getmovedelta( var_1 );
|
||||
var_3 = getangledelta( var_1 );
|
||||
var_4 = self getpathgoalpos();
|
||||
var_5 = var_4 - self.origin;
|
||||
|
||||
if ( length( var_5 ) + 12 < length( var_2 ) )
|
||||
{
|
||||
thread waitforstop();
|
||||
return;
|
||||
}
|
||||
|
||||
var_6 = getstopdata();
|
||||
var_7 = calcanimstartpos( var_6.pos, var_6.angles[1], var_2, var_3 );
|
||||
var_8 = maps\mp\agents\_scriptedagents::droppostoground( var_7 );
|
||||
|
||||
if ( !isdefined( var_8 ) )
|
||||
{
|
||||
thread waitforstop();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !maps\mp\agents\_scriptedagents::canmovepointtopoint( var_6.pos, var_8 ) )
|
||||
{
|
||||
thread waitforstop();
|
||||
return;
|
||||
}
|
||||
|
||||
cancelallbut( "stop" );
|
||||
thread waitforpathsetwhilestopping();
|
||||
thread waitforsharpturnwhilestopping();
|
||||
|
||||
if ( distancesquared( var_7, self.origin ) > 4 )
|
||||
{
|
||||
self scragentsetwaypoint( var_7 );
|
||||
thread waitforblockedwhilestopping();
|
||||
self waittill( "waypoint_reached" );
|
||||
self notify( "dogmove_endwait_blockedwhilestopping" );
|
||||
}
|
||||
|
||||
var_9 = var_4 - self.origin;
|
||||
var_10 = vectortoangles( var_9 );
|
||||
var_11 = ( 0, var_10[1] - var_3, 0 );
|
||||
var_12 = maps\mp\agents\_scriptedagents::getanimscalefactors( var_4 - self.origin, var_2 );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", var_11, ( 0, var_10[1], 0 ) );
|
||||
self scragentsetanimscale( var_12.xy, var_12.z );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_0.state, var_0.index, "move_stop" );
|
||||
self scragentsetgoalpos( self.origin );
|
||||
}
|
||||
|
||||
waitforpathsetwhilestopping()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "dogmove_endwait_pathsetwhilestopping" );
|
||||
var_0 = self scragentgetgoalpos();
|
||||
self waittill( "path_set" );
|
||||
var_1 = self scragentgetgoalpos();
|
||||
|
||||
if ( distancesquared( var_0, var_1 ) < 1 )
|
||||
{
|
||||
thread waitforpathsetwhilestopping();
|
||||
return;
|
||||
}
|
||||
|
||||
self notify( "dogmove_endwait_stop" );
|
||||
self notify( "dogmove_endwait_sharpturnwhilestopping" );
|
||||
continuemovement();
|
||||
}
|
||||
|
||||
waitforsharpturnwhilestopping()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "dogmove_endwait_sharpturnwhilestopping" );
|
||||
self waittill( "path_dir_change", var_0 );
|
||||
self notify( "dogmove_endwait_pathsetwhilestopping" );
|
||||
self notify( "dogmove_endwait_stop" );
|
||||
dosharpturn( var_0 );
|
||||
}
|
||||
|
||||
waitforblockedwhilestopping()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "dogmove_endwait_blockedwhilestopping" );
|
||||
self waittill( "path_blocked" );
|
||||
self notify( "dogmove_endwait_stop" );
|
||||
self scragentsetwaypoint( undefined );
|
||||
}
|
||||
|
||||
waitforstopearly()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "dogmove_endwait_stopearly" );
|
||||
var_0 = self getanimentry( "move_stop_4", 0 );
|
||||
var_1 = getmovedelta( var_0 );
|
||||
var_2 = length( var_1 );
|
||||
var_3 = self.preferredoffsetfromowner + var_2;
|
||||
var_4 = var_3 * var_3;
|
||||
|
||||
if ( distancesquared( self.origin, self.owner.origin ) <= var_4 )
|
||||
return;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !isdefined( self.owner ) )
|
||||
break;
|
||||
|
||||
if ( distancesquared( self.origin, self.owner.origin ) < var_4 )
|
||||
{
|
||||
var_5 = self localtoworldcoords( var_1 );
|
||||
self scragentsetgoalpos( var_5 );
|
||||
break;
|
||||
}
|
||||
|
||||
wait 0.1;
|
||||
}
|
||||
}
|
||||
|
||||
cancelallbut( var_0 )
|
||||
{
|
||||
var_1 = [ "runwalk", "sharpturn", "stop", "pathsetwhilestopping", "blockedwhilestopping", "sharpturnwhilestopping", "stopearly" ];
|
||||
var_2 = isdefined( var_0 );
|
||||
|
||||
foreach ( var_4 in var_1 )
|
||||
{
|
||||
if ( var_2 && var_4 == var_0 )
|
||||
continue;
|
||||
|
||||
self notify( "dogmove_endwait_" + var_4 );
|
||||
}
|
||||
}
|
||||
|
||||
startmove()
|
||||
{
|
||||
var_0 = self getnegotiationstartnode();
|
||||
|
||||
if ( isdefined( var_0 ) )
|
||||
var_1 = var_0.origin;
|
||||
else
|
||||
var_1 = self getpathgoalpos();
|
||||
|
||||
if ( distancesquared( var_1, self.origin ) < 10000 )
|
||||
return;
|
||||
|
||||
var_2 = self getlookaheaddir();
|
||||
var_3 = vectortoangles( var_2 );
|
||||
var_4 = self getvelocity();
|
||||
|
||||
if ( length2dsquared( var_4 ) > 16 )
|
||||
{
|
||||
var_4 = vectornormalize( var_4 );
|
||||
|
||||
if ( vectordot( var_4, var_2 ) > 0.707 )
|
||||
return;
|
||||
}
|
||||
|
||||
var_5 = angleclamp180( var_3[1] - self.angles[1] );
|
||||
var_6 = maps\mp\agents\_scriptedagents::getangleindex( var_5 );
|
||||
var_7 = self getanimentry( "move_start", var_6 );
|
||||
var_8 = getmovedelta( var_7 );
|
||||
var_9 = rotatevector( var_8, self.angles ) + self.origin;
|
||||
|
||||
if ( !maps\mp\agents\_scriptedagents::canmovepointtopoint( self.origin, var_9 ) )
|
||||
return;
|
||||
|
||||
var_10 = getangledelta3d( var_7 );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
|
||||
if ( 3 <= var_6 && var_6 <= 5 )
|
||||
self scragentsetorientmode( "face angle abs", ( 0, angleclamp180( var_3[1] - var_10[1] ), 0 ) );
|
||||
else
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
|
||||
self.blockgoalpos = 1;
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "move_start", var_6, "move_start" );
|
||||
self.blockgoalpos = 0;
|
||||
}
|
||||
|
||||
getstopdata()
|
||||
{
|
||||
var_0 = spawnstruct();
|
||||
|
||||
if ( isdefined( self.node ) )
|
||||
{
|
||||
var_0.pos = self.node.origin;
|
||||
var_0.angles = self.node.angles;
|
||||
}
|
||||
else
|
||||
{
|
||||
var_1 = self getpathgoalpos();
|
||||
var_0.pos = var_1;
|
||||
var_0.angles = vectortoangles( self getlookaheaddir() );
|
||||
}
|
||||
|
||||
return var_0;
|
||||
}
|
||||
|
||||
getstopanimstate( var_0 )
|
||||
{
|
||||
if ( isdefined( self.node ) )
|
||||
{
|
||||
var_1 = self.node.angles[1] - self.angles[1];
|
||||
var_2 = maps\mp\agents\_scriptedagents::getangleindex( var_1 );
|
||||
}
|
||||
else
|
||||
var_2 = 4;
|
||||
|
||||
var_3 = spawnstruct();
|
||||
var_3.state = "move_stop";
|
||||
var_3.index = var_2;
|
||||
return var_3;
|
||||
}
|
||||
|
||||
calcanimstartpos( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
var_4 = var_1 - var_3;
|
||||
var_5 = ( 0, var_4, 0 );
|
||||
var_6 = anglestoforward( var_5 );
|
||||
var_7 = anglestoright( var_5 );
|
||||
var_8 = var_6 * var_2[0];
|
||||
var_9 = var_7 * var_2[1];
|
||||
return var_0 - var_8 + var_9;
|
||||
}
|
||||
|
||||
dog_addlean()
|
||||
{
|
||||
var_0 = clamp( self.leanamount / 25.0, -1, 1 );
|
||||
|
||||
if ( var_0 > 0 )
|
||||
return;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
handlefootstepnotetracks( var_0, var_1, var_2, var_3 )
|
||||
{
|
||||
if ( 1 )
|
||||
return 0;
|
||||
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "footstep_back_right_large":
|
||||
case "footstep_back_left_large":
|
||||
case "footstep_front_right_large":
|
||||
case "footstep_front_left_large":
|
||||
case "footstep_back_right_small":
|
||||
case "footstep_back_left_small":
|
||||
case "footstep_front_right_small":
|
||||
case "footstep_front_left_small":
|
||||
var_4 = undefined;
|
||||
|
||||
if ( isdefined( self.surfacetype ) )
|
||||
{
|
||||
var_4 = self.surfacetype;
|
||||
self.lastsurfacetype = var_4;
|
||||
}
|
||||
else if ( isdefined( self.lastsurfacetype ) )
|
||||
var_4 = self.lastsurfacetype;
|
||||
else
|
||||
var_4 = "dirt";
|
||||
|
||||
if ( var_4 != "dirt" && var_4 != "concrete" && var_4 != "wood" && var_4 != "metal" )
|
||||
var_4 = "dirt";
|
||||
|
||||
if ( var_4 == "concrete" )
|
||||
var_4 = "cement";
|
||||
|
||||
if ( self.aistate == "traverse" )
|
||||
var_5 = "land";
|
||||
else if ( self.movemode == "sprint" )
|
||||
var_5 = "sprint";
|
||||
else if ( self.movemode == "fastwalk" )
|
||||
var_5 = "walk";
|
||||
else
|
||||
var_5 = "run";
|
||||
|
||||
self playsoundonmovingent( "dogstep_" + var_5 + "_" + var_4 );
|
||||
|
||||
if ( issubstr( var_0, "front_left" ) )
|
||||
{
|
||||
var_6 = "anml_dog_mvmt_accent";
|
||||
var_7 = "anml_dog_mvmt_vest";
|
||||
|
||||
if ( var_5 == "walk" )
|
||||
var_8 = "_npc";
|
||||
else
|
||||
var_8 = "_run_npc";
|
||||
|
||||
self playsoundonmovingent( var_6 + var_8 );
|
||||
self playsoundonmovingent( var_7 + var_8 );
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
dohitreaction( var_0 )
|
||||
{
|
||||
cancelallbut( undefined );
|
||||
self.blockgoalpos = 1;
|
||||
self.statelocked = 1;
|
||||
var_1 = angleclamp180( var_0 - self.angles[1] );
|
||||
|
||||
if ( var_1 > 0 )
|
||||
var_2 = 1;
|
||||
else
|
||||
var_2 = 0;
|
||||
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
self scragentsetorientmode( "face angle abs", self.angles );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "run_pain", var_2, "run_pain" );
|
||||
self.blockgoalpos = 0;
|
||||
self.statelocked = 0;
|
||||
continuemovement();
|
||||
}
|
||||
|
||||
ondamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
if ( self.statelocked )
|
||||
return;
|
||||
|
||||
var_10 = vectortoangles( var_7 );
|
||||
var_11 = var_10[1] - 180;
|
||||
dohitreaction( var_11 );
|
||||
}
|
||||
|
||||
onflashbanged( var_0, var_1, var_2, var_3, var_4, var_5 )
|
||||
{
|
||||
if ( self.statelocked )
|
||||
return;
|
||||
|
||||
dohitreaction( self.angles[1] + 180 );
|
||||
}
|
898
maps/mp/agents/dog/_dog_think.gsc
Normal file
898
maps/mp/agents/dog/_dog_think.gsc
Normal file
@ -0,0 +1,898 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
setupdogstate();
|
||||
thread think();
|
||||
thread watchownerdamage();
|
||||
thread watchownerdeath();
|
||||
thread watchownerteamchange();
|
||||
thread waitforbadpath();
|
||||
thread waitforpathset();
|
||||
}
|
||||
|
||||
setupdogstate()
|
||||
{
|
||||
self.blockgoalpos = 0;
|
||||
self.ownerradiussq = 20736;
|
||||
self.meleeradiussq = 16384;
|
||||
self.attackoffset = 25 + self.radius;
|
||||
self.attackradiussq = 202500;
|
||||
self.warningradiussq = 302500;
|
||||
self.warningzheight = 96.0;
|
||||
self.attackzheight = 54;
|
||||
self.attackzheightdown = -64;
|
||||
self.ownerdamagedradiussq = 2250000;
|
||||
self.dogdamagedradiussq = 2250000;
|
||||
self.keeppursuingtargetradiussq = 1000000;
|
||||
self.preferredoffsetfromowner = 76;
|
||||
self.minoffsetfromowner = 50;
|
||||
self.forceattack = 0;
|
||||
self.ignoreclosefoliage = 1;
|
||||
self.movemode = "run";
|
||||
self.enableextendedkill = 1;
|
||||
self.attackstate = "idle";
|
||||
self.movestate = "idle";
|
||||
self.bhasbadpath = 0;
|
||||
self.timeoflastdamage = 0;
|
||||
self.allowcrouch = 1;
|
||||
self scragentsetgoalradius( 24 );
|
||||
}
|
||||
|
||||
init()
|
||||
{
|
||||
self.animcbs = spawnstruct();
|
||||
self.animcbs.onenter = [];
|
||||
self.animcbs.onenter["idle"] = maps\mp\agents\dog\_dog_idle::main;
|
||||
self.animcbs.onenter["move"] = maps\mp\agents\dog\_dog_move::main;
|
||||
self.animcbs.onenter["traverse"] = maps\mp\agents\dog\_dog_traverse::main;
|
||||
self.animcbs.onenter["melee"] = maps\mp\agents\dog\_dog_melee::main;
|
||||
self.animcbs.onexit = [];
|
||||
self.animcbs.onexit["idle"] = maps\mp\agents\dog\_dog_idle::end_script;
|
||||
self.animcbs.onexit["move"] = maps\mp\agents\dog\_dog_move::end_script;
|
||||
self.animcbs.onexit["melee"] = maps\mp\agents\dog\_dog_melee::end_script;
|
||||
self.animcbs.onexit["traverse"] = maps\mp\agents\dog\_dog_traverse::end_script;
|
||||
self.watchattackstatefunc = ::watchattackstate;
|
||||
self.aistate = "idle";
|
||||
self.movemode = "fastwalk";
|
||||
self.radius = 15;
|
||||
self.height = 40;
|
||||
}
|
||||
|
||||
onenteranimstate( var_0, var_1 )
|
||||
{
|
||||
self notify( "killanimscript" );
|
||||
|
||||
if ( !isdefined( self.animcbs.onenter[var_1] ) )
|
||||
return;
|
||||
|
||||
if ( var_0 == var_1 && var_1 != "traverse" )
|
||||
return;
|
||||
|
||||
if ( isdefined( self.animcbs.onexit[var_0] ) )
|
||||
self [[ self.animcbs.onexit[var_0] ]]();
|
||||
|
||||
exitaistate( self.aistate );
|
||||
self.aistate = var_1;
|
||||
enteraistate( var_1 );
|
||||
self [[ self.animcbs.onenter[var_1] ]]();
|
||||
}
|
||||
|
||||
think()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
if ( isdefined( self.owner ) )
|
||||
{
|
||||
self endon( "owner_disconnect" );
|
||||
thread destroyonownerdisconnect( self.owner );
|
||||
}
|
||||
|
||||
self thread [[ self.watchattackstatefunc ]]();
|
||||
thread monitorflash();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( self.aistate != "melee" && !self.statelocked && readytomeleetarget() && !didpastmeleefail() )
|
||||
self scragentbeginmelee( self.curmeleetarget );
|
||||
|
||||
switch ( self.aistate )
|
||||
{
|
||||
case "idle":
|
||||
updateidle();
|
||||
break;
|
||||
case "move":
|
||||
updatemove();
|
||||
break;
|
||||
case "melee":
|
||||
updatemelee();
|
||||
break;
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
didpastpursuitfail( var_0 )
|
||||
{
|
||||
if ( isdefined( self.curmeleetarget ) && var_0 != self.curmeleetarget )
|
||||
return 0;
|
||||
|
||||
if ( !isdefined( self.lastpursuitfailedpos ) || !isdefined( self.lastpursuitfailedmypos ) )
|
||||
return 0;
|
||||
|
||||
if ( distance2dsquared( var_0.origin, self.lastpursuitfailedpos ) > 4 )
|
||||
return 0;
|
||||
|
||||
if ( self.blastpursuitfailedposbad )
|
||||
return 1;
|
||||
|
||||
if ( distancesquared( self.origin, self.lastpursuitfailedmypos ) > 4096 && gettime() - self.lastpursuitfailedtime > 2000 )
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
didpastmeleefail()
|
||||
{
|
||||
if ( isdefined( self.lastmeleefailedpos ) && isdefined( self.lastmeleefailedmypos ) && distance2dsquared( self.curmeleetarget.origin, self.lastmeleefailedpos ) < 4 && distancesquared( self.origin, self.lastmeleefailedmypos ) < 2500 )
|
||||
return 1;
|
||||
|
||||
if ( wanttoattacktargetbutcant( 0 ) )
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
enteraistate( var_0 )
|
||||
{
|
||||
exitaistate( self.aistate );
|
||||
self.aistate = var_0;
|
||||
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "idle":
|
||||
self.movestate = "idle";
|
||||
self.bhasbadpath = 0;
|
||||
break;
|
||||
case "move":
|
||||
self.movestate = "follow";
|
||||
break;
|
||||
case "melee":
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
exitaistate( var_0 )
|
||||
{
|
||||
switch ( var_0 )
|
||||
{
|
||||
case "move":
|
||||
self.ownerprevpos = undefined;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
updateidle()
|
||||
{
|
||||
updatemovestate();
|
||||
}
|
||||
|
||||
updatemove()
|
||||
{
|
||||
updatemovestate();
|
||||
}
|
||||
|
||||
updatemelee()
|
||||
{
|
||||
self scragentsetgoalpos( self.origin );
|
||||
}
|
||||
|
||||
updatemovestate()
|
||||
{
|
||||
if ( self.blockgoalpos )
|
||||
return;
|
||||
|
||||
self.prevmovestate = self.movestate;
|
||||
var_0 = undefined;
|
||||
var_1 = 0;
|
||||
var_2 = 0;
|
||||
var_3 = 500;
|
||||
|
||||
if ( self.bhasbadpath && gettime() - self.lastbadpathtime < var_3 )
|
||||
{
|
||||
self.movestate = "follow";
|
||||
var_1 = 1;
|
||||
}
|
||||
else
|
||||
self.movestate = getmovestate();
|
||||
|
||||
if ( self.movestate == "pursuit" )
|
||||
{
|
||||
var_0 = getattackpoint( self.enemy );
|
||||
var_4 = 0;
|
||||
|
||||
if ( isdefined( self.lastbadpathtime ) && gettime() - self.lastbadpathtime < 3000 )
|
||||
{
|
||||
if ( distance2dsquared( var_0, self.lastbadpathgoal ) < 16 )
|
||||
var_4 = 1;
|
||||
else if ( isdefined( self.lastbadpathmovestate ) && self.lastbadpathmovestate == "pursuit" && distance2dsquared( self.lastbadpathultimategoal, self.enemy.origin ) < 16 )
|
||||
var_4 = 1;
|
||||
}
|
||||
|
||||
if ( var_4 )
|
||||
{
|
||||
self.movestate = "follow";
|
||||
var_2 = 1;
|
||||
}
|
||||
else if ( wanttoattacktargetbutcant( 1 ) )
|
||||
{
|
||||
self.movestate = "follow";
|
||||
var_2 = 1;
|
||||
}
|
||||
else if ( didpastpursuitfail( self.enemy ) )
|
||||
{
|
||||
self.movestate = "follow";
|
||||
var_2 = 1;
|
||||
}
|
||||
}
|
||||
|
||||
setpastpursuitfailed( var_2 );
|
||||
|
||||
if ( self.movestate == "follow" )
|
||||
{
|
||||
self.curmeleetarget = undefined;
|
||||
self.movemode = getfollowmovemode( self.movemode );
|
||||
self.barrivalsenabled = 1;
|
||||
var_5 = self getpathgoalpos();
|
||||
|
||||
if ( !isdefined( var_5 ) )
|
||||
var_5 = self.origin;
|
||||
|
||||
if ( self.owner.sessionstate == "spectator" )
|
||||
return;
|
||||
|
||||
if ( gettime() - self.timeoflastdamage < 5000 )
|
||||
var_1 = 1;
|
||||
|
||||
var_6 = self.owner getstance();
|
||||
|
||||
if ( !isdefined( self.owner.prevstance ) && isdefined( self.owner ) )
|
||||
self.owner.prevstance = var_6;
|
||||
|
||||
var_7 = !isdefined( self.ownerprevpos ) || distance2dsquared( self.ownerprevpos, self.owner.origin ) > 100;
|
||||
|
||||
if ( var_7 )
|
||||
self.ownerprevpos = self.owner.origin;
|
||||
|
||||
var_8 = distance2dsquared( var_5, self.owner.origin );
|
||||
|
||||
if ( var_1 || var_8 > self.ownerradiussq && var_7 || self.owner.prevstance != var_6 || self.prevmovestate != "idle" && self.prevmovestate != self.movestate )
|
||||
{
|
||||
self scragentsetgoalpos( findpointnearowner() );
|
||||
self.owner.prevstance = var_6;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if ( self.movestate == "pursuit" )
|
||||
{
|
||||
self.curmeleetarget = self.enemy;
|
||||
self.movemode = "sprint";
|
||||
self.barrivalsenabled = 0;
|
||||
self scragentsetgoalpos( var_0 );
|
||||
}
|
||||
}
|
||||
|
||||
getmovestate( var_0 )
|
||||
{
|
||||
if ( isdefined( self.enemy ) )
|
||||
{
|
||||
if ( isdefined( self.favoriteenemy ) && self.enemy == self.favoriteenemy )
|
||||
return "pursuit";
|
||||
|
||||
if ( abs( self.origin[2] - self.enemy.origin[2] ) < self.warningzheight && distance2dsquared( self.enemy.origin, self.origin ) < self.attackradiussq )
|
||||
return "pursuit";
|
||||
|
||||
if ( isdefined( self.curmeleetarget ) && self.curmeleetarget == self.enemy )
|
||||
{
|
||||
if ( distance2dsquared( self.curmeleetarget.origin, self.origin ) < self.keeppursuingtargetradiussq )
|
||||
return "pursuit";
|
||||
}
|
||||
}
|
||||
|
||||
return "follow";
|
||||
}
|
||||
|
||||
setpastpursuitfailed( var_0 )
|
||||
{
|
||||
if ( var_0 )
|
||||
{
|
||||
if ( !isdefined( self.lastpursuitfailedpos ) )
|
||||
{
|
||||
self.lastpursuitfailedpos = self.enemy.origin;
|
||||
self.lastpursuitfailedmypos = self.origin;
|
||||
var_1 = maps\mp\agents\_scriptedagents::droppostoground( self.enemy.origin );
|
||||
self.blastpursuitfailedposbad = !isdefined( var_1 );
|
||||
self.lastpursuitfailedtime = gettime();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self.lastpursuitfailedpos = undefined;
|
||||
self.lastpursuitfailedmypos = undefined;
|
||||
self.blastpursuitfailedposbad = undefined;
|
||||
self.lastpursuitfailedtime = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
waitforbadpath()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "bad_path", var_0 );
|
||||
self.bhasbadpath = 1;
|
||||
self.lastbadpathtime = gettime();
|
||||
self.lastbadpathgoal = var_0;
|
||||
self.lastbadpathmovestate = self.movestate;
|
||||
|
||||
if ( self.movestate == "follow" && isdefined( self.owner ) )
|
||||
{
|
||||
self.lastbadpathultimategoal = self.owner.origin;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( self.movestate == "pursuit" && isdefined( self.enemy ) )
|
||||
self.lastbadpathultimategoal = self.enemy.origin;
|
||||
}
|
||||
}
|
||||
|
||||
waitforpathset()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "path_set" );
|
||||
self.bhasbadpath = 0;
|
||||
}
|
||||
}
|
||||
|
||||
getfollowmovemode( var_0 )
|
||||
{
|
||||
var_1 = 40000;
|
||||
var_2 = 65536;
|
||||
var_3 = self getpathgoalpos();
|
||||
|
||||
if ( isdefined( var_3 ) )
|
||||
{
|
||||
var_4 = distancesquared( var_3, self.origin );
|
||||
|
||||
if ( var_0 == "run" || var_0 == "sprint" )
|
||||
{
|
||||
if ( var_4 < var_1 )
|
||||
return "fastwalk";
|
||||
else if ( var_0 == "sprint" )
|
||||
return "run";
|
||||
}
|
||||
else if ( var_0 == "fastwalk" )
|
||||
{
|
||||
if ( var_4 > var_2 )
|
||||
return "run";
|
||||
}
|
||||
}
|
||||
|
||||
return var_0;
|
||||
}
|
||||
|
||||
iswithinattackheight( var_0 )
|
||||
{
|
||||
var_1 = var_0[2] - self.origin[2];
|
||||
return var_1 <= self.attackzheight && var_1 >= self.attackzheightdown;
|
||||
}
|
||||
|
||||
wanttoattacktargetbutcant( var_0 )
|
||||
{
|
||||
if ( !isdefined( self.curmeleetarget ) )
|
||||
return 0;
|
||||
|
||||
return !iswithinattackheight( self.curmeleetarget.origin ) && distance2dsquared( self.origin, self.curmeleetarget.origin ) < self.meleeradiussq * 0.75 * 0.75 && ( !var_0 || self agentcanseesentient( self.curmeleetarget ) );
|
||||
}
|
||||
|
||||
readytomeleetarget()
|
||||
{
|
||||
if ( !isdefined( self.curmeleetarget ) )
|
||||
return 0;
|
||||
|
||||
if ( !maps\mp\_utility::isreallyalive( self.curmeleetarget ) )
|
||||
return 0;
|
||||
|
||||
if ( self.aistate == "traverse" )
|
||||
return 0;
|
||||
|
||||
if ( distance2dsquared( self.origin, self.curmeleetarget.origin ) > self.meleeradiussq )
|
||||
return 0;
|
||||
|
||||
if ( !iswithinattackheight( self.curmeleetarget.origin ) )
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
wantstogrowlattarget()
|
||||
{
|
||||
if ( !isdefined( self.enemy ) )
|
||||
return 0;
|
||||
|
||||
if ( abs( self.origin[2] - self.enemy.origin[2] ) <= self.warningzheight || self agentcanseesentient( self.enemy ) )
|
||||
{
|
||||
var_0 = distance2dsquared( self.origin, self.enemy.origin );
|
||||
|
||||
if ( var_0 < self.warningradiussq )
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
getattackpoint( var_0 )
|
||||
{
|
||||
var_1 = var_0.origin - self.origin;
|
||||
var_1 = vectornormalize( var_1 );
|
||||
var_2 = self getpathgoalpos();
|
||||
var_3 = self.attackoffset + 4;
|
||||
|
||||
if ( isdefined( var_2 ) && distance2dsquared( var_2, var_0.origin ) < var_3 * var_3 && maps\mp\agents\_scriptedagents::canmovepointtopoint( var_0.origin, var_2 ) )
|
||||
return var_2;
|
||||
|
||||
var_4 = var_0.origin - var_1 * self.attackoffset;
|
||||
var_4 = maps\mp\agents\_scriptedagents::droppostoground( var_4 );
|
||||
|
||||
if ( !isdefined( var_4 ) )
|
||||
return var_0.origin;
|
||||
|
||||
if ( !maps\mp\agents\_scriptedagents::canmovepointtopoint( var_0.origin, var_4 ) )
|
||||
{
|
||||
var_5 = anglestoforward( var_0.angles );
|
||||
var_4 = var_0.origin + var_5 * self.attackoffset;
|
||||
|
||||
if ( !maps\mp\agents\_scriptedagents::canmovepointtopoint( var_0.origin, var_4 ) )
|
||||
return var_0.origin;
|
||||
}
|
||||
|
||||
return var_4;
|
||||
}
|
||||
|
||||
cross2d( var_0, var_1 )
|
||||
{
|
||||
return var_0[0] * var_1[1] - var_1[0] * var_0[1];
|
||||
}
|
||||
|
||||
findpointnearowner()
|
||||
{
|
||||
var_0 = vectornormalize( self.origin - self.owner.origin );
|
||||
var_1 = anglestoforward( self.owner.angles );
|
||||
var_1 = ( var_1[0], var_1[1], 0 );
|
||||
var_1 = vectornormalize( var_1 );
|
||||
var_2 = cross2d( var_0, var_1 );
|
||||
var_3 = getclosestnodeinsight( self.owner.origin );
|
||||
|
||||
if ( !isdefined( var_3 ) )
|
||||
return self.origin;
|
||||
|
||||
var_4 = getlinkednodes( var_3 );
|
||||
var_5 = 5;
|
||||
var_6 = 10;
|
||||
var_7 = 15;
|
||||
var_8 = -15;
|
||||
var_9 = gettime() - self.timeoflastdamage < 5000;
|
||||
var_10 = 0;
|
||||
var_11 = undefined;
|
||||
var_4[var_4.size] = var_3;
|
||||
|
||||
foreach ( var_13 in var_4 )
|
||||
{
|
||||
var_14 = 0;
|
||||
var_15 = var_13.origin - self.owner.origin;
|
||||
var_16 = length( var_15 );
|
||||
|
||||
if ( var_16 >= self.preferredoffsetfromowner )
|
||||
var_14 = var_14 + var_5;
|
||||
else if ( var_16 < self.minoffsetfromowner )
|
||||
{
|
||||
var_17 = 1 - ( self.minoffsetfromowner - var_16 ) / self.minoffsetfromowner;
|
||||
var_14 = var_14 + var_5 * var_17 * var_17;
|
||||
}
|
||||
else
|
||||
var_14 = var_14 + var_5 * var_16 / self.preferredoffsetfromowner;
|
||||
|
||||
if ( var_16 == 0 )
|
||||
var_16 = 1;
|
||||
|
||||
var_15 = var_15 / var_16;
|
||||
var_18 = vectordot( var_1, var_15 );
|
||||
var_19 = self.owner getstance();
|
||||
|
||||
switch ( var_19 )
|
||||
{
|
||||
case "stand":
|
||||
if ( var_18 < cos( 35 ) && var_18 > cos( 45 ) )
|
||||
var_14 = var_14 + var_6;
|
||||
|
||||
break;
|
||||
case "crouch":
|
||||
if ( var_18 < cos( 75 ) && var_18 > cos( 90 ) )
|
||||
var_14 = var_14 + var_6;
|
||||
|
||||
break;
|
||||
case "prone":
|
||||
if ( var_18 < cos( 125 ) && var_18 > cos( 135 ) )
|
||||
var_14 = var_14 + var_6;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
var_20 = cross2d( var_15, var_1 );
|
||||
|
||||
if ( var_20 * var_2 > 0 )
|
||||
var_14 = var_14 + var_7;
|
||||
|
||||
if ( var_9 )
|
||||
{
|
||||
var_21 = vectordot( self.damagedownertome, var_15 );
|
||||
var_14 = var_14 + var_21 * var_8;
|
||||
}
|
||||
|
||||
if ( var_14 > var_10 )
|
||||
{
|
||||
var_10 = var_14;
|
||||
var_11 = var_13;
|
||||
}
|
||||
}
|
||||
|
||||
if ( !isdefined( var_11 ) )
|
||||
return self.origin;
|
||||
|
||||
var_23 = var_11.origin - self.owner.origin;
|
||||
var_24 = length( var_23 );
|
||||
|
||||
if ( var_24 > self.preferredoffsetfromowner )
|
||||
{
|
||||
var_25 = var_3.origin - self.owner.origin;
|
||||
|
||||
if ( vectordot( var_25, var_23 / var_24 ) < 0 )
|
||||
var_26 = var_11.origin;
|
||||
else
|
||||
{
|
||||
var_27 = vectornormalize( var_11.origin - var_3.origin );
|
||||
var_26 = var_3.origin + var_27 * self.preferredoffsetfromowner;
|
||||
}
|
||||
}
|
||||
else
|
||||
var_26 = var_11.origin;
|
||||
|
||||
var_26 = maps\mp\agents\_scriptedagents::droppostoground( var_26 );
|
||||
|
||||
if ( !isdefined( var_26 ) )
|
||||
return self.origin;
|
||||
|
||||
if ( self.bhasbadpath && distance2dsquared( var_26, self.lastbadpathgoal ) < 4 )
|
||||
return self.origin;
|
||||
|
||||
return var_26;
|
||||
}
|
||||
|
||||
destroyonownerdisconnect( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
var_0 common_scripts\utility::waittill_any( "disconnect", "joined_team" );
|
||||
self notify( "owner_disconnect" );
|
||||
|
||||
if ( maps\mp\gametypes\_hostmigration::waittillhostmigrationdone() )
|
||||
wait 0.05;
|
||||
|
||||
self notify( "killanimscript" );
|
||||
|
||||
if ( isdefined( self.animcbs.onexit[self.aistate] ) )
|
||||
self [[ self.animcbs.onexit[self.aistate] ]]();
|
||||
|
||||
self suicide();
|
||||
}
|
||||
|
||||
watchattackstate()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( self.aistate == "melee" )
|
||||
{
|
||||
if ( self.attackstate != "melee" )
|
||||
{
|
||||
self.attackstate = "melee";
|
||||
setsoundstate( undefined );
|
||||
}
|
||||
}
|
||||
else if ( self.movestate == "pursuit" )
|
||||
{
|
||||
if ( self.attackstate != "attacking" )
|
||||
{
|
||||
self.attackstate = "attacking";
|
||||
setsoundstate( "bark", "attacking" );
|
||||
}
|
||||
}
|
||||
else if ( self.attackstate != "warning" )
|
||||
{
|
||||
if ( wantstogrowlattarget() )
|
||||
{
|
||||
self.attackstate = "warning";
|
||||
setsoundstate( "growl", "warning" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.attackstate = self.aistate;
|
||||
setsoundstate( "pant" );
|
||||
}
|
||||
}
|
||||
else if ( !wantstogrowlattarget() )
|
||||
{
|
||||
self.attackstate = self.aistate;
|
||||
setsoundstate( "pant" );
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
setsoundstate( var_0, var_1 )
|
||||
{
|
||||
if ( !isdefined( var_0 ) )
|
||||
{
|
||||
self notify( "end_dog_sound" );
|
||||
self.soundstate = undefined;
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !isdefined( self.soundstate ) || self.soundstate != var_0 )
|
||||
{
|
||||
self notify( "end_dog_sound" );
|
||||
self.soundstate = var_0;
|
||||
|
||||
if ( var_0 == "bark" )
|
||||
thread playbark( var_1 );
|
||||
else if ( var_0 == "growl" )
|
||||
thread playgrowl( var_1 );
|
||||
else if ( var_0 == "pant" )
|
||||
thread playpanting();
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
playbark( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
self endon( "end_dog_sound" );
|
||||
|
||||
if ( !isdefined( self.barking_sound ) )
|
||||
{
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "anml_wolf_bark", "anml_dog_bark" ) );
|
||||
self.barking_sound = 1;
|
||||
thread watchbarking();
|
||||
}
|
||||
}
|
||||
|
||||
watchbarking()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
self endon( "end_dog_sound" );
|
||||
wait( randomintrange( 5, 10 ) );
|
||||
self.barking_sound = undefined;
|
||||
}
|
||||
|
||||
playgrowl( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
self endon( "end_dog_sound" );
|
||||
|
||||
if ( isdefined( self.lastgrowlplayedtime ) && gettime() - self.lastgrowlplayedtime < 3000 )
|
||||
wait 3;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self.lastgrowlplayedtime = gettime();
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "anml_wolf_growl", "anml_dog_growl" ) );
|
||||
wait( randomintrange( 3, 6 ) );
|
||||
}
|
||||
}
|
||||
|
||||
playpanting( var_0 )
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
self endon( "end_dog_sound" );
|
||||
|
||||
if ( isdefined( self.lastpantplayedtime ) && gettime() - self.lastpantplayedtime < 3000 )
|
||||
wait 3;
|
||||
|
||||
self.lastpantplayedtime = gettime();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( self.aistate == "idle" )
|
||||
{
|
||||
wait 3;
|
||||
continue;
|
||||
}
|
||||
|
||||
self.lastpantplayedtime = gettime();
|
||||
|
||||
if ( self.movemode == "run" || self.movemode == "sprint" )
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "anml_wolf_pants_mp_fast", "anml_dog_pants_mp_fast" ) );
|
||||
else
|
||||
self playsoundonmovingent( common_scripts\utility::ter_op( self.biswolf, "anml_wolf_pants_mp_med", "anml_dog_pants_mp_med" ) );
|
||||
|
||||
wait( randomintrange( 6, 8 ) );
|
||||
}
|
||||
}
|
||||
|
||||
watchownerdamage()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !isdefined( self.owner ) )
|
||||
return;
|
||||
|
||||
self.owner waittill( "damage", var_0, var_1 );
|
||||
|
||||
if ( isplayer( var_1 ) && var_1 != self.owner )
|
||||
{
|
||||
if ( self.attackstate == "attacking" )
|
||||
continue;
|
||||
|
||||
if ( distancesquared( self.owner.origin, self.origin ) > self.ownerdamagedradiussq )
|
||||
continue;
|
||||
|
||||
if ( distancesquared( self.owner.origin, var_1.origin ) > self.ownerdamagedradiussq )
|
||||
continue;
|
||||
|
||||
self.favoriteenemy = var_1;
|
||||
self.forceattack = 1;
|
||||
thread watchfavoriteenemydeath();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
watchownerdeath()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !isdefined( self.owner ) )
|
||||
return;
|
||||
|
||||
self.owner waittill( "death" );
|
||||
|
||||
switch ( level.gametype )
|
||||
{
|
||||
case "sd":
|
||||
maps\mp\agents\_agent_utility::killdog();
|
||||
break;
|
||||
case "sr":
|
||||
var_0 = level common_scripts\utility::waittill_any_return( "sr_player_eliminated", "sr_player_respawned" );
|
||||
|
||||
if ( isdefined( var_0 ) && var_0 == "sr_player_eliminated" )
|
||||
maps\mp\agents\_agent_utility::killdog();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
watchownerteamchange()
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !isdefined( self.owner ) )
|
||||
return;
|
||||
|
||||
var_0 = self.owner common_scripts\utility::waittill_any_return_no_endon_death( "joined_team", "joined_spectators" );
|
||||
|
||||
if ( isdefined( var_0 ) && ( var_0 == "joined_team" || var_0 == "joined_spectators" ) )
|
||||
maps\mp\agents\_agent_utility::killdog();
|
||||
}
|
||||
}
|
||||
|
||||
watchfavoriteenemydeath()
|
||||
{
|
||||
self notify( "watchFavoriteEnemyDeath" );
|
||||
self endon( "watchFavoriteEnemyDeath" );
|
||||
self endon( "death" );
|
||||
self.favoriteenemy common_scripts\utility::waittill_any_timeout( 5.0, "death", "disconnect" );
|
||||
self.favoriteenemy = undefined;
|
||||
self.forceattack = 0;
|
||||
}
|
||||
|
||||
ondamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
|
||||
{
|
||||
self.timeoflastdamage = gettime();
|
||||
|
||||
if ( isdefined( self.owner ) )
|
||||
self.damagedownertome = vectornormalize( self.origin - self.owner.origin );
|
||||
|
||||
if ( shouldplayhitreaction( var_2, var_5, var_4 ) )
|
||||
{
|
||||
switch ( self.aistate )
|
||||
{
|
||||
case "idle":
|
||||
thread maps\mp\agents\dog\_dog_idle::ondamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
||||
break;
|
||||
case "move":
|
||||
thread maps\mp\agents\dog\_dog_move::ondamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
shouldplayhitreaction( var_0, var_1, var_2 )
|
||||
{
|
||||
if ( isdefined( var_1 ) && weaponclass( var_1 ) == "sniper" )
|
||||
return 1;
|
||||
|
||||
if ( isdefined( var_2 ) && isexplosivedamagemod( var_2 ) && var_0 >= 10 )
|
||||
return 1;
|
||||
|
||||
if ( isdefined( var_2 ) && var_2 == "MOD_MELEE" )
|
||||
return 1;
|
||||
|
||||
if ( isdefined( var_1 ) && var_1 == "concussion_grenade_mp" )
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
monitorflash()
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "flashbang", var_0, var_1, var_2, var_3, var_4, var_5 );
|
||||
|
||||
if ( isdefined( var_3 ) && var_3 == self.owner )
|
||||
continue;
|
||||
|
||||
switch ( self.aistate )
|
||||
{
|
||||
case "idle":
|
||||
maps\mp\agents\dog\_dog_idle::onflashbanged();
|
||||
break;
|
||||
case "move":
|
||||
maps\mp\agents\dog\_dog_move::onflashbanged();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
205
maps/mp/agents/dog/_dog_traverse.gsc
Normal file
205
maps/mp/agents/dog/_dog_traverse.gsc
Normal file
@ -0,0 +1,205 @@
|
||||
// IW6 GSC SOURCE
|
||||
// Generated by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
|
||||
if ( !isdefined( level.dogtraverseanims ) )
|
||||
initdogtraverseanims();
|
||||
|
||||
var_0 = self getnegotiationstartnode();
|
||||
var_1 = self getnegotiationendnode();
|
||||
var_2 = undefined;
|
||||
var_2 = level.dogtraverseanims[var_0.animscript];
|
||||
|
||||
if ( !isdefined( var_2 ) )
|
||||
return;
|
||||
|
||||
self.blockgoalpos = 1;
|
||||
var_3 = var_1.origin - var_0.origin;
|
||||
var_4 = ( var_3[0], var_3[1], 0 );
|
||||
var_5 = vectortoangles( var_4 );
|
||||
self scragentsetorientmode( "face angle abs", var_5 );
|
||||
self scragentsetanimmode( "anim deltas" );
|
||||
var_6 = self getanimentry( var_2, 0 );
|
||||
var_7 = getnotetracktimes( var_6, "code_move" );
|
||||
|
||||
if ( var_7.size > 0 )
|
||||
var_8 = getmovedelta( var_6, 0, var_7[0] );
|
||||
else
|
||||
var_8 = getmovedelta( var_6, 0, 1 );
|
||||
|
||||
var_9 = maps\mp\agents\_scriptedagents::getanimscalefactors( var_3, var_8 );
|
||||
self scragentsetphysicsmode( "noclip" );
|
||||
|
||||
if ( var_3[2] > 0 )
|
||||
{
|
||||
if ( var_8[2] > 0 )
|
||||
{
|
||||
var_10 = getnotetracktimes( var_6, "traverse_jump_start" );
|
||||
|
||||
if ( var_10.size > 0 )
|
||||
{
|
||||
var_11 = 1;
|
||||
var_12 = 1;
|
||||
|
||||
if ( length2dsquared( var_4 ) < 0.64 * length2dsquared( var_8 ) )
|
||||
var_11 = 0.4;
|
||||
|
||||
if ( var_3[2] < 0.75 * var_8[2] )
|
||||
var_12 = 0.5;
|
||||
|
||||
self scragentsetanimscale( var_11, var_12 );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 0, "traverse", "traverse_jump_start" );
|
||||
var_13 = getnotetracktimes( var_6, "traverse_jump_end" );
|
||||
var_14 = getmovedelta( var_6, 0, var_10[0] );
|
||||
var_15 = getmovedelta( var_6, 0, var_13[0] );
|
||||
var_11 = 1;
|
||||
var_12 = 1;
|
||||
var_16 = var_1.origin - self.origin;
|
||||
var_17 = var_8 - var_14;
|
||||
|
||||
if ( length2dsquared( var_16 ) < 0.5625 * length2dsquared( var_17 ) )
|
||||
var_11 = 0.75;
|
||||
|
||||
if ( var_16[2] < 0.75 * var_17[2] )
|
||||
var_12 = 0.75;
|
||||
|
||||
var_18 = var_8 - var_15;
|
||||
var_19 = ( var_18[0] * var_11, var_18[1] * var_11, var_18[2] * var_12 );
|
||||
var_20 = rotatevector( var_19, var_5 );
|
||||
var_21 = var_1.origin - var_20;
|
||||
var_22 = var_15 - var_14;
|
||||
var_23 = rotatevector( var_22, var_5 );
|
||||
var_24 = var_21 - self.origin;
|
||||
var_9 = maps\mp\agents\_scriptedagents::getanimscalefactors( var_24, var_23, 1 );
|
||||
self scragentsetanimscale( var_9.xy, var_9.z );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "traverse", "traverse_jump_end" );
|
||||
self scragentsetanimscale( var_11, var_12 );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "traverse", "code_move" );
|
||||
return;
|
||||
}
|
||||
|
||||
self scragentsetanimscale( var_9.xy, var_9.z );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 0, "traverse" );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
var_25 = getnotetracktimes( var_6, "gravity on" );
|
||||
|
||||
if ( var_25.size > 0 )
|
||||
{
|
||||
var_26 = var_0 gettargetentpos();
|
||||
|
||||
if ( isdefined( var_26 ) )
|
||||
{
|
||||
var_27 = var_26 - self.origin;
|
||||
var_28 = var_1.origin - var_26;
|
||||
var_29 = getmovedelta( var_6, 0, var_25[0] );
|
||||
var_9 = maps\mp\agents\_scriptedagents::getanimscalefactors( var_27, var_29 );
|
||||
self scragentsetanimscale( var_9.xy, var_9.z );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 0, "traverse", "gravity on" );
|
||||
var_30 = getmovedelta( var_6, var_25[0], 1 );
|
||||
var_9 = maps\mp\agents\_scriptedagents::getanimscalefactors( var_28, var_30 );
|
||||
self scragentsetanimscale( var_9.xy, var_9.z );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "traverse", "code_move" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
var_31 = getanimlength( var_6 );
|
||||
self scragentdoanimlerp( var_0.origin, var_1.origin, var_31 );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 0, "traverse" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var_25 = getnotetracktimes( var_6, "gravity on" );
|
||||
|
||||
if ( var_25.size > 0 )
|
||||
{
|
||||
self scragentsetanimscale( var_9.xy, 1 );
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 0, "traverse", "gravity on" );
|
||||
var_32 = getmovedelta( var_6, 0, var_25[0] );
|
||||
var_33 = var_32[2] - var_8[2];
|
||||
|
||||
if ( abs( var_33 ) > 0 )
|
||||
{
|
||||
var_34 = self.origin[2] - var_1.origin[2];
|
||||
var_12 = var_34 / var_33;
|
||||
self scragentsetanimscale( var_9.xy, var_12 );
|
||||
var_35 = clamp( 2 / var_12, 0.5, 1 );
|
||||
var_36 = var_2 + "_norestart";
|
||||
self setanimstate( var_36, 0, var_35 );
|
||||
}
|
||||
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "traverse", "code_move" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self scragentsetanimscale( var_9.xy, var_9.z );
|
||||
var_35 = clamp( 2 / var_9.z, 0.5, 1 );
|
||||
var_13 = getnotetracktimes( var_6, "traverse_jump_end" );
|
||||
|
||||
if ( var_13.size > 0 )
|
||||
{
|
||||
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_2, 0, var_35, "traverse", "traverse_jump_end" );
|
||||
var_36 = var_2 + "_norestart";
|
||||
self setanimstate( var_36, 0, 1 );
|
||||
maps\mp\agents\_scriptedagents::waituntilnotetrack( "traverse", "code_move" );
|
||||
}
|
||||
else
|
||||
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_2, 0, "traverse" );
|
||||
}
|
||||
|
||||
self scragentsetanimscale( 1, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
end_script()
|
||||
{
|
||||
self scragentsetanimscale( 1, 1 );
|
||||
self.blockgoalpos = 0;
|
||||
}
|
||||
|
||||
gettargetentpos()
|
||||
{
|
||||
if ( isdefined( self.targetentpos ) )
|
||||
return self.targetentpos;
|
||||
|
||||
var_0 = getent( self.target, "targetname" );
|
||||
|
||||
if ( !isdefined( var_0 ) )
|
||||
return undefined;
|
||||
|
||||
self.targetentpos = var_0.origin;
|
||||
var_0 delete();
|
||||
return self.targetentpos;
|
||||
}
|
||||
|
||||
initdogtraverseanims()
|
||||
{
|
||||
level.dogtraverseanims = [];
|
||||
level.dogtraverseanims["hjk_tree_hop"] = "traverse_jump_over_24";
|
||||
level.dogtraverseanims["jump_across_72"] = "traverse_jump_over_24";
|
||||
level.dogtraverseanims["wall_hop"] = "traverse_jump_over_36";
|
||||
level.dogtraverseanims["window_2"] = "traverse_jump_over_36";
|
||||
level.dogtraverseanims["wall_over_40"] = "traverse_jump_over_36";
|
||||
level.dogtraverseanims["wall_over"] = "traverse_jump_over_36";
|
||||
level.dogtraverseanims["window_divethrough_36"] = "traverse_jump_over_36";
|
||||
level.dogtraverseanims["window_over_40"] = "traverse_jump_over_36";
|
||||
level.dogtraverseanims["window_over_quick"] = "traverse_jump_over_36";
|
||||
level.dogtraverseanims["jump_up_80"] = "traverse_jump_up_70";
|
||||
level.dogtraverseanims["jump_standing_80"] = "traverse_jump_up_70";
|
||||
level.dogtraverseanims["jump_down_80"] = "traverse_jump_down_70";
|
||||
level.dogtraverseanims["jump_up_40"] = "traverse_jump_up_40";
|
||||
level.dogtraverseanims["jump_down_40"] = "traverse_jump_down_40";
|
||||
level.dogtraverseanims["step_up"] = "traverse_jump_up_24";
|
||||
level.dogtraverseanims["step_up_24"] = "traverse_jump_up_24";
|
||||
level.dogtraverseanims["step_down"] = "traverse_jump_down_24";
|
||||
level.dogtraverseanims["jump_down"] = "traverse_jump_down_24";
|
||||
level.dogtraverseanims["jump_across"] = "traverse_jump_over_36";
|
||||
level.dogtraverseanims["jump_across_100"] = "traverse_jump_over_36";
|
||||
}
|
Reference in New Issue
Block a user