Files
Recompilable-gscs-for-BO2-z…/patch_zm/maps/mp/animscripts/zm_move.gsc

287 lines
5.5 KiB
Plaintext

#include maps/mp/animscripts/zm_shared;
#include maps/mp/animscripts/zm_run;
#include maps/mp/animscripts/zm_utility;
#include maps/mp/animscripts/utility;
#include maps/mp/animscripts/shared;
#include common_scripts/utility;
main()
{
self endon( "killanimscript" );
self setaimanimweights( 0, 0 );
previousscript = self.a.script;
maps/mp/animscripts/zm_utility::initialize( "zombie_move" );
movemainloop();
}
movemainloop()
{
self endon( "killanimscript" );
self endon( "stop_soon" );
self.needs_run_update = 1;
self notify( "needs_run_update" );
self sidestepinit();
self thread trysidestepthread();
for ( ;; )
{
self maps/mp/animscripts/zm_run::moverun();
if ( isDefined( self.zombie_can_sidestep ) && self.zombie_can_sidestep )
{
self trysidestep();
}
}
}
sidestepinit()
{
self.a.steppeddir = 0;
self.a.lastsidesteptime = getTime();
}
trysidestepthread()
{
self endon( "death" );
self notify( "new_trySideStepThread" );
self endon( "new_trySideStepThread" );
if ( !isDefined( self.zombie_can_sidestep ) )
{
return 0;
}
if ( isDefined( self.zombie_can_sidestep ) && !self.zombie_can_sidestep )
{
return 0;
}
while ( 1 )
{
self trysidestep();
wait 0,05;
}
}
trysidestep()
{
if ( isDefined( self.shouldsidestepfunc ) )
{
self.sidesteptype = self [[ self.shouldsidestepfunc ]]();
}
else
{
self.sidesteptype = shouldsidestep();
}
if ( self.sidesteptype == "none" )
{
if ( isDefined( self.zombie_can_forwardstep ) && self.zombie_can_forwardstep )
{
self.sidesteptype = shouldforwardstep();
}
}
if ( self.sidesteptype == "none" )
{
return 0;
}
self.desiredstepdir = getdesiredsidestepdir( self.sidesteptype );
self.asd_name = "zm_" + self.sidesteptype + "_" + self.desiredstepdir;
self.substate_index = self getanimsubstatefromasd( self.asd_name );
self.stepanim = self getanimfromasd( self.asd_name, self.substate_index );
if ( !self checkroomforanim( self.stepanim ) )
{
return 0;
}
self.allowpain = 0;
self animcustom( ::dosidestep );
self waittill( "sidestep_done" );
self.allowpain = 1;
}
getdesiredsidestepdir( sidesteptype )
{
if ( sidesteptype == "roll" || sidesteptype == "phase" )
{
self.desiredstepdir = "forward";
return self.desiredstepdir;
}
/#
assert( sidesteptype == "step", "Unsupported SideStepType" );
#/
randomroll = randomfloat( 1 );
if ( self.a.steppeddir < 0 )
{
self.desiredstepdir = "right";
}
else if ( self.a.steppeddir > 0 )
{
self.desiredstepdir = "left";
}
else if ( randomroll < 0,5 )
{
self.desiredstepdir = "right";
}
else
{
self.desiredstepdir = "left";
}
return self.desiredstepdir;
}
checkroomforanim( stepanim )
{
if ( !self maymovefrompointtopoint( self.origin, getanimendpos( stepanim ) ) )
{
return 0;
}
return 1;
}
shouldsidestep()
{
if ( cansidestep() && isplayer( self.enemy ) && self.enemy islookingat( self ) )
{
if ( self.zombie_move_speed != "sprint" || randomfloat( 1 ) < 0,7 )
{
return "step";
}
else
{
return "roll";
}
}
return "none";
}
cansidestep()
{
if ( !isDefined( self.zombie_can_sidestep ) || !self.zombie_can_sidestep )
{
return 0;
}
if ( ( getTime() - self.a.lastsidesteptime ) < 2000 )
{
return 0;
}
if ( !isDefined( self.enemy ) )
{
return 0;
}
if ( self.a.pose != "stand" )
{
return 0;
}
distsqfromenemy = distancesquared( self.origin, self.enemy.origin );
if ( distsqfromenemy < 4096 )
{
return 0;
}
if ( distsqfromenemy > 1000000 )
{
return 0;
}
if ( !isDefined( self.pathgoalpos ) || distancesquared( self.origin, self.pathgoalpos ) < 4096 )
{
return 0;
}
if ( abs( self getmotionangle() ) > 15 )
{
return 0;
}
yaw = getyawtoorigin( self.enemy.origin );
if ( abs( yaw ) > 45 )
{
return 0;
}
return 1;
}
shouldforwardstep()
{
if ( canforwardstep() && isplayer( self.enemy ) )
{
return "phase";
}
return "none";
}
canforwardstep()
{
if ( isDefined( self.a.lastsidesteptime ) && ( getTime() - self.a.lastsidesteptime ) < 2000 )
{
return 0;
}
if ( !isDefined( self.enemy ) )
{
return 0;
}
if ( self.a.pose != "stand" )
{
return 0;
}
distsqfromenemy = distancesquared( self.origin, self.enemy.origin );
if ( distsqfromenemy < 14400 )
{
return 0;
}
if ( distsqfromenemy > 5760000 )
{
return 0;
}
if ( !isDefined( self.pathgoalpos ) || distancesquared( self.origin, self.pathgoalpos ) < 4096 )
{
return 0;
}
if ( abs( self getmotionangle() ) > 15 )
{
return 0;
}
yaw = getyawtoorigin( self.enemy.origin );
if ( abs( yaw ) > 45 )
{
return 0;
}
return 1;
}
dosidestep()
{
self endon( "death" );
self endon( "killanimscript" );
self playsidestepanim( self.stepanim, self.sidesteptype );
if ( self.desiredstepdir == "left" )
{
self.a.steppeddir--;
}
else
{
self.a.steppeddir++;
}
self.a.lastsidesteptime = getTime();
self notify( "sidestep_done" );
}
playsidestepanim( stepanim, sidesteptype )
{
self animmode( "gravity", 0 );
self orientmode( "face angle", self.angles[ 1 ] );
runblendouttime = 0,2;
if ( isDefined( self.sidestepfunc ) )
{
self thread [[ self.sidestepfunc ]]( "step_anim", stepanim );
}
self setanimstatefromasd( self.asd_name, self.substate_index );
maps/mp/animscripts/zm_shared::donotetracks( "step_anim" );
if ( isalive( self ) )
{
self thread facelookaheadforabit();
}
}
facelookaheadforabit()
{
self endon( "death" );
self endon( "killanimscript" );
lookaheadangles = vectorToAngle( self.lookaheaddir );
self orientmode( "face angle", lookaheadangles[ 1 ] );
wait 0,2;
self animmode( "normal", 0 );
self orientmode( "face default" );
}