mirror of
https://github.com/InfinityLoader/IL-GSC.git
synced 2025-06-07 17:17:50 -05:00
238 lines
6.1 KiB
Plaintext
238 lines
6.1 KiB
Plaintext
#include maps\_utility;
|
||
#include animscripts\zombie_utility;
|
||
#include common_scripts\utility;
|
||
#using_animtree ("zombie_dog");
|
||
main()
|
||
{
|
||
self endon("killanimscript");
|
||
self ClearAnim( %root, 0.2 );
|
||
self ClearAnim( anim.dogAnims[self.animSet].move["run_stop"], 0 );
|
||
if ( !IsDefined( self.traverseComplete ) && !IsDefined( self.skipStartMove ) && self.a.movement == "run" )
|
||
{
|
||
self startMove();
|
||
blendTime = 0;
|
||
}
|
||
else
|
||
{
|
||
blendTime = 0.2;
|
||
}
|
||
self.traverseComplete = undefined;
|
||
self.skipStartMove = undefined;
|
||
self ClearAnim( anim.dogAnims[self.animSet].move["run_start"], 0 );
|
||
if ( self.a.movement == "run" )
|
||
{
|
||
weights = undefined;
|
||
weights = self getRunAnimWeights();
|
||
self SetAnimRestart( anim.dogAnims[self.animSet].move["run"], weights[ "center" ], blendTime, 1 );
|
||
self SetAnimRestart( anim.dogAnims[self.animSet].move["run_lean_L"], weights["left"], blendTime, 1 );
|
||
self SetAnimRestart( anim.dogAnims[self.animSet].move["run_lean_R"], weights["right"], blendTime, 1 );
|
||
self SetFlaggedAnimKnob( "dog_run", anim.dogAnims[self.animSet].move["run_knob"], 1, blendTime, self.moveplaybackrate );
|
||
animscripts\zombie_shared::DoNoteTracksForTime( 0.1, "dog_run" );
|
||
}
|
||
else
|
||
{
|
||
self SetFlaggedAnimRestart( "dog_walk", anim.dogAnims[self.animSet].move["walk"], 1, 0.2, self.moveplaybackrate );
|
||
}
|
||
while ( 1 )
|
||
{
|
||
self moveLoop();
|
||
if ( self.a.movement == "run" )
|
||
{
|
||
if ( self.disableArrivals == false )
|
||
{
|
||
self thread stopMove();
|
||
}
|
||
self waittill( "run" );
|
||
self ClearAnim( anim.dogAnims[self.animSet].move["run_stop"], 0.1 );
|
||
}
|
||
}
|
||
}
|
||
moveLoop()
|
||
{
|
||
self endon( "killanimscript" );
|
||
self endon( "stop_soon" );
|
||
while (1)
|
||
{
|
||
if ( self.disableArrivals )
|
||
{
|
||
self.stopAnimDistSq = 0;
|
||
}
|
||
else
|
||
{
|
||
self.stopAnimDistSq = anim.dogAnims[self.animSet].dogStoppingDistSq;
|
||
}
|
||
if ( self.a.movement == "run" )
|
||
{
|
||
weights = self getRunAnimWeights();
|
||
self ClearAnim( anim.dogAnims[self.animSet].move["walk"], 0.3 );
|
||
self SetAnim( anim.dogAnims[self.animSet].move["run"], weights["center"], 0.2, 1 );
|
||
self SetAnim( anim.dogAnims[self.animSet].move["run_lean_L"], weights["left"], 0.2, 1 );
|
||
self SetAnim( anim.dogAnims[self.animSet].move["run_lean_R"], weights["right"], 0.2, 1 );
|
||
self SetFlaggedAnimKnob( "dog_run", anim.dogAnims[self.animSet].move["run_knob"], 1, 0.2, self.moveplaybackrate );
|
||
animscripts\zombie_shared::DoNoteTracksForTime(0.2, "dog_run");
|
||
}
|
||
else
|
||
{
|
||
assert( self.a.movement == "walk" );
|
||
self ClearAnim( anim.dogAnims[self.animSet].move["run_knob"], 0.3 );
|
||
self setflaggedanim( "dog_walk", anim.dogAnims[self.animSet].move["walk"], 1, 0.2, self.moveplaybackrate );
|
||
animscripts\zombie_shared::DoNoteTracksForTime( 0.2, "dog_walk" );
|
||
if ( self need_to_run() )
|
||
{
|
||
self.a.movement = "run";
|
||
self notify( "dog_running" );
|
||
}
|
||
}
|
||
}
|
||
}
|
||
startMoveTrackLookAhead()
|
||
{
|
||
self endon("killanimscript");
|
||
for ( i = 0; i < 2; i++ )
|
||
{
|
||
lookaheadAngle = VectorToAngles( self.lookaheaddir );
|
||
self OrientMode( "face angle", lookaheadAngle );
|
||
}
|
||
}
|
||
startMove()
|
||
{
|
||
{
|
||
self SetAnimRestart( anim.dogAnims[self.animSet].move["run_start"], 1, 0.2, 1 );
|
||
}
|
||
self SetFlaggedAnimKnobRestart( "dog_prerun", anim.dogAnims[self.animSet].move["run_start_knob"], 1, 0.2, self.moveplaybackrate );
|
||
self animscripts\zombie_shared::DoNoteTracks( "dog_prerun" );
|
||
self AnimMode( "none" );
|
||
self OrientMode( "face motion" );
|
||
}
|
||
stopMove()
|
||
{
|
||
self endon( "killanimscript" );
|
||
self endon( "run" );
|
||
self ClearAnim( anim.dogAnims[self.animSet].move["run_knob"], 0.1 );
|
||
self SetFlaggedAnimRestart( "stop_anim", anim.dogAnims[self.animSet].move["run_stop"], 1, 0.2, 1 );
|
||
self animscripts\zombie_shared::DoNoteTracks( "stop_anim" );
|
||
}
|
||
wait_for_play_sound_on_tag( alias, tag )
|
||
{
|
||
self play_sound_on_tag( alias, tag );
|
||
self notify( "growl_bark_done" );
|
||
}
|
||
randomSoundDuringRunLoop()
|
||
{
|
||
self endon( "killanimscript" );
|
||
while ( 1 )
|
||
{
|
||
if ( IsDefined( self.script_growl ) )
|
||
{
|
||
self thread wait_for_play_sound_on_tag( "aml_dog_growl", "tag_eye" );
|
||
}
|
||
else
|
||
{
|
||
self thread wait_for_play_sound_on_tag( "aml_dog_bark", "tag_eye" );
|
||
}
|
||
self waittill( "growl_bark_done" );
|
||
wait( RandomFloatRange( 0.1, 0.3 ) );
|
||
}
|
||
}
|
||
getRunAnimWeights()
|
||
{
|
||
weights = [];
|
||
weights["center"] = 0;
|
||
weights["left"] = 0;
|
||
weights["right"] = 0;
|
||
if ( self.leanAmount > 0 )
|
||
{
|
||
if ( self.leanAmount < 0.95 )
|
||
{
|
||
self.leanAmount = 0.95;
|
||
}
|
||
weights["left"] = 0;
|
||
weights["right"] = (1 - self.leanAmount) * 20;
|
||
if ( weights["right"] > 1 )
|
||
{
|
||
weights["right"] = 1;
|
||
}
|
||
else if ( weights["right"] < 0 )
|
||
{
|
||
weights["right"] = 0;
|
||
}
|
||
weights["center"] = 1 - weights["right"];
|
||
}
|
||
else if ( self.leanAmount < 0 )
|
||
{
|
||
if ( self.leanAmount > -0.95 )
|
||
{
|
||
self.leanAmount = -0.95;
|
||
}
|
||
weights["right"] = 0;
|
||
weights["left"] = (1 + self.leanAmount) * 20;
|
||
if ( weights["left"] > 1 )
|
||
{
|
||
weights["left"] = 1;
|
||
}
|
||
if ( weights["left"] < 0 )
|
||
{
|
||
weights["left"] = 0;
|
||
}
|
||
weights["center"] = 1 - weights["left"];
|
||
}
|
||
else
|
||
{
|
||
weights["left"] = 0;
|
||
weights["right"] = 0;
|
||
weights["center"] = 1;
|
||
}
|
||
return weights;
|
||
}
|
||
need_to_run()
|
||
{
|
||
run_dist_squared = 384 * 384;
|
||
if ( GetDvar( "scr_dog_run_distance" ) != "" )
|
||
{
|
||
dist = GetDvarInt( "scr_dog_run_distance" );
|
||
run_dist_squared = dist * dist;
|
||
}
|
||
run_yaw = 20;
|
||
run_pitch = 30;
|
||
run_height = 64;
|
||
if ( self.a.movement != "walk" )
|
||
{
|
||
return false;
|
||
}
|
||
if ( self.health < self.maxhealth )
|
||
{
|
||
return true;
|
||
}
|
||
if ( !IsDefined( self.enemy ) || !IsAlive( self.enemy ) )
|
||
{
|
||
return false;
|
||
}
|
||
if ( !self CanSee( self.enemy ) )
|
||
{
|
||
return false;
|
||
}
|
||
dist = DistanceSquared( self.origin, self.enemy.origin );
|
||
if ( dist > run_dist_squared )
|
||
{
|
||
return false;
|
||
}
|
||
height = self.origin[2] - self.enemy.origin[2];
|
||
if ( abs( height ) > run_height )
|
||
{
|
||
return false;
|
||
}
|
||
yaw = self AbsYawToEnemy();
|
||
if ( yaw > run_yaw )
|
||
{
|
||
return false;
|
||
}
|
||
pitch = AngleClamp180( VectorToAngles( self.origin - self.enemy.origin )[0] );
|
||
if ( abs( pitch ) > run_pitch )
|
||
{
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|