mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-10 10:47:58 -05:00
287 lines
5.5 KiB
Plaintext
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" );
|
|
}
|