mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-10 10:47:58 -05:00
307 lines
6.5 KiB
Plaintext
307 lines
6.5 KiB
Plaintext
#include maps/mp/_utility;
|
|
#include maps/mp/animscripts/utility;
|
|
#include common_scripts/utility;
|
|
|
|
handledogsoundnotetracks( note )
|
|
{
|
|
if ( note == "sound_dogstep_run_default" )
|
|
{
|
|
return 1;
|
|
}
|
|
prefix = getsubstr( note, 0, 5 );
|
|
if ( prefix != "sound" )
|
|
{
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
growling()
|
|
{
|
|
return isDefined( self.script_growl );
|
|
}
|
|
|
|
handlenotetrack( note, flagname, customfunction, var1 )
|
|
{
|
|
/#
|
|
if ( getDvarInt( #"6EBEB982" ) )
|
|
{
|
|
println( "dog notetrack: " + flagname + " " + note + " " + getTime() );
|
|
#/
|
|
}
|
|
if ( isai( self ) && self.type == "dog" )
|
|
{
|
|
if ( handledogsoundnotetracks( note ) )
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
switch( note )
|
|
{
|
|
case "end":
|
|
case "finish":
|
|
case "undefined":
|
|
return note;
|
|
default:
|
|
if ( isDefined( customfunction ) )
|
|
{
|
|
if ( !isDefined( var1 ) )
|
|
{
|
|
return [[ customfunction ]]( note );
|
|
}
|
|
else
|
|
{
|
|
return [[ customfunction ]]( note, var1 );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
donotetracks( flagname, customfunction, var1 )
|
|
{
|
|
for ( ;; )
|
|
{
|
|
self waittill( flagname, note );
|
|
if ( !isDefined( note ) )
|
|
{
|
|
note = "undefined";
|
|
}
|
|
val = self handlenotetrack( note, flagname, customfunction, var1 );
|
|
if ( isDefined( val ) )
|
|
{
|
|
return val;
|
|
}
|
|
}
|
|
}
|
|
|
|
donotetracksforeverproc( notetracksfunc, flagname, killstring, customfunction, var1 )
|
|
{
|
|
if ( isDefined( killstring ) )
|
|
{
|
|
self endon( killstring );
|
|
}
|
|
self endon( "killanimscript" );
|
|
for ( ;; )
|
|
{
|
|
time = getTime();
|
|
returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 );
|
|
timetaken = getTime() - time;
|
|
if ( timetaken < 0,05 )
|
|
{
|
|
time = getTime();
|
|
returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 );
|
|
timetaken = getTime() - time;
|
|
if ( timetaken < 0,05 )
|
|
{
|
|
/#
|
|
println( getTime() + " mapsmpanimscriptsshared::DoNoteTracksForever is trying to cause an infinite loop on anim " + flagname + ", returned " + returnednote + "." );
|
|
#/
|
|
wait ( 0,05 - timetaken );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
donotetracksforever( flagname, killstring, customfunction, var1 )
|
|
{
|
|
donotetracksforeverproc( ::donotetracks, flagname, killstring, customfunction, var1 );
|
|
}
|
|
|
|
donotetracksfortimeproc( donotetracksforeverfunc, time, flagname, customfunction, ent, var1 )
|
|
{
|
|
ent endon( "stop_notetracks" );
|
|
[[ donotetracksforeverfunc ]]( flagname, undefined, customfunction, var1 );
|
|
}
|
|
|
|
donotetracksfortime( time, flagname, customfunction, var1 )
|
|
{
|
|
ent = spawnstruct();
|
|
ent thread donotetracksfortimeendnotify( time );
|
|
donotetracksfortimeproc( ::donotetracksforever, time, flagname, customfunction, ent, var1 );
|
|
}
|
|
|
|
donotetracksfortimeendnotify( time )
|
|
{
|
|
wait time;
|
|
self notify( "stop_notetracks" );
|
|
}
|
|
|
|
trackloop()
|
|
{
|
|
players = get_players();
|
|
deltachangeperframe = 5;
|
|
aimblendtime = 0,05;
|
|
prevyawdelta = 0;
|
|
prevpitchdelta = 0;
|
|
maxyawdeltachange = 5;
|
|
maxpitchdeltachange = 5;
|
|
pitchadd = 0;
|
|
yawadd = 0;
|
|
if ( self.type != "dog" || self.type == "zombie" && self.type == "zombie_dog" )
|
|
{
|
|
domaxanglecheck = 0;
|
|
self.shootent = self.enemy;
|
|
}
|
|
else
|
|
{
|
|
domaxanglecheck = 1;
|
|
if ( self.a.script == "cover_crouch" && isDefined( self.a.covermode ) && self.a.covermode == "lean" )
|
|
{
|
|
pitchadd = -1 * anim.covercrouchleanpitch;
|
|
}
|
|
if ( self.a.script != "cover_left" && self.a.script == "cover_right" && isDefined( self.a.cornermode ) && self.a.cornermode == "lean" )
|
|
{
|
|
yawadd = self.covernode.angles[ 1 ] - self.angles[ 1 ];
|
|
}
|
|
}
|
|
yawdelta = 0;
|
|
pitchdelta = 0;
|
|
firstframe = 1;
|
|
for ( ;; )
|
|
{
|
|
incranimaimweight();
|
|
selfshootatpos = ( self.origin[ 0 ], self.origin[ 1 ], self geteye()[ 2 ] );
|
|
shootpos = undefined;
|
|
if ( isDefined( self.enemy ) )
|
|
{
|
|
shootpos = self.enemy getshootatpos();
|
|
}
|
|
if ( !isDefined( shootpos ) )
|
|
{
|
|
yawdelta = 0;
|
|
pitchdelta = 0;
|
|
}
|
|
else
|
|
{
|
|
vectortoshootpos = shootpos - selfshootatpos;
|
|
anglestoshootpos = vectorToAngle( vectortoshootpos );
|
|
pitchdelta = 360 - anglestoshootpos[ 0 ];
|
|
pitchdelta = angleClamp180( pitchdelta + pitchadd );
|
|
yawdelta = self.angles[ 1 ] - anglestoshootpos[ 1 ];
|
|
yawdelta = angleClamp180( yawdelta + yawadd );
|
|
}
|
|
if ( domaxanglecheck || abs( yawdelta ) > 60 && abs( pitchdelta ) > 60 )
|
|
{
|
|
yawdelta = 0;
|
|
pitchdelta = 0;
|
|
}
|
|
else
|
|
{
|
|
if ( yawdelta > self.rightaimlimit )
|
|
{
|
|
yawdelta = self.rightaimlimit;
|
|
}
|
|
else
|
|
{
|
|
if ( yawdelta < self.leftaimlimit )
|
|
{
|
|
yawdelta = self.leftaimlimit;
|
|
}
|
|
}
|
|
if ( pitchdelta > self.upaimlimit )
|
|
{
|
|
pitchdelta = self.upaimlimit;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if ( pitchdelta < self.downaimlimit )
|
|
{
|
|
pitchdelta = self.downaimlimit;
|
|
}
|
|
}
|
|
}
|
|
if ( firstframe )
|
|
{
|
|
firstframe = 0;
|
|
}
|
|
else
|
|
{
|
|
yawdeltachange = yawdelta - prevyawdelta;
|
|
if ( abs( yawdeltachange ) > maxyawdeltachange )
|
|
{
|
|
yawdelta = prevyawdelta + ( maxyawdeltachange * sign( yawdeltachange ) );
|
|
}
|
|
pitchdeltachange = pitchdelta - prevpitchdelta;
|
|
if ( abs( pitchdeltachange ) > maxpitchdeltachange )
|
|
{
|
|
pitchdelta = prevpitchdelta + ( maxpitchdeltachange * sign( pitchdeltachange ) );
|
|
}
|
|
}
|
|
prevyawdelta = yawdelta;
|
|
prevpitchdelta = pitchdelta;
|
|
updown = 0;
|
|
leftright = 0;
|
|
if ( yawdelta > 0 )
|
|
{
|
|
/#
|
|
assert( yawdelta <= self.rightaimlimit );
|
|
#/
|
|
weight = ( yawdelta / self.rightaimlimit ) * self.a.aimweight;
|
|
leftright = weight;
|
|
}
|
|
else
|
|
{
|
|
if ( yawdelta < 0 )
|
|
{
|
|
/#
|
|
assert( yawdelta >= self.leftaimlimit );
|
|
#/
|
|
weight = ( yawdelta / self.leftaimlimit ) * self.a.aimweight;
|
|
leftright = -1 * weight;
|
|
}
|
|
}
|
|
if ( pitchdelta > 0 )
|
|
{
|
|
/#
|
|
assert( pitchdelta <= self.upaimlimit );
|
|
#/
|
|
weight = ( pitchdelta / self.upaimlimit ) * self.a.aimweight;
|
|
updown = weight;
|
|
}
|
|
else
|
|
{
|
|
if ( pitchdelta < 0 )
|
|
{
|
|
/#
|
|
assert( pitchdelta >= self.downaimlimit );
|
|
#/
|
|
weight = ( pitchdelta / self.downaimlimit ) * self.a.aimweight;
|
|
updown = -1 * weight;
|
|
}
|
|
}
|
|
self setaimanimweights( updown, leftright );
|
|
wait 0,05;
|
|
}
|
|
}
|
|
|
|
setanimaimweight( goalweight, goaltime )
|
|
{
|
|
if ( !isDefined( goaltime ) || goaltime <= 0 )
|
|
{
|
|
self.a.aimweight = goalweight;
|
|
self.a.aimweight_start = goalweight;
|
|
self.a.aimweight_end = goalweight;
|
|
self.a.aimweight_transframes = 0;
|
|
}
|
|
else
|
|
{
|
|
self.a.aimweight = goalweight;
|
|
self.a.aimweight_start = self.a.aimweight;
|
|
self.a.aimweight_end = goalweight;
|
|
self.a.aimweight_transframes = int( goaltime * 20 );
|
|
}
|
|
self.a.aimweight_t = 0;
|
|
}
|
|
|
|
incranimaimweight()
|
|
{
|
|
if ( self.a.aimweight_t < self.a.aimweight_transframes )
|
|
{
|
|
self.a.aimweight_t++;
|
|
t = ( 1 * self.a.aimweight_t ) / self.a.aimweight_transframes;
|
|
self.a.aimweight = ( self.a.aimweight_start * ( 1 - t ) ) + ( self.a.aimweight_end * t );
|
|
}
|
|
}
|