mirror of
https://github.com/reaaLx/nx1-gsc-dump.git
synced 2025-04-22 00:55:46 +00:00
305 lines
7.4 KiB
Plaintext
305 lines
7.4 KiB
Plaintext
#include animscripts\utility;
|
|
#include animscripts\combat_utility;
|
|
#include animscripts\shared;
|
|
#include common_scripts\utility;
|
|
#using_animtree( "generic_human" );
|
|
|
|
MoveCQB()
|
|
{
|
|
animscripts\run::changeWeaponStandRun();
|
|
|
|
// any endons in this function must also be in CQBShootWhileMoving and CQBDecideWhatAndHowToShoot
|
|
|
|
if ( self.a.pose != "stand" )
|
|
{
|
|
// (get rid of any prone or other stuff that might be going on)
|
|
self clearAnim( %root, 0.2 );
|
|
if ( self.a.pose == "prone" )
|
|
self ExitProneWrapper( 1 );
|
|
self.a.pose = "stand";
|
|
}
|
|
self.a.movement = self.moveMode;
|
|
|
|
//self clearanim(%combatrun, 0.2);
|
|
|
|
self thread CQBTracking();
|
|
|
|
cqbWalkAnim = DetermineCQBAnim();
|
|
|
|
rate = self.moveplaybackrate;
|
|
|
|
if ( self.moveMode == "walk" )
|
|
rate *= 0.6;
|
|
|
|
transTime = get_cqb_blend_in_time();
|
|
|
|
// (we don't use %body because that would reset the aiming knobs)
|
|
self setFlaggedAnimKnobAll( "runanim", cqbWalkAnim, %walk_and_run_loops, 1, transTime, rate, true );
|
|
self set_move_anim_start_point();
|
|
self animscripts\run::SetMoveNonForwardAnims( GetCQBAnim("move_b"), GetCQBAnim("move_l"), GetCQBAnim("move_r") );
|
|
self thread animscripts\run::SetCombatStandMoveAnimWeights( "cqb" );
|
|
|
|
animscripts\shared::DoNoteTracksForTime( 0.2, "runanim" );
|
|
|
|
self thread animscripts\run::stopShootWhileMovingThreads();
|
|
}
|
|
|
|
DetermineCQBAnim()
|
|
{
|
|
//TagCC<NOTE>: This is rather fail. the self.MoveMode that GetRunAnim uses is used to set the anim are always run
|
|
//so effectively this line says that if a custom cqb animset is defined, don't use it, or even the normal cqb anims,
|
|
//but instead use the run anim set. Great. No one noticed this bug because cqb isn't ever overridden where run isn't
|
|
//also overriden to the same thing in mw2 (see riotshield).
|
|
//if ( isdefined( self.customMoveAnimSet ) && isdefined( self.customMoveAnimSet[ "cqb" ] ) )
|
|
// return animscripts\run::GetRunAnim();
|
|
|
|
if ( self.stairsState == "up" )
|
|
{
|
|
return GetCQBAnim( "stairs_up" );
|
|
}
|
|
|
|
if ( self.stairsState == "down" )
|
|
{
|
|
return GetCQBAnim( "stairs_down" );
|
|
}
|
|
|
|
if ( self.movemode == "walk" )
|
|
{
|
|
return GetCQBAnim( "move_f" );
|
|
}
|
|
|
|
variation = getRandomIntFromSeed( self.a.runLoopCount, 2 );
|
|
if ( variation == 0 )
|
|
{
|
|
return GetCQBAnim( "straight" );
|
|
}
|
|
|
|
return GetCQBAnim( "straight_variation" );
|
|
}
|
|
|
|
get_cqb_blend_in_time()
|
|
{
|
|
transTime = 0.1;
|
|
if ( self.stairsState == "none" )
|
|
{
|
|
transTime = 0.3;
|
|
//tagCC<NOTE>:for debugging, lets allow for this to be tweaked in script. remove at some point.
|
|
if( self.subclass == "moon" )
|
|
{
|
|
transTime = 0.8;
|
|
|
|
if( IsDefined( self.cqb_blend_finish_time ) )
|
|
{
|
|
transTime = self.cqb_blend_finish_time;
|
|
self.cqb_blend_finish_time = undefined;
|
|
}
|
|
|
|
run_blend_str = GetDvar("scr_run_blend");
|
|
if( run_blend_str != "" )
|
|
{
|
|
transTime = Float( run_blend_str );
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
transTime = 0.1; // need to transition to stairs quickly
|
|
}
|
|
|
|
return transTime;
|
|
}
|
|
|
|
GetCQBAnim( anim_name )
|
|
{
|
|
if ( IsDefined( self.customMoveAnimSet ) && IsDefined( self.customMoveAnimSet[ "cqb" ] ) && IsDefined( self.customMoveAnimSet[ "cqb" ][anim_name] ) )
|
|
{
|
|
return self.customMoveAnimSet[ "cqb" ][ anim_name ];
|
|
}
|
|
else
|
|
{
|
|
return anim.animsets.move[ "cqb" ][ anim_name ];
|
|
}
|
|
}
|
|
|
|
CQBTracking()
|
|
{
|
|
assert( isdefined( self.aim_while_moving_thread ) == isdefined( self.trackLoopThread ) );
|
|
assertex( !isdefined( self.trackLoopThread ) || (self.trackLoopThreadType == "faceEnemyAimTracking"), self.trackLoopThreadType );
|
|
|
|
if ( animscripts\move::MayShootWhileMoving() )
|
|
animscripts\run::runShootWhileMovingThreads();
|
|
|
|
animscripts\run::faceEnemyAimTracking();
|
|
}
|
|
|
|
setupCQBPointsOfInterest()
|
|
{
|
|
level._cqbPointsOfInterest = [];
|
|
pointents = getEntArray( "cqb_point_of_interest", "targetname" );
|
|
for ( i = 0; i < pointents.size; i++ )
|
|
{
|
|
level._cqbPointsOfInterest[ i ] = pointents[ i ].origin;
|
|
pointents[ i ] delete();
|
|
}
|
|
}
|
|
|
|
findCQBPointsOfInterest()
|
|
{
|
|
if ( isdefined( anim.findingCQBPointsOfInterest ) )
|
|
return;
|
|
anim.findingCQBPointsOfInterest = true;
|
|
|
|
// one AI per frame, find best point of interest.
|
|
if ( !level._cqbPointsOfInterest.size )
|
|
return;
|
|
|
|
while ( 1 )
|
|
{
|
|
ai = getaiarray();
|
|
waited = false;
|
|
foreach( guy in ai )
|
|
{
|
|
if ( isAlive( guy ) && guy isCQBWalking() )
|
|
{
|
|
moving = ( guy.a.movement != "stop" );
|
|
|
|
// if you change this, change the debug function below too
|
|
|
|
shootAtPos = (guy.origin[0], guy.origin[1], guy getShootAtPos()[2]);
|
|
lookAheadPoint = shootAtPos;
|
|
forward = anglesToForward( guy.angles );
|
|
if ( moving )
|
|
{
|
|
trace = bulletTrace( lookAheadPoint, lookAheadPoint + forward * 128, false, undefined );
|
|
lookAheadPoint = trace[ "position" ];
|
|
}
|
|
|
|
best = -1;
|
|
bestdist = 1024 * 1024;
|
|
for ( j = 0; j < level._cqbPointsOfInterest.size; j++ )
|
|
{
|
|
point = level._cqbPointsOfInterest[ j ];
|
|
|
|
dist = distanceSquared( point, lookAheadPoint );
|
|
if ( dist < bestdist )
|
|
{
|
|
if ( moving )
|
|
{
|
|
if ( distanceSquared( point, shootAtPos ) < 64 * 64 )
|
|
continue;
|
|
dot = vectorDot( vectorNormalize( point - shootAtPos ), forward );
|
|
if ( dot < 0.643 || dot > 0.966 )// 0.643 = cos( 50 ), 0.966 = cos( 15 )
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
if ( dist < 50 * 50 )
|
|
continue;
|
|
}
|
|
|
|
if ( !sightTracePassed( lookAheadPoint, point, false, undefined ) )
|
|
continue;
|
|
|
|
bestdist = dist;
|
|
best = j;
|
|
}
|
|
}
|
|
|
|
if ( best < 0 )
|
|
guy.cqb_point_of_interest = undefined;
|
|
else
|
|
guy.cqb_point_of_interest = level._cqbPointsOfInterest[ best ];
|
|
|
|
wait .05;
|
|
waited = true;
|
|
}
|
|
}
|
|
if ( !waited )
|
|
wait .25;
|
|
}
|
|
}
|
|
|
|
/#
|
|
CQBDebug()
|
|
{
|
|
self notify( "end_cqb_debug" );
|
|
self endon( "end_cqb_debug" );
|
|
self endon( "death" );
|
|
|
|
setDvarIfUninitialized( "scr_cqbdebug", "off" );
|
|
|
|
level thread CQBDebugGlobal();
|
|
|
|
while ( 1 )
|
|
{
|
|
if ( getdebugdvar( "scr_cqbdebug" ) == "on" || getdebugdvarint( "scr_cqbdebug" ) == self getentnum() )
|
|
{
|
|
shootAtPos = (self.origin[0], self.origin[1], self getShootAtPos()[2]);
|
|
if ( isdefined( self.shootPos ) )
|
|
{
|
|
line( shootAtPos, self.shootPos, ( 1, 1, 1 ) );
|
|
print3d( self.shootPos, "shootPos", ( 1, 1, 1 ), 1, 0.5 );
|
|
}
|
|
else if ( isdefined( self.cqb_target ) )
|
|
{
|
|
line( shootAtPos, self.cqb_target.origin, ( .5, 1, .5 ) );
|
|
print3d( self.cqb_target.origin, "cqb_target", ( .5, 1, .5 ), 1, 0.5 );
|
|
}
|
|
else
|
|
{
|
|
moving = ( self.a.movement != "stop" );
|
|
|
|
forward = anglesToForward( self.angles );
|
|
lookAheadPoint = shootAtPos;
|
|
if ( moving )
|
|
{
|
|
lookAheadPoint += forward * 128;
|
|
line( shootAtPos, lookAheadPoint, ( 0.7, .5, .5 ) );
|
|
|
|
right = anglesToRight( self.angles );
|
|
leftScanArea = shootAtPos + ( forward * 0.643 - right ) * 64;
|
|
rightScanArea = shootAtPos + ( forward * 0.643 + right ) * 64;
|
|
line( shootAtPos, leftScanArea, ( 0.5, 0.5, 0.5 ), 0.7 );
|
|
line( shootAtPos, rightScanArea, ( 0.5, 0.5, 0.5 ), 0.7 );
|
|
}
|
|
|
|
if ( isdefined( self.cqb_point_of_interest ) )
|
|
{
|
|
line( lookAheadPoint, self.cqb_point_of_interest, ( 1, .5, .5 ) );
|
|
print3d( self.cqb_point_of_interest, "cqb_point_of_interest", ( 1, .5, .5 ), 1, 0.5 );
|
|
}
|
|
}
|
|
|
|
wait .05;
|
|
continue;
|
|
}
|
|
|
|
wait 1;
|
|
}
|
|
}
|
|
|
|
CQBDebugGlobal()
|
|
{
|
|
if ( isdefined( level._cqbdebugglobal ) )
|
|
return;
|
|
level._cqbdebugglobal = true;
|
|
|
|
while ( 1 )
|
|
{
|
|
if ( getdebugdvar( "scr_cqbdebug" ) != "on" )
|
|
{
|
|
wait 1;
|
|
continue;
|
|
}
|
|
|
|
for ( i = 0; i < level._cqbPointsOfInterest.size; i++ )
|
|
{
|
|
print3d( level._cqbPointsOfInterest[ i ], ".", ( .7, .7, 1 ), .7, 3 );
|
|
}
|
|
|
|
wait .05;
|
|
}
|
|
}
|
|
#/
|
|
|