mirror of
https://github.com/InfinityLoader/IL-GSC.git
synced 2025-06-22 07:57:51 -05:00
Added BO1 ZM rawfiles
This commit is contained in:
BIN
BO1/PC/ZM/animscripts/anims.gsc
Normal file
BIN
BO1/PC/ZM/animscripts/anims.gsc
Normal file
Binary file not shown.
1405
BO1/PC/ZM/animscripts/battlechatter.gsc
Normal file
1405
BO1/PC/ZM/animscripts/battlechatter.gsc
Normal file
File diff suppressed because it is too large
Load Diff
BIN
BO1/PC/ZM/animscripts/battlechatter_ai.gsc
Normal file
BIN
BO1/PC/ZM/animscripts/battlechatter_ai.gsc
Normal file
Binary file not shown.
1519
BO1/PC/ZM/animscripts/combat_utility.gsc
Normal file
1519
BO1/PC/ZM/animscripts/combat_utility.gsc
Normal file
File diff suppressed because it is too large
Load Diff
2057
BO1/PC/ZM/animscripts/death.gsc
Normal file
2057
BO1/PC/ZM/animscripts/death.gsc
Normal file
File diff suppressed because it is too large
Load Diff
BIN
BO1/PC/ZM/animscripts/debug.gsc
Normal file
BIN
BO1/PC/ZM/animscripts/debug.gsc
Normal file
Binary file not shown.
BIN
BO1/PC/ZM/animscripts/face.gsc
Normal file
BIN
BO1/PC/ZM/animscripts/face.gsc
Normal file
Binary file not shown.
513
BO1/PC/ZM/animscripts/melee.gsc
Normal file
513
BO1/PC/ZM/animscripts/melee.gsc
Normal file
@ -0,0 +1,513 @@
|
||||
#include maps\_utility;
|
||||
#include animscripts\Utility;
|
||||
#include animscripts\SetPoseMovement;
|
||||
#include animscripts\Combat_Utility;
|
||||
#include animscripts\Debug;
|
||||
#include animscripts\anims;
|
||||
#include common_scripts\Utility;
|
||||
#using_animtree ("generic_human");
|
||||
MeleeCombat()
|
||||
{
|
||||
self endon("killanimscript");
|
||||
self melee_notify_wrapper();
|
||||
assert( CanMeleeAnyRange() );
|
||||
if(IsDefined(level.allow_ai_vs_ai_melee ))
|
||||
{
|
||||
doingAIMelee = (isAI( self.enemy ) && self.enemy.type == "human");
|
||||
}
|
||||
else
|
||||
{
|
||||
doingAIMelee = false;
|
||||
}
|
||||
if ( doingAiMelee )
|
||||
{
|
||||
assert( animscripts\utility::okToMelee( self.enemy ) );
|
||||
animscripts\utility::IAmMeleeing( self.enemy );
|
||||
AiVsAiMeleeCombat();
|
||||
animscripts\utility::ImNotMeleeing( self.enemy );
|
||||
scriptChange();
|
||||
return;
|
||||
}
|
||||
realMelee = true;
|
||||
if ( animscripts\utility::okToMelee(self.enemy) )
|
||||
{
|
||||
animscripts\utility::IAmMeleeing(self.enemy);
|
||||
}
|
||||
else
|
||||
{
|
||||
realMelee = false;
|
||||
}
|
||||
self thread EyesAtEnemy();
|
||||
self OrientMode("face enemy");
|
||||
MeleeDebugPrint("Melee begin");
|
||||
self AnimMode( "zonly_physics" );
|
||||
resetGiveUpTime();
|
||||
first_time = true;
|
||||
for ( ;; )
|
||||
{
|
||||
if ( !PrepareToMelee(first_time) )
|
||||
{
|
||||
self.lastMeleeGiveUpTime = GetTime();
|
||||
break;
|
||||
}
|
||||
first_time = false;
|
||||
assert( self.a.pose == "stand");
|
||||
MeleeDebugPrint("Melee main loop" + RandomInt(100));
|
||||
if ( !realMelee && animscripts\utility::okToMelee(self.enemy) )
|
||||
{
|
||||
realMelee = true;
|
||||
animscripts\utility::IAmMeleeing(self.enemy);
|
||||
}
|
||||
self thread EyesAtEnemy();
|
||||
self OrientMode("face current");
|
||||
if ( self maps\_bayonet::has_bayonet() && RandomInt( 100 ) < 0 )
|
||||
{
|
||||
self SetFlaggedAnimKnobAllRestart("meleeanim", animArray("bayonet"), %body, 1, .2, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
self SetFlaggedAnimKnobAllRestart("meleeanim", animArray("melee"), %body, 1, .2, 1);
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill("meleeanim", note);
|
||||
if ( note == "end" )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if ( note == "fire" )
|
||||
{
|
||||
if ( !IsDefined( self.enemy ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
oldhealth = self.enemy.health;
|
||||
self melee();
|
||||
if ( self.enemy.health < oldhealth )
|
||||
{
|
||||
resetGiveUpTime();
|
||||
}
|
||||
}
|
||||
else if ( note == "stop" )
|
||||
{
|
||||
if ( !CanContinueToMelee() )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
self OrientMode("face default");
|
||||
}
|
||||
if (realMelee)
|
||||
{
|
||||
animscripts\utility::ImNotMeleeing(self.enemy);
|
||||
}
|
||||
self AnimMode("none");
|
||||
self thread backToCombat();
|
||||
}
|
||||
backToCombat()
|
||||
{
|
||||
self notify("killanimscript");
|
||||
waittillframeend;
|
||||
self thread animscripts\combat::main();
|
||||
self notify ("stop EyesAtEnemy");
|
||||
self notify ("stop_melee_debug_print");
|
||||
scriptChange();
|
||||
}
|
||||
resetGiveUpTime()
|
||||
{
|
||||
if ( DistanceSquared( self.origin, self.enemy.origin ) > anim.chargeRangeSq )
|
||||
{
|
||||
self.giveUpOnMeleeTime = GetTime() + randomintrange( 2700, 3300 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.giveUpOnMeleeTime = GetTime() + randomintrange( 1700, 2300 );
|
||||
}
|
||||
}
|
||||
MeleeDebugPrint(text)
|
||||
{
|
||||
return;
|
||||
self.meleedebugprint = text;
|
||||
self thread meleeDebugPrintThreadWrapper();
|
||||
}
|
||||
meleeDebugPrintThreadWrapper()
|
||||
{
|
||||
if ( !IsDefined(self.meleedebugthread) )
|
||||
{
|
||||
self.meleedebugthread = true;
|
||||
self meleeDebugPrintThread();
|
||||
self.meleedebugthread = undefined;
|
||||
}
|
||||
}
|
||||
meleeDebugPrintThread()
|
||||
{
|
||||
self endon("death");
|
||||
self endon("killanimscript");
|
||||
self endon("stop_melee_debug_print");
|
||||
while(1)
|
||||
{
|
||||
Print3d(self.origin + (0,0,60), self.meleedebugprint, (1,1,1), 1, .1);
|
||||
wait .05;
|
||||
}
|
||||
}
|
||||
debug_melee_on_actor()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
debug_melee( msg )
|
||||
{
|
||||
}
|
||||
debug_melee_line( start, end, color, duration )
|
||||
{
|
||||
}
|
||||
getEnemyPose()
|
||||
{
|
||||
if ( IsPlayer( self.enemy ) )
|
||||
{
|
||||
return self.enemy getStance();
|
||||
}
|
||||
else
|
||||
{
|
||||
return self.enemy.a.pose;
|
||||
}
|
||||
}
|
||||
CanContinueToMelee()
|
||||
{
|
||||
return CanMeleeInternal( "already started" );
|
||||
}
|
||||
CanMeleeAnyRange()
|
||||
{
|
||||
return CanMeleeInternal( "any range" );
|
||||
}
|
||||
CanMeleeDesperate()
|
||||
{
|
||||
return CanMeleeInternal( "long range" );
|
||||
}
|
||||
CanMelee()
|
||||
{
|
||||
return CanMeleeInternal( "normal" );
|
||||
}
|
||||
CanMeleeInternal( state )
|
||||
{
|
||||
if ( !IsSentient( self.enemy ) )
|
||||
{
|
||||
debug_melee( "Not doing melee - Does not have a valid target." );
|
||||
return false;
|
||||
}
|
||||
if (!IsAlive(self.enemy))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if ( IsDefined( self.disableMelee ) )
|
||||
{
|
||||
assert( self.disableMelee );
|
||||
debug_melee( "Not doing melee - Melee is disabled, self.disableMelee is set to true." );
|
||||
return false;
|
||||
}
|
||||
if (self.a.pose != "stand")
|
||||
{
|
||||
debug_melee( "Not doing melee - Cant melee in " + self.a.pose );
|
||||
return false;
|
||||
}
|
||||
enemypose = getEnemyPose();
|
||||
if ( !IsPlayer( self.enemy ) && enemypose != "stand" && enemypose != "crouch" )
|
||||
{
|
||||
if ( !( self is_banzai() && enemypose == "prone" ) )
|
||||
{
|
||||
debug_melee( "Not doing melee - Enemy is in prone." );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
yaw = abs(getYawToEnemy());
|
||||
if ( self.a.allow_shooting && ((yaw > 60 && state != "already started") || yaw > 110) )
|
||||
{
|
||||
debug_melee( "Not doing melee - Not facing the enemy." );
|
||||
return false;
|
||||
}
|
||||
enemyPoint = self.enemy GetOrigin();
|
||||
vecToEnemy = enemyPoint - self.origin;
|
||||
self.enemyDistanceSq = lengthSquared( vecToEnemy );
|
||||
nearest_enemy_sqrd_dist = self GetClosestEnemySqDist();
|
||||
epsilon = 0.1;
|
||||
if( IsDefined( nearest_enemy_sqrd_dist ) && ( nearest_enemy_sqrd_dist - epsilon > self.enemyDistanceSq ) )
|
||||
{
|
||||
debug_melee( "Not doing melee - Entity " + self getEntityNumber() + " can't melee entity " + self.enemy getEntityNumber() + " at distSq " + self.enemyDistanceSq + " because there is a closer enemy at distSq " + nearest_enemy_sqrd_dist + "." );
|
||||
return false;
|
||||
}
|
||||
if(IsDefined(level.allow_ai_vs_ai_melee ))
|
||||
{
|
||||
doingAIMelee = (isAI( self.enemy ) && self.enemy.type == "human");
|
||||
}
|
||||
else
|
||||
{
|
||||
doingAIMelee = false;
|
||||
}
|
||||
if ( doingAIMelee )
|
||||
{
|
||||
if ( !animscripts\utility::okToMelee(self.enemy) )
|
||||
{
|
||||
debug_melee( "Not doing melee - Enemy is already being meleed." );
|
||||
return false;
|
||||
}
|
||||
if ( IsDefined( self.magic_bullet_shield ) && self.magic_bullet_shield && IsDefined( self.enemy.magic_bullet_shield ) && self.enemy.magic_bullet_shield )
|
||||
{
|
||||
debug_melee( "Not doing melee - Enemy has magic bullet shield." );
|
||||
return false;
|
||||
}
|
||||
if ( !isMeleePathClear( vecToEnemy, enemyPoint ) )
|
||||
{
|
||||
self notify("melee_path_blocked");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( IsDefined( self.enemy.magic_bullet_shield ) && self.enemy.magic_bullet_shield )
|
||||
{
|
||||
if ( !( self is_banzai() ) )
|
||||
{
|
||||
debug_melee( "Not doing melee - Enemy has magic bullet shield." );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (self.enemyDistanceSq <= anim.meleeRangeSq)
|
||||
{
|
||||
if ( !isMeleePathClear( vecToEnemy, enemyPoint ) )
|
||||
{
|
||||
if ( !self is_banzai() )
|
||||
{
|
||||
self notify("melee_path_blocked");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else if ( self is_banzai() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if ( state != "any range" )
|
||||
{
|
||||
chargeRangeSq = anim.chargeRangeSq;
|
||||
if ( state == "long range" )
|
||||
{
|
||||
chargeRangeSq = anim.chargeLongRangeSq;
|
||||
}
|
||||
if (self.enemyDistanceSq > chargeRangeSq)
|
||||
{
|
||||
debug_melee( "Not doing melee - Enemy is not close enough to charge." );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if ( state == "already started" )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if ( ( !self is_banzai() || IsPlayer( self.enemy ) ) && self.a.allow_shooting && IsDefined( self.lastMeleeGiveUpTime ) && GetTime() - self.lastMeleeGiveUpTime < 3000 )
|
||||
{
|
||||
debug_melee( "Not doing melee - Recently meleed someone and missed." );
|
||||
return false;
|
||||
}
|
||||
if ( !animscripts\utility::okToMelee(self.enemy) )
|
||||
{
|
||||
debug_melee( "Not doing melee - Enemy is being meleed." );
|
||||
return false;
|
||||
}
|
||||
if ( self.enemy animscripts\banzai::in_banzai_attack() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if ( self animscripts\banzai::in_banzai_attack() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if( !isMeleePathClear( vecToEnemy, enemyPoint ) )
|
||||
{
|
||||
self notify("melee_path_blocked");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
isMeleePathClear( vecToEnemy, enemyPoint )
|
||||
{
|
||||
dirToEnemy = VectorNormalize( (vecToEnemy[0], vecToEnemy[1], 0 ) );
|
||||
meleePoint = enemyPoint - ( dirToEnemy[0]*32, dirToEnemy[1]*32, 0 );
|
||||
thread debug_melee_line( self.origin, meleePoint, ( 1,0,0 ), 1.5 );
|
||||
if ( !self IsInGoal( meleePoint ) )
|
||||
{
|
||||
debug_melee( "Not doing melee - Enemy is outside not in goal." );
|
||||
return false;
|
||||
}
|
||||
if ( self maymovetopoint(meleePoint) )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
debug_melee( "Not doing melee - Can not move to the melee point, MayMoveToPoint failed." );
|
||||
return false;
|
||||
}
|
||||
PrepareToMelee(first_time)
|
||||
{
|
||||
if ( !CanMeleeAnyRange() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (self.enemyDistanceSq <= anim.meleeRangeSq)
|
||||
{
|
||||
isBatonGuard = IsDefined(self.baton_guard) && self.baton_guard;
|
||||
isRegularAi = self.animType != "spetsnaz" && !isBatonGuard;
|
||||
if( first_time || isRegularAi )
|
||||
{
|
||||
self SetFlaggedAnimKnobAll("readyanim", animArray("stand_2_melee"), %body, 1, .3, 1);
|
||||
self animscripts\shared::DoNoteTracks("readyanim");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
self PlayMeleeSound();
|
||||
prevEnemyPos = self.enemy.origin;
|
||||
sampleTime = 0.1;
|
||||
runToMeleeAnim = animArray("run_2_melee");
|
||||
raiseGunAnimTravelDist = length(getmovedelta(runToMeleeAnim, 0, 1));
|
||||
meleeAnimTravelDist = 32;
|
||||
shouldRaiseGunDist = anim.meleeRange * 0.75 + meleeAnimTravelDist + raiseGunAnimTravelDist;
|
||||
shouldRaiseGunDistSq = shouldRaiseGunDist * shouldRaiseGunDist;
|
||||
shouldMeleeDist = anim.meleeRange + meleeAnimTravelDist;
|
||||
shouldMeleeDistSq = shouldMeleeDist * shouldMeleeDist;
|
||||
raiseGunFullDuration = getanimlength(runToMeleeAnim) * 1000;
|
||||
raiseGunFinishDuration = raiseGunFullDuration - 100;
|
||||
raiseGunPredictDuration = raiseGunFullDuration - 200;
|
||||
raiseGunStartTime = 0;
|
||||
predictedEnemyDistSqAfterRaiseGun = undefined;
|
||||
runAnim = animscripts\run::GetRunAnim();
|
||||
self SetFlaggedAnimKnobAll("chargeanim", runAnim, %body, 1, .3, 1);
|
||||
raisingGun = false;
|
||||
while ( 1 )
|
||||
{
|
||||
MeleeDebugPrint("PrepareToMelee loop" + RandomInt(100));
|
||||
time = GetTime();
|
||||
willBeWithinRangeWhenGunIsRaised = (IsDefined( predictedEnemyDistSqAfterRaiseGun ) && predictedEnemyDistSqAfterRaiseGun <= shouldRaiseGunDistSq);
|
||||
if ( !raisingGun )
|
||||
{
|
||||
if ( willBeWithinRangeWhenGunIsRaised )
|
||||
{
|
||||
self SetFlaggedAnimKnobAllRestart("chargeanim", runToMeleeAnim, %body, 1, .2, 1);
|
||||
raiseGunStartTime = time;
|
||||
raisingGun = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
withinRangeNow = self.enemyDistanceSq <= shouldRaiseGunDistSq;
|
||||
if ( time - raiseGunStartTime >= raiseGunFinishDuration || (!willBeWithinRangeWhenGunIsRaised && !withinRangeNow) )
|
||||
{
|
||||
self SetFlaggedAnimKnobAll("chargeanim", runAnim, %body, 1, .3, 1);
|
||||
raisingGun = false;
|
||||
}
|
||||
}
|
||||
self animscripts\shared::DoNoteTracksForTime(sampleTime, "chargeanim");
|
||||
if ( !CanMeleeAnyRange() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
assert( IsDefined( self.enemyDistanceSq ) );
|
||||
enemyVel = vector_scale( self.enemy.origin - prevEnemyPos, 1 / (GetTime() - time) );
|
||||
prevEnemyPos = self.enemy.origin;
|
||||
predictedEnemyPosAfterRaiseGun = self.enemy.origin + vector_scale( enemyVel, raiseGunPredictDuration );
|
||||
predictedEnemyDistSqAfterRaiseGun = DistanceSquared( self.origin, predictedEnemyPosAfterRaiseGun );
|
||||
if ( raisingGun && self.enemyDistanceSq <= shouldMeleeDistSq && GetTime() - raiseGunStartTime >= raiseGunFinishDuration )
|
||||
{
|
||||
break;
|
||||
}
|
||||
if ( !raisingGun && GetTime() >= self.giveUpOnMeleeTime )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
PlayMeleeSound()
|
||||
{
|
||||
if ( !IsDefined ( self.a.nextMeleeChargeSound ) )
|
||||
{
|
||||
self.a.nextMeleeChargeSound = 0;
|
||||
}
|
||||
if ( GetTime() > self.a.nextMeleeChargeSound )
|
||||
{
|
||||
self animscripts\face::SaySpecificDialogue( undefined, "chr_play_grunt_" + self.voice, 0.3 );
|
||||
self.a.nextMeleeChargeSound = GetTime() + 8000;
|
||||
}
|
||||
}
|
||||
AiVsAiMeleeCombat()
|
||||
{
|
||||
self endon("killanimscript");
|
||||
self melee_notify_wrapper();
|
||||
self OrientMode("face enemy");
|
||||
self ClearAnim( %root, 0.3 );
|
||||
IWin = ( RandomInt(10) < 8 );
|
||||
if ( IsDefined( self.magic_bullet_shield ) && self.magic_bullet_shield )
|
||||
{
|
||||
IWin = true;
|
||||
}
|
||||
if ( IsDefined( self.enemy.magic_bullet_shield ) && self.enemy.magic_bullet_shield )
|
||||
{
|
||||
IWin = false;
|
||||
}
|
||||
winAnim = animArray("ai_vs_ai_win");
|
||||
loseAnim = animArray("ai_vs_ai_lose");
|
||||
if ( IWin )
|
||||
{
|
||||
myAnim = winAnim;
|
||||
theirAnim = loseAnim;
|
||||
}
|
||||
else
|
||||
{
|
||||
myAnim = loseAnim;
|
||||
theirAnim = winAnim;
|
||||
}
|
||||
desiredDistSqrd = 72 * 72;
|
||||
self PlayMeleeSound();
|
||||
AiVsAiMeleeCharge( desiredDistSqrd );
|
||||
if ( DistanceSquared( self.origin, self.enemy.origin ) > desiredDistSqrd )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
self.meleePartner = self.enemy;
|
||||
self.enemy.meleePartner = self;
|
||||
self.enemy.meleeAnim = theirAnim;
|
||||
self.enemy animcustom( ::AiVsAiAnimCustom );
|
||||
self.meleeAnim = myAnim;
|
||||
self animcustom( ::AiVsAiAnimCustom );
|
||||
}
|
||||
AiVsAiMeleeCharge( desiredDistSqrd )
|
||||
{
|
||||
giveUpTime = GetTime() + 2500;
|
||||
self SetAnimKnobAll( animscripts\run::GetRunAnim(), %body, 1, 0.2 );
|
||||
while ( DistanceSquared( self.origin, self.enemy.origin ) > desiredDistSqrd && GetTime() < giveUpTime )
|
||||
{
|
||||
wait .05;
|
||||
}
|
||||
}
|
||||
AiVsAiAnimCustom()
|
||||
{
|
||||
self endon("killanimscript");
|
||||
self AiVsAiMeleeAnim( self.meleeAnim );
|
||||
}
|
||||
AiVsAiMeleeAnim( myAnim )
|
||||
{
|
||||
self endon("end_melee");
|
||||
self thread endMeleeOnKillanimscript();
|
||||
partnerDir = self.meleePartner.origin - self.origin;
|
||||
self OrientMode( "face angle", VectorToAngles( partnerDir )[1] );
|
||||
self AnimMode( "zonly_physics" );
|
||||
self SetFlaggedAnimKnobAllRestart( "meleeAnim", myAnim, %body, 1, 0.2 );
|
||||
self animscripts\shared::DoNoteTracks( "meleeAnim" );
|
||||
self notify("end_melee");
|
||||
}
|
||||
endMeleeOnKillanimscript()
|
||||
{
|
||||
self endon("end_melee");
|
||||
self waittill("killanimscript");
|
||||
self.meleePartner notify("end_melee");
|
||||
}
|
||||
|
BIN
BO1/PC/ZM/animscripts/mg42/crouch.gsc
Normal file
BIN
BO1/PC/ZM/animscripts/mg42/crouch.gsc
Normal file
Binary file not shown.
BIN
BO1/PC/ZM/animscripts/mg42/prone.gsc
Normal file
BIN
BO1/PC/ZM/animscripts/mg42/prone.gsc
Normal file
Binary file not shown.
540
BO1/PC/ZM/animscripts/revive.gsc
Normal file
540
BO1/PC/ZM/animscripts/revive.gsc
Normal file
@ -0,0 +1,540 @@
|
||||
#include maps\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include animscripts\Utility;
|
||||
#include animscripts\Debug;
|
||||
#include maps\_anim;
|
||||
#using_animtree ("generic_human");
|
||||
precacheReviveModels()
|
||||
{
|
||||
if ( IsDefined( level.reviveFeature ) && !level.reviveFeature )
|
||||
return;
|
||||
precacheModel( "char_rus_bandages1" );
|
||||
}
|
||||
revive_main()
|
||||
{
|
||||
anim.nextReviveSequenceTime = GetTime() + RandomIntRange(0, 20000);
|
||||
anim.nextReviveSequencePlayerTimeMin = 15000;
|
||||
anim.nextReviveSequencePlayerTimeMax = 30000;
|
||||
anim.nextReviveSequenceTimeMin = 5000;
|
||||
anim.nextReviveSequenceTimeMax = 10000;
|
||||
anim.bleederBleedOutTimeMin = 5000;
|
||||
anim.bleederBleedOutTimeMax = 10000;
|
||||
anim.reviverPingDist = 512;
|
||||
anim.reviverIgnorePlayerDistSq = 200*200;
|
||||
anim.reviveSequencePlayerVisibleDistSq = 1000*1000;
|
||||
anim.revive = [];
|
||||
anim.bleed["stand"]["fall"] = %ai_revive_wounded_onback_fall_stand;
|
||||
anim.bleed["crouch"]["fall"] = %ai_revive_wounded_onback_fall_crouch;
|
||||
anim.bleed["prone"]["fall"] = %ai_dying_crawl_2_back_revive;
|
||||
anim.bleed["bleed_loop"] = %ai_revive_wounded_onback_loop;
|
||||
anim.bleed["left"]["being_revived"] = %ai_revive_wounded_onback_left_revive;
|
||||
anim.bleed["left"]["get_up"] = %ai_revive_wounded_onback_left_get_up;
|
||||
anim.revive["left"]["reviving"] = %ai_revive_reviver_onback_left_revive;
|
||||
anim.revive["left"]["get_up"] = %ai_revive_reviver_onback_left_get_up;
|
||||
}
|
||||
revive_init()
|
||||
{
|
||||
self.a.revivedOnce = false;
|
||||
self.a.reviveMe = false;
|
||||
self.a.falling = false;
|
||||
self.a.bleeding = false;
|
||||
self.a.isReviver = false;
|
||||
self.a.isReviving = false;
|
||||
self.a.canBleed = true;
|
||||
self.a.canRevive = true;
|
||||
self.a.reviver = undefined;
|
||||
self.a.bleeder = undefined;
|
||||
self.a.oldRevivers = [];
|
||||
}
|
||||
tryGoingDown(damage, hitloc)
|
||||
{
|
||||
Assert(IsDefined(level.reviveFeature), "level.reviveFeature is not initialized.");
|
||||
if(!level.reviveFeature)
|
||||
return false;
|
||||
if(!GetDvarInt( #"scr_aiReviveFeature"))
|
||||
{
|
||||
if(!shouldReviveSequenceHappen())
|
||||
return false;
|
||||
}
|
||||
if( !IsAI( self ) || !IsAlive(self) || (self.isdog) || (self.team != "axis") || (self.a.canBleed == false) || (self.a.pose == "back") )
|
||||
return false;
|
||||
if( self.a.pose == "prone" )
|
||||
return false;
|
||||
if( IsDefined( self.a.usingTurret ) )
|
||||
return false;
|
||||
if(!GetDvarInt( #"scr_aiReviveFeature"))
|
||||
{
|
||||
friendlies = GetAIArray(self.team);
|
||||
alive_nearby_ai = get_array_of_closest( self.origin, friendlies, undefined, undefined, anim.reviverPingDist );
|
||||
if( alive_nearby_ai.size <= 2 )
|
||||
return false;
|
||||
}
|
||||
if( (self.a.isreviver == false ) && (self.a.revivedOnce == false) && (self.a.reviveMe == false) && isAIDamageFatal(damage) && !damageLocation(hitloc) )
|
||||
{
|
||||
if( !IsReviveOnSafeTerrain() )
|
||||
return false;
|
||||
Assert(IsAlive(self) == true, "AI is already dead or in extended death and cant be put down.");
|
||||
self.a.reviveMe = true;
|
||||
self thread killMeOnScriptInterrupt();
|
||||
self.health = self.health + damage + RandomIntRange(60,100);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
killMeOnScriptInterrupt()
|
||||
{
|
||||
self endon( "death" );
|
||||
self waittill( "killanimscript" );
|
||||
self waittill( "killanimscript" );
|
||||
if( self isBleeder() && IsAlive(self) )
|
||||
{
|
||||
self DoDamage( self.health + 200, self.origin );
|
||||
}
|
||||
}
|
||||
revive_strat()
|
||||
{
|
||||
self endon("death");
|
||||
self endon("killanimscript");
|
||||
self thread bleeder_bleed_to_death();
|
||||
self thread fall_down_to_bleed();
|
||||
self waittill("ready_after_revived");
|
||||
}
|
||||
reviver_selection_think(team)
|
||||
{
|
||||
self endon("death");
|
||||
self endon("revived");
|
||||
self endon("reevaluate_reviver");
|
||||
self endon("killanimscript");
|
||||
Assert(IsAlive(self) == true, "AI is already dead or in extended death and cant be put down.");
|
||||
if( self.a.revivedOnce != true )
|
||||
{
|
||||
self waittill_players_goes_away();
|
||||
reviver_found = false;
|
||||
while(!reviver_found)
|
||||
{
|
||||
friendlies = GetAIArray( self.team );
|
||||
if( self.a.oldRevivers.size > 0 )
|
||||
ai = get_array_of_closest( self.origin, friendlies, self.a.oldRevivers, undefined, anim.reviverPingDist );
|
||||
else
|
||||
ai = get_array_of_closest( self.origin, friendlies, undefined, undefined, anim.reviverPingDist );
|
||||
for( i = 0; i < ai.size; i++ )
|
||||
{
|
||||
current_ai = ai[i];
|
||||
if( isAIOldReviver( current_ai ) || ( current_ai.a.canRevive == false ) )
|
||||
continue;
|
||||
if( IsDefined( current_ai.ignoreall ) && current_ai.ignoreall == true )
|
||||
continue;
|
||||
if( ( current_ai != self ) && IsDefined( current_ai.a.revivedOnce ) && ( current_ai.a.reviveMe == false ) && ( current_ai.a.isReviver == false ) )
|
||||
{
|
||||
AssertEx(IsDefined(self.predictedRevivePoint), "Predicted revive point is not calculated.");
|
||||
if( findpath( current_ai.origin, self.predictedRevivePoint ) )
|
||||
{
|
||||
reviver_found = true;
|
||||
self.a.oldRevivers[self.a.oldRevivers.size] = current_ai;
|
||||
self.a.reviver = current_ai;
|
||||
current_ai.a.bleeder = self;
|
||||
self thread revive_process();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if( !reviver_found )
|
||||
wait(2);
|
||||
}
|
||||
}
|
||||
}
|
||||
revive_process()
|
||||
{
|
||||
self endon("death");
|
||||
self.a.reviver thread reviver_think();
|
||||
self thread handle_bleeder_death();
|
||||
self.a.reviver thread handle_reviver_death();
|
||||
}
|
||||
waittill_players_goes_away()
|
||||
{
|
||||
while( IsAlive(self) )
|
||||
{
|
||||
player = get_closest_player(self.origin);
|
||||
if( DistanceSquared( player.origin, self.origin) > anim.reviverIgnorePlayerDistSq )
|
||||
break;
|
||||
wait(1);
|
||||
}
|
||||
}
|
||||
handle_reviver_death()
|
||||
{
|
||||
self endon("revive_complete");
|
||||
self endon("bleeder_death");
|
||||
self waittill_any( "death" );
|
||||
self free_reviver("death");
|
||||
wait(0.05);
|
||||
if( IsDefined( self.a.bleeder ) && IsAlive(self.a.bleeder))
|
||||
{
|
||||
if( self.a.revivedOnce )
|
||||
{
|
||||
self.a.bleeder thread bleeder_getup();
|
||||
}
|
||||
else
|
||||
{
|
||||
self .a.bleeder play_bleed_loop();
|
||||
self.a.bleeder thread reviver_selection_think(self.a.bleeder.team);
|
||||
}
|
||||
}
|
||||
}
|
||||
handle_reviver_goal_change()
|
||||
{
|
||||
self endon("revive_complete");
|
||||
self endon("bleeder_death");
|
||||
self endon("reevaluate_reviver");
|
||||
self endon("reviving_bleeder");
|
||||
self waittill_any("goalradius_changed");
|
||||
self free_reviver("goalradius_changed");
|
||||
wait(0.05);
|
||||
if( IsDefined( self.a.bleeder ) && IsAlive(self.a.bleeder) )
|
||||
{
|
||||
if( self.a.revivedOnce )
|
||||
self.a.bleeder thread bleeder_getup();
|
||||
else
|
||||
self.a.bleeder thread reviver_selection_think(self.a.bleeder.team);
|
||||
}
|
||||
}
|
||||
handle_bleeder_death(reviver)
|
||||
{
|
||||
self endon("revived");
|
||||
self endon("reevaluate_reviver");
|
||||
self waittill("death");
|
||||
self.a.reviver notify("bleeder_death");
|
||||
self.a.reviver free_reviver("bleeder_death");
|
||||
}
|
||||
reviver_think()
|
||||
{
|
||||
self endon("death");
|
||||
self endon("bleeder_death");
|
||||
self endon("reevaluate_reviver");
|
||||
self.a.isReviver = true;
|
||||
while(!self.a.bleeder.a.bleeding)
|
||||
{
|
||||
wait(0.05);
|
||||
}
|
||||
self.ReviveOldgoalradius = self.goalradius;
|
||||
self.goalradius = 4;
|
||||
self thread handle_reviver_goal_change();
|
||||
revive_anim = getReviverReviveAnim();
|
||||
approach_angle = GetStartAngles( self.a.bleeder.origin, self.a.bleeder.angles, revive_anim );
|
||||
revive_point = getRevivePoint(self.a.bleeder);
|
||||
self SetGoalPos(revive_point, approach_angle);
|
||||
self waittill("goal");
|
||||
self reviver_revive(revive_anim, revive_point);
|
||||
}
|
||||
free_reviver(reason)
|
||||
{
|
||||
self endon("death");
|
||||
if( IsDefined(self) )
|
||||
{
|
||||
self.a.isReviver = false;
|
||||
self.a.isReviving = false;
|
||||
self.ignoreme = false;
|
||||
if( IsDefined(reason) && ( (reason == "death") || (reason == "goalradius_changed" ) ) )
|
||||
{
|
||||
self notify("reevaluate_reviver");
|
||||
self.a.bleeder notify("reevaluate_reviver");
|
||||
}
|
||||
if( IsDefined(self.ReviveOldgoalradius) )
|
||||
self.goalradius = self.ReviveOldgoalradius;
|
||||
if( IsAlive(self) && IsDefined(reason) && reason != "death" )
|
||||
{
|
||||
self notify( "killanimscript" );
|
||||
waittillframeend;
|
||||
self thread call_overloaded_func( "animscripts\combat", "main" );
|
||||
}
|
||||
}
|
||||
}
|
||||
free_bleeder()
|
||||
{
|
||||
self endon("death");
|
||||
if (IsDefined(self))
|
||||
{
|
||||
self.a.reviveMe = false;
|
||||
self.a.bleeding = false;
|
||||
self.a.falling = false;
|
||||
self.health = RandomIntRange(90, 120);
|
||||
self notify("ready_after_revived");
|
||||
if( IsDefined( self.a.special ) && self.a.special == "bleeder_death" )
|
||||
self.a.special = "none";
|
||||
if( IsAlive(self) )
|
||||
{
|
||||
self notify( "killanimscript" );
|
||||
waittillframeend;
|
||||
self thread call_overloaded_func( "animscripts\combat", "main" );
|
||||
}
|
||||
}
|
||||
}
|
||||
reviver_revive(revive_anim, revive_point)
|
||||
{
|
||||
self endon("bleeder_death");
|
||||
self.a.isReviving = true;
|
||||
bleeder = self.a.bleeder;
|
||||
bleeder notify("being_revived");
|
||||
self notify("reviving_bleeder");
|
||||
self.ignoreme = true;
|
||||
resetReviveSequenceTimer();
|
||||
bleeder SetFlaggedAnimKnob( "being_revived", getBleederReviveAnim(), 1, 0.1, 1 );
|
||||
self AnimScripted( "revive", bleeder.origin, bleeder.angles, revive_anim, "normal", %body, 1 );
|
||||
self animscripts\shared::DoNoteTracks("revive", ::handleReviverNotetracks);
|
||||
self notify("revive_complete");
|
||||
self revive_getup_process();
|
||||
}
|
||||
revive_getup_process()
|
||||
{
|
||||
self.a.bleeder thread bleeder_getup();
|
||||
self animcustom( ::reviver_getup );
|
||||
}
|
||||
bleeder_getup()
|
||||
{
|
||||
self SetFlaggedAnimKnobAllRestart( "bleeder_get_up", getBleederGetUpAnim(), %body ,1, 0.1, 1.0 );
|
||||
self animscripts\shared::DoNoteTracks( "bleeder_get_up" );
|
||||
self free_bleeder();
|
||||
}
|
||||
reviver_getup()
|
||||
{
|
||||
self SetFlaggedAnimKnobAllRestart( "reviver_get_up", getReviverGetUpAnim(), %body, 1, 0.1, 1.0 );
|
||||
self animscripts\shared::DoNoteTracks( "reviver_get_up" );
|
||||
self free_reviver("revive_complete");
|
||||
}
|
||||
bleeder_bleed_to_death()
|
||||
{
|
||||
self endon("revived");
|
||||
self.bleedOutTime = RandomIntRange(anim.bleederBleedOutTimeMin,anim.bleederBleedOutTimeMax);
|
||||
wait( self.bleedOutTime/1000 );
|
||||
if( IsDefined(self) && IsAlive(self) )
|
||||
self DoDamage( self.health + 200, self.origin );
|
||||
}
|
||||
fall_down_to_bleed()
|
||||
{
|
||||
self endon("death");
|
||||
self endon("revived");
|
||||
self endon("being_revived");
|
||||
self endon("killanimscript");
|
||||
self SetAnimKnobAll( %revive, %body, 1, 0.1, 1 );
|
||||
transAnim = getTransitionAnim();
|
||||
self.a.falling = true;
|
||||
self SetFlaggedAnimKnob( "fall_transition", transAnim, 1, 0.1, 1.5 );
|
||||
self thread handleBleederNotetracks("fall_transition");
|
||||
self animscripts\shared::DoNoteTracks( "fall_transition");
|
||||
Assert( self.a.pose == "back", "Fall transition animation is missing the anim_pose = back notetrack." );
|
||||
self ClearAnim(transAnim, 0.2);
|
||||
self.a.bleeding = true;
|
||||
self play_bleed_loop();
|
||||
}
|
||||
play_bleed_loop()
|
||||
{
|
||||
self SetFlaggedAnimKnobAllRestart( "bleeding", getBleedLoopAnim(), %body ,1, 0.1, 1.0 );
|
||||
}
|
||||
handleBleederNotetracks(anim_name)
|
||||
{
|
||||
self endon("death");
|
||||
for (;;)
|
||||
{
|
||||
self waittill(anim_name, note);
|
||||
switch ( note )
|
||||
{
|
||||
case "reviver_selection":
|
||||
{
|
||||
self thread reviver_selection_think(self.team);
|
||||
break;
|
||||
}
|
||||
case "anim_pose = \"back\"":
|
||||
{
|
||||
self.a.special = "bleeder_death";
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(note == "end")
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
handleReviverNotetracks(note)
|
||||
{
|
||||
switch ( note )
|
||||
{
|
||||
case "attach_bandage":
|
||||
{
|
||||
bleeder = self.a.bleeder;
|
||||
bleeder Attach("char_rus_bandages1");
|
||||
bleeder.a.revivedOnce = true;
|
||||
bleeder notify("revived");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
getTransitionAnim()
|
||||
{
|
||||
assert( self.a.pose == "stand" || self.a.pose == "crouch" || self.a.pose == "prone" );
|
||||
transitionAnim = anim.bleed[self.a.pose]["fall"];
|
||||
Assert(animHasNoteTrack( transitionAnim, "anim_pose = \"back\"" ));
|
||||
Assert(animHasNoteTrack( transitionAnim, "reviver_selection" ));
|
||||
return transitionAnim;
|
||||
}
|
||||
getBleedLoopAnim()
|
||||
{
|
||||
bleedLoopAnim = anim.bleed["bleed_loop"];
|
||||
return bleedLoopAnim;
|
||||
}
|
||||
getBleederReviveAnim()
|
||||
{
|
||||
reviveAnim = anim.bleed["left"]["being_revived"];
|
||||
return reviveAnim;
|
||||
}
|
||||
getReviverReviveAnim()
|
||||
{
|
||||
reviveAnim = anim.revive["left"]["reviving"];
|
||||
Assert(animHasNoteTrack( reviveAnim, "anim_pose = \"crouch\"" ));
|
||||
Assert(animHasNoteTrack( reviveAnim, "attach_bandage" ));
|
||||
return reviveAnim;
|
||||
}
|
||||
getBleederGetUpAnim()
|
||||
{
|
||||
bleederGetUpAnim = anim.bleed["left"]["get_up"];
|
||||
Assert(animHasNoteTrack( bleederGetUpAnim, "anim_pose = \"stand\"" ));
|
||||
return bleederGetUpAnim;
|
||||
}
|
||||
getReviverGetUpAnim()
|
||||
{
|
||||
reviverGetUpAnim = anim.revive["left"]["get_up"];
|
||||
Assert(animHasNoteTrack( reviverGetUpAnim, "anim_pose = \"stand\"" ));
|
||||
return reviverGetUpAnim;
|
||||
}
|
||||
damageLocation(hitloc)
|
||||
{
|
||||
if( hitloc == "helmet" || hitloc == "head" )
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
isAIOldReviver(ai)
|
||||
{
|
||||
if( self.a.oldRevivers.size > 0 )
|
||||
{
|
||||
for( i = 0; i < self.a.oldRevivers.size; i++ )
|
||||
{
|
||||
if( IsDefined( self.a.oldRevivers[i] ) && self.a.oldRevivers[i] == ai )
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
getRevivePoint(bleeder)
|
||||
{
|
||||
revive_point = GetStartOrigin(bleeder.origin, bleeder.angles, getReviverReviveAnim() );
|
||||
return revive_point;
|
||||
}
|
||||
IsReviveOnSafeTerrain()
|
||||
{
|
||||
self endon("death");
|
||||
groundPos = physicstrace( self.origin, self.origin - ( 0, 0, 10000 ) );
|
||||
bleederDistanceFromGround = distance( self.origin, groundPos );
|
||||
if( ( bleederDistanceFromGround > 2 ) || ( bleederDistanceFromGround < 0 ) )
|
||||
return false;
|
||||
angleDelta = getAngleDelta(anim.bleed[self.a.pose]["fall"], 0, 1);
|
||||
finalYaw = self.angles[1] + angleDelta;
|
||||
finalAngles = ( self.angles[0], finalYaw, self.angles[2] );
|
||||
moveDelta = GetMoveDelta( anim.bleed[self.a.pose]["fall"], 0, 1 );
|
||||
endPoint = self localToWorldCoords( moveDelta );
|
||||
if( !self mayMoveToPoint( endPoint ) )
|
||||
return false;
|
||||
self.predictedRevivePoint = getPredictedRevivePoint( endPoint, finalAngles );
|
||||
groundPos = physicstrace( self.predictedRevivePoint, self.predictedRevivePoint - ( 0, 0, 10000 ) );
|
||||
revivePointDistanceFromGround = distance( self.predictedRevivePoint, groundPos );
|
||||
if( revivePointDistanceFromGround < 0 || revivePointDistanceFromGround > 15 )
|
||||
return false;
|
||||
diff = abs( bleederDistanceFromGround - revivePointDistanceFromGround );
|
||||
if( diff > 15 )
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
getPredictedRevivePoint( endPoint, finalAngles )
|
||||
{
|
||||
revive_point = GetStartOrigin(endPoint, finalAngles, getReviverReviveAnim());
|
||||
return revive_point;
|
||||
}
|
||||
isAIDamageFatal(damage)
|
||||
{
|
||||
Assert(IsAlive(self) == true, "AI is already dead or in extended death and cant be put down.");
|
||||
health = self.health - damage;
|
||||
if( health <= 0 )
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
shouldBleed()
|
||||
{
|
||||
self endon("death");
|
||||
Assert(IsAlive(self) == true, "AI is already dead or in extended death and cant be put down.");
|
||||
Assert(IsAlive(self.a.revivedOnce) == false, "AI is already revived/bleeded once.");
|
||||
if( ( self.a.reviveMe == true ) && ( self.a.bleeding == false ) && ( self.a.falling == false ) )
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
isBleedingOrFalling()
|
||||
{
|
||||
Assert(IsAlive(self) == true, "AI is already dead or in extended death and cant be put down.");
|
||||
if( (self.a.bleeding == true) || (self.a.falling == true) )
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
shouldReviveSequenceHappen()
|
||||
{
|
||||
if ( GetTime() < anim.nextReviveSequenceTime )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if( ( randomint(100) > 40 ) )
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
resetReviveSequenceTimer()
|
||||
{
|
||||
players = GetPlayers();
|
||||
anybody_nearby = 0;
|
||||
for (i=0;i<players.size;i++)
|
||||
{
|
||||
if ( IsDefined(players[i]) && DistanceSquared( self.origin, players[i].origin ) < anim.reviveSequencePlayerVisibleDistSq )
|
||||
{
|
||||
anybody_nearby = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( anybody_nearby )
|
||||
{
|
||||
anim.nextReviveSequenceTime = GetTime() + RandomIntRange( anim.nextReviveSequencePlayerTimeMin, anim.nextReviveSequencePlayerTimeMax );
|
||||
}
|
||||
else
|
||||
{
|
||||
anim.nextReviveSequenceTime = GetTime() + RandomIntRange( anim.nextReviveSequenceTimeMin, anim.nextReviveSequenceTimeMax );
|
||||
}
|
||||
}
|
||||
isReviverOrBleeder()
|
||||
{
|
||||
if(IsDefined(self) & IsAI(self))
|
||||
{
|
||||
if(self.a.isReviver || self.a.reviveMe)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
isBleeder()
|
||||
{
|
||||
if(IsDefined(self) & IsAI(self))
|
||||
{
|
||||
if( self.a.reviveMe )
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
BIN
BO1/PC/ZM/animscripts/saw/common.gsc
Normal file
BIN
BO1/PC/ZM/animscripts/saw/common.gsc
Normal file
Binary file not shown.
BIN
BO1/PC/ZM/animscripts/saw/prone.gsc
Normal file
BIN
BO1/PC/ZM/animscripts/saw/prone.gsc
Normal file
Binary file not shown.
BIN
BO1/PC/ZM/animscripts/saw/stand.gsc
Normal file
BIN
BO1/PC/ZM/animscripts/saw/stand.gsc
Normal file
Binary file not shown.
892
BO1/PC/ZM/animscripts/setposemovement.gsc
Normal file
892
BO1/PC/ZM/animscripts/setposemovement.gsc
Normal file
@ -0,0 +1,892 @@
|
||||
|
||||
#include animscripts\Utility;
|
||||
#include animscripts\anims;
|
||||
#include maps\_Utility;
|
||||
#include common_scripts\utility;
|
||||
#using_animtree ("generic_human");
|
||||
SetPoseMovement(desiredPose, desiredMovement)
|
||||
{
|
||||
if (desiredPose=="")
|
||||
{
|
||||
if ( (self.a.pose=="prone") && ((desiredMovement=="walk")||(desiredMovement=="run")) )
|
||||
{
|
||||
desiredPose = "crouch";
|
||||
}
|
||||
else
|
||||
{
|
||||
desiredPose = self.a.pose;
|
||||
}
|
||||
}
|
||||
if (!IsDefined(desiredMovement) || desiredMovement=="")
|
||||
{
|
||||
desiredMovement = self.a.movement;
|
||||
}
|
||||
[[anim.SetPoseMovementFnArray[desiredPose][desiredMovement]]]();
|
||||
}
|
||||
InitPoseMovementFunctions()
|
||||
{
|
||||
anim.SetPoseMovementFnArray["stand"]["stop"] = ::BeginStandStop;
|
||||
anim.SetPoseMovementFnArray["stand"]["walk"] = ::BeginStandWalk;
|
||||
anim.SetPoseMovementFnArray["stand"]["run"] = ::BeginStandRun;
|
||||
anim.SetPoseMovementFnArray["crouch"]["stop"] = ::BeginCrouchStop;
|
||||
anim.SetPoseMovementFnArray["crouch"]["walk"] = ::BeginCrouchWalk;
|
||||
anim.SetPoseMovementFnArray["crouch"]["run"] = ::BeginCrouchRun;
|
||||
anim.SetPoseMovementFnArray["prone"]["stop"] = ::BeginProneStop;
|
||||
anim.SetPoseMovementFnArray["prone"]["walk"] = ::BeginProneWalk;
|
||||
anim.SetPoseMovementFnArray["prone"]["run"] = ::BeginProneRun;
|
||||
}
|
||||
BeginStandStop()
|
||||
{
|
||||
switch (self.a.pose)
|
||||
{
|
||||
case "stand":
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
return false;
|
||||
case "walk":
|
||||
StandWalkToStand();
|
||||
break;
|
||||
default:
|
||||
assert(self.a.movement == "run");
|
||||
StandRunToStand();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case "crouch":
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
CrouchToStand();
|
||||
break;
|
||||
case "walk":
|
||||
CrouchWalkToStand();
|
||||
break;
|
||||
default:
|
||||
assert(self.a.movement == "run");
|
||||
CrouchRunToStand();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(self.a.pose == "prone");
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
ProneToStand();
|
||||
break;
|
||||
default:
|
||||
assert(self.a.movement == "walk" || self.a.movement == "run");
|
||||
ProneToStand();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
BeginStandWalk()
|
||||
{
|
||||
switch (self.a.pose)
|
||||
{
|
||||
case "stand":
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
BlendIntoStandWalk();
|
||||
break;
|
||||
case "walk":
|
||||
return false;
|
||||
default:
|
||||
assert(self.a.movement == "run");
|
||||
BlendIntoStandWalk();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case "crouch":
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
CrouchToStandWalk();
|
||||
break;
|
||||
case "walk":
|
||||
BlendIntoStandWalk();
|
||||
break;
|
||||
default:
|
||||
assert(self.a.movement == "run");
|
||||
BlendIntoStandWalk();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(self.a.pose == "prone");
|
||||
ProneToStandWalk();
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
BeginStandRun()
|
||||
{
|
||||
switch (self.a.pose)
|
||||
{
|
||||
case "stand":
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
BlendIntoStandRun();
|
||||
break;
|
||||
case "walk":
|
||||
BlendIntoStandRun();
|
||||
break;
|
||||
default:
|
||||
assert(self.a.movement == "run");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case "crouch":
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
CrouchToStandRun();
|
||||
break;
|
||||
default:
|
||||
assert(self.a.movement == "run" || self.a.movement == "walk");
|
||||
BlendIntoStandRun();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(self.a.pose == "prone");
|
||||
ProneToStandRun();
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
BeginCrouchStop()
|
||||
{
|
||||
switch (self.a.pose)
|
||||
{
|
||||
case "stand":
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
StandToCrouch();
|
||||
break;
|
||||
case "walk":
|
||||
StandWalkToCrouch();
|
||||
break;
|
||||
case "run":
|
||||
StandRunToCrouch();
|
||||
break;
|
||||
default:
|
||||
assertEX(0, "SetPoseMovement::BeginCrouchStop "+self.a.pose+" "+self.a.movement);
|
||||
}
|
||||
break;
|
||||
case "crouch":
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
break;
|
||||
case "walk":
|
||||
CrouchWalkToCrouch();
|
||||
break;
|
||||
case "run":
|
||||
CrouchRunToCrouch();
|
||||
break;
|
||||
default:
|
||||
assertEX(0, "SetPoseMovement::BeginCrouchStop "+self.a.pose+" "+self.a.movement);
|
||||
}
|
||||
break;
|
||||
case "prone":
|
||||
ProneToCrouch();
|
||||
break;
|
||||
default:
|
||||
assertEX(0, "SetPoseMovement::BeginCrouchStop "+self.a.pose+" "+self.a.movement);
|
||||
}
|
||||
}
|
||||
BeginCrouchWalk()
|
||||
{
|
||||
switch (self.a.pose)
|
||||
{
|
||||
case "stand":
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
BlendIntoStandWalk();
|
||||
BlendIntoCrouchWalk();
|
||||
break;
|
||||
case "walk":
|
||||
BlendIntoCrouchWalk();
|
||||
break;
|
||||
default:
|
||||
assert(self.a.movement == "run");
|
||||
BlendIntoCrouchWalk();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case "crouch":
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
CrouchToCrouchWalk();
|
||||
break;
|
||||
case "walk":
|
||||
return false;
|
||||
default:
|
||||
assert(self.a.movement == "run");
|
||||
BlendIntoCrouchWalk();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(self.a.pose == "prone");
|
||||
ProneToCrouchWalk();
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
BeginCrouchRun()
|
||||
{
|
||||
switch (self.a.pose)
|
||||
{
|
||||
case "stand":
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
BlendIntoStandRun();
|
||||
BlendIntoCrouchRun();
|
||||
break;
|
||||
default:
|
||||
assert(self.a.movement == "run" || self.a.movement == "walk");
|
||||
BlendIntoCrouchRun();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case "crouch":
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
CrouchToCrouchRun();
|
||||
break;
|
||||
case "walk":
|
||||
BlendIntoCrouchRun();
|
||||
break;
|
||||
default:
|
||||
assert(self.a.movement == "run");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(self.a.pose == "prone");
|
||||
ProneToCrouchRun();
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
BeginProneStop()
|
||||
{
|
||||
switch (self.a.pose)
|
||||
{
|
||||
case "stand":
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
StandToProne();
|
||||
break;
|
||||
case "walk":
|
||||
StandToProne();
|
||||
break;
|
||||
case "run":
|
||||
CrouchRunToProne();
|
||||
break;
|
||||
default:
|
||||
assertEX(0, "SetPoseMovement::BeginCrouchRun "+self.a.pose+" "+self.a.movement);
|
||||
}
|
||||
break;
|
||||
case "crouch":
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
CrouchToProne();
|
||||
break;
|
||||
case "walk":
|
||||
CrouchToProne();
|
||||
break;
|
||||
case "run":
|
||||
CrouchRunToProne();
|
||||
break;
|
||||
default:
|
||||
assertEX(0, "SetPoseMovement::BeginCrouchRun "+self.a.pose+" "+self.a.movement);
|
||||
}
|
||||
break;
|
||||
case "prone":
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
break;
|
||||
case "walk":
|
||||
case "run":
|
||||
ProneCrawlToProne();
|
||||
break;
|
||||
default:
|
||||
assertEX(0, "SetPoseMovement::BeginCrouchRun "+self.a.pose+" "+self.a.movement);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assertEX(0, "SetPoseMovement::BeginCrouchRun "+self.a.pose+" "+self.a.movement);
|
||||
}
|
||||
}
|
||||
BeginProneWalk()
|
||||
{
|
||||
switch (self.a.pose)
|
||||
{
|
||||
case "stand":
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
StandToProneWalk();
|
||||
break;
|
||||
default:
|
||||
assert(self.a.movement == "run" || self.a.movement == "walk");
|
||||
CrouchRunToProneWalk();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case "crouch":
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
CrouchToProneWalk();
|
||||
break;
|
||||
default:
|
||||
assert(self.a.movement == "run" || self.a.movement == "walk");
|
||||
CrouchRunToProneWalk();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(self.a.pose == "prone");
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
ProneToProneRun();
|
||||
break;
|
||||
default:
|
||||
assert(self.a.movement == "run" || self.a.movement == "walk");
|
||||
self.a.movement = "walk";
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
BeginProneRun()
|
||||
{
|
||||
switch (self.a.pose)
|
||||
{
|
||||
case "stand":
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
StandToProneRun();
|
||||
break;
|
||||
default:
|
||||
assert(self.a.movement == "run" || self.a.movement == "walk");
|
||||
CrouchRunToProneRun();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case "crouch":
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
CrouchToProneRun();
|
||||
break;
|
||||
default:
|
||||
assert(self.a.movement == "run" || self.a.movement == "walk");
|
||||
CrouchRunToProneRun();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(self.a.pose == "prone");
|
||||
switch (self.a.movement)
|
||||
{
|
||||
case "stop":
|
||||
assert(self.a.movement == "stop");
|
||||
ProneToProneRun();
|
||||
break;
|
||||
default:
|
||||
assert(self.a.movement == "run" || self.a.movement == "walk");
|
||||
self.a.movement = "run";
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
PlayBlendTransition( transAnim, crossblendTime, endPose, endMovement, endAiming )
|
||||
{
|
||||
endTime = GetTime() + crossblendTime * 1000;
|
||||
self SetAnimKnobAll( transAnim, %body, 1, crossblendTime, 1 );
|
||||
wait crossblendTime / 2;
|
||||
self.a.pose = endPose;
|
||||
self.a.movement = endMovement;
|
||||
if ( endAiming )
|
||||
{
|
||||
self.a.alertness = "aiming";
|
||||
}
|
||||
else
|
||||
{
|
||||
self.a.alertness = "casual";
|
||||
}
|
||||
waittime = (endTime - GetTime()) / 1000;
|
||||
if ( waittime < 0.05 )
|
||||
{
|
||||
waittime = 0.05;
|
||||
}
|
||||
wait waittime;
|
||||
}
|
||||
PlayTransitionStandWalk(transAnim, finalAnim)
|
||||
{
|
||||
PlayTransitionAnimation(transAnim, "stand", "walk", 1, finalAnim);
|
||||
}
|
||||
StandWalkToStand()
|
||||
{
|
||||
assertEX(self.a.pose == "stand", "SetPoseMovement::StandWalkToStand "+self.a.pose);
|
||||
assertEX(self.a.movement == "walk", "SetPoseMovement::StandWalkToStand "+self.a.movement);
|
||||
self.a.movement = "stop";
|
||||
}
|
||||
StandWalkToCrouch()
|
||||
{
|
||||
StandWalkToStand();
|
||||
StandToCrouch();
|
||||
}
|
||||
StandRunToStand()
|
||||
{
|
||||
assertEX(self.a.pose == "stand", "SetPoseMovement::StandRunToStand "+self.a.pose);
|
||||
assertEX(self.a.movement == "run", "SetPoseMovement::StandRunToStand "+self.a.movement);
|
||||
self.a.movement = "stop";
|
||||
}
|
||||
StandRunToCrouch()
|
||||
{
|
||||
self.a.movement = "stop";
|
||||
self.a.pose = "crouch";
|
||||
}
|
||||
PlayBlendTransitionStandRun(animname)
|
||||
{
|
||||
transtime = 0.3;
|
||||
if (self.a.movement != "stop")
|
||||
{
|
||||
self endon("movemode");
|
||||
transtime = 1.0;
|
||||
}
|
||||
PlayBlendTransition(animname, transtime, "stand", "run", 0);
|
||||
}
|
||||
BlendIntoStandRun()
|
||||
{
|
||||
if( self call_overloaded_func( "animscripts\cqb", "shouldCQB" ) )
|
||||
{
|
||||
PlayBlendTransitionStandRun( animArray("start_cqb_run_f", "move") );
|
||||
}
|
||||
else if( self animscripts\utility::IsInCombat() && IsDefined(self.run_combatanim) )
|
||||
{
|
||||
PlayBlendTransitionStandRun(self.run_combatanim);
|
||||
}
|
||||
else if (IsDefined(self.run_noncombatanim))
|
||||
{
|
||||
PlayBlendTransitionStandRun(self.run_noncombatanim);
|
||||
}
|
||||
else
|
||||
{
|
||||
runAnimTransTime = 0.0;
|
||||
if ( self.a.movement != "stop" )
|
||||
{
|
||||
runAnimTransTime = 0.5;
|
||||
}
|
||||
useLeans = true;
|
||||
transitionAnimParent = %combatrun;
|
||||
forwardRunAnim = %combatrun_forward;
|
||||
shouldShootWhileMoving = false;
|
||||
runAnimName = "start_stand_run_f";
|
||||
if( self.a.pose == "stand" )
|
||||
{
|
||||
if ( call_overloaded_func( "animscripts\move", "MayShootWhileMoving" ) && self.bulletsInClip > 0 && isValidEnemy( self.enemy ) )
|
||||
{
|
||||
shouldShootWhileMoving = true;
|
||||
if( self.a.pose == "stand" )
|
||||
{
|
||||
runAnimName = "run_n_gun_f";
|
||||
}
|
||||
if( call_overloaded_func( "animscripts\run", "ShouldShootWhileRunningBackward" ) )
|
||||
{
|
||||
self OrientMode( "face direction", vector_scale(self.lookaheaddir, -1) );
|
||||
}
|
||||
}
|
||||
}
|
||||
self SetAnimKnobLimited( animArray(runAnimName), 1, runAnimTransTime, 1 );
|
||||
if( shouldShootWhileMoving && self.a.pose == "stand" )
|
||||
{
|
||||
self thread call_overloaded_func( "animscripts\run", "UpdateRunWeights", "BlendIntoStandRun",
|
||||
forwardRunAnim,
|
||||
animArray("run_n_gun_b")
|
||||
);
|
||||
}
|
||||
else if( useLeans && self.isfacingmotion )
|
||||
{
|
||||
self thread call_overloaded_func( "animscripts\run", "UpdateRunWeights", "BlendIntoStandRun",
|
||||
forwardRunAnim,
|
||||
animArray("combat_run_b"),
|
||||
animArray("combat_run_lean_l"),
|
||||
animArray("combat_run_lean_r")
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
self thread call_overloaded_func( "animscripts\run", "UpdateRunWeights", "BlendIntoStandRun",
|
||||
forwardRunAnim,
|
||||
animArray("combat_run_b"),
|
||||
animArray("combat_run_l"),
|
||||
animArray("combat_run_r")
|
||||
);
|
||||
}
|
||||
PlayBlendTransitionStandRun(transitionAnimParent);
|
||||
}
|
||||
self notify ("BlendIntoStandRun");
|
||||
}
|
||||
PlayBlendTransitionStandWalk(animname)
|
||||
{
|
||||
if (self.a.movement != "stop")
|
||||
self endon("movemode");
|
||||
PlayBlendTransition(animname, 0.6, "stand", "walk", 1);
|
||||
}
|
||||
BlendIntoStandWalk()
|
||||
{
|
||||
walkanim = animscripts\walk::getStandWalkAnim();
|
||||
PlayBlendTransitionStandWalk( walkanim );
|
||||
}
|
||||
CrouchToStand()
|
||||
{
|
||||
assertEX(self.a.pose == "crouch", "SetPoseMovement::CrouchToStand "+self.a.pose);
|
||||
assertEX(self.a.movement == "stop", "SetPoseMovement::CrouchToStand "+self.a.movement);
|
||||
standSpeed = 0.5;
|
||||
if (IsDefined (self.fastStand))
|
||||
{
|
||||
standSpeed = 1.8;
|
||||
self.fastStand = undefined;
|
||||
}
|
||||
if ( (self animscripts\utility::weaponAnims() == "pistol") || (self animscripts\utility::weaponAnims() == "none") )
|
||||
{
|
||||
PlayTransitionAnimation( animArray("crouch_2_stand"), "stand", "stop", standSpeed );
|
||||
}
|
||||
else
|
||||
{
|
||||
self randomizeIdleSet();
|
||||
PlayTransitionAnimation( animArray("crouch_2_stand"), "stand", "stop", standSpeed );
|
||||
}
|
||||
self ClearAnim(%shoot, 0);
|
||||
}
|
||||
CrouchToCrouchWalk()
|
||||
{
|
||||
assertEX(self.a.pose == "crouch", "SetPoseMovement::CrouchToCrouchWalk "+self.a.pose);
|
||||
assertEX(self.a.movement == "stop", "SetPoseMovement::CrouchToCrouchWalk "+self.a.movement);
|
||||
BlendIntoCrouchWalk();
|
||||
}
|
||||
CrouchToStandWalk()
|
||||
{
|
||||
CrouchToCrouchWalk();
|
||||
BlendIntoStandWalk();
|
||||
}
|
||||
CrouchWalkToCrouch()
|
||||
{
|
||||
assertEX(self.a.pose == "crouch", "SetPoseMovement::CrouchWalkToCrouch "+self.a.pose);
|
||||
assertEX(self.a.movement == "walk", "SetPoseMovement::CrouchWalkToCrouch "+self.a.movement);
|
||||
self.a.movement = "stop";
|
||||
}
|
||||
CrouchWalkToStand()
|
||||
{
|
||||
CrouchWalkToCrouch();
|
||||
CrouchToStand();
|
||||
}
|
||||
CrouchRunToCrouch()
|
||||
{
|
||||
assertEX(self.a.pose == "crouch", "SetPoseMovement::CrouchRunToCrouch "+self.a.pose);
|
||||
assertEX(self.a.movement == "run", "SetPoseMovement::CrouchRunToCrouch "+self.a.movement);
|
||||
self.a.movement = "stop";
|
||||
}
|
||||
CrouchRunToStand()
|
||||
{
|
||||
CrouchRunToCrouch();
|
||||
CrouchToStand();
|
||||
}
|
||||
CrouchToCrouchRun()
|
||||
{
|
||||
assertEX(self.a.pose == "crouch", "SetPoseMovement::CrouchToCrouchRun "+self.a.pose);
|
||||
assertEX(self.a.movement == "stop", "SetPoseMovement::CrouchToCrouchRun "+self.a.movement);
|
||||
BlendIntoCrouchRun();
|
||||
}
|
||||
CrouchToStandRun()
|
||||
{
|
||||
BlendIntoStandRun();
|
||||
}
|
||||
BlendIntoCrouchRun()
|
||||
{
|
||||
if (IsDefined(self.crouchrun_combatanim))
|
||||
{
|
||||
self SetAnimKnobAll(self.crouchrun_combatanim, %body, 1, 0.4);
|
||||
PlayBlendTransition(self.crouchrun_combatanim, 0.6, "crouch", "run", 0);
|
||||
self notify ("BlendIntoCrouchRun");
|
||||
}
|
||||
else
|
||||
{
|
||||
self setanimknob( call_overloaded_func( "animscripts\run", "GetCrouchRunAnim" ), 1, 0.4 );
|
||||
self thread call_overloaded_func( "animscripts\run", "UpdateRunWeights", "BlendIntoCrouchRun",
|
||||
%combatrun_forward,
|
||||
animArray("combat_run_b"),
|
||||
animArray("combat_run_l"),
|
||||
animArray("combat_run_r")
|
||||
);
|
||||
PlayBlendTransition(%combatrun, 0.6, "crouch", "run", 0);
|
||||
self notify ("BlendIntoCrouchRun");
|
||||
}
|
||||
}
|
||||
ProneToCrouchRun()
|
||||
{
|
||||
assertEX(self.a.pose == "prone", "SetPoseMovement::ProneToCrouchRun "+self.a.pose);
|
||||
self OrientMode ("face current");
|
||||
self ExitProneWrapper(1.0);
|
||||
ProneLegsStraightTree(0.2);
|
||||
self call_overloaded_func( "animscripts\cover_prone", "UpdateProneWrapper", 0.1 );
|
||||
PlayTransitionAnimation( animArray("prone_2_crouch_run"), "crouch", "run", 0, animArray("crouch_run_f") );
|
||||
}
|
||||
ProneToStandRun()
|
||||
{
|
||||
ProneToCrouchRun();
|
||||
BlendIntoStandRun();
|
||||
}
|
||||
ProneToCrouchWalk()
|
||||
{
|
||||
ProneToCrouchRun();
|
||||
BlendIntoCrouchWalk();
|
||||
}
|
||||
BlendIntoCrouchWalk()
|
||||
{
|
||||
if (IsDefined(self.crouchrun_combatanim))
|
||||
{
|
||||
self SetAnimKnobAll(self.crouchrun_combatanim, %body, 1, 0.4);
|
||||
PlayBlendTransition(self.crouchrun_combatanim, 0.6, "crouch", "walk", 0);
|
||||
self notify ("BlendIntoCrouchWalk");
|
||||
}
|
||||
else
|
||||
{
|
||||
PlayBlendTransition( animArray("crouch_run_f"), 0.8, "crouch", "walk", 1 );
|
||||
}
|
||||
}
|
||||
StandToCrouch()
|
||||
{
|
||||
assertEX(self.a.pose == "stand", "SetPoseMovement::StandToCrouch "+self.a.pose);
|
||||
assertEX(self.a.movement == "stop", "SetPoseMovement::StandToCrouch "+self.a.movement);
|
||||
self randomizeIdleSet();
|
||||
crouchSpeed = 0.5;
|
||||
if (IsDefined (self.fastCrouch))
|
||||
{
|
||||
crouchSpeed = 1.8;
|
||||
self.fastCrouch = undefined;
|
||||
}
|
||||
if( self is_zombie() )
|
||||
{
|
||||
self ClearAnim(%shoot, 0);
|
||||
return;
|
||||
}
|
||||
PlayTransitionAnimation( animArray("stand_2_crouch"), "crouch", "stop", 1, undefined, crouchspeed );
|
||||
self ClearAnim(%shoot, 0);
|
||||
}
|
||||
ProneToCrouch()
|
||||
{
|
||||
assertEX(self.a.pose == "prone", "SetPoseMovement::StandToCrouch "+self.a.pose);
|
||||
self randomizeIdleSet();
|
||||
self OrientMode("face current");
|
||||
self ExitProneWrapper(1.0);
|
||||
ProneLegsStraightTree(0.1);
|
||||
self call_overloaded_func( "animscripts\cover_prone", "UpdateProneWrapper", 0.1 );
|
||||
PlayTransitionAnimation( animArray("prone_2_crouch"), "crouch", "stop", 1 );
|
||||
}
|
||||
ProneToStand()
|
||||
{
|
||||
assertEx( self.a.pose == "prone", self.a.pose );
|
||||
self OrientMode ("face current");
|
||||
self ExitProneWrapper(1.0);
|
||||
ProneLegsStraightTree(0.1);
|
||||
self call_overloaded_func( "animscripts\cover_prone", "UpdateProneWrapper", 0.1 );
|
||||
PlayTransitionAnimation( animArray("prone_2_stand"), "stand", "stop", 1 );
|
||||
}
|
||||
ProneToStandWalk()
|
||||
{
|
||||
ProneToCrouch();
|
||||
CrouchToCrouchWalk();
|
||||
BlendIntoStandWalk();
|
||||
}
|
||||
ProneToProneMove(movement)
|
||||
{
|
||||
assertEX(self.a.pose == "prone", "SetPoseMovement::ProneToProneMove "+self.a.pose);
|
||||
assertEX(self.a.movement == "stop", "SetPoseMovement::ProneToProneMove "+self.a.movement);
|
||||
assertEX( (movement == "walk" || movement == "run"), "SetPoseMovement::ProneToProneMove got bad parameter "+movement);
|
||||
ProneLegsStraightTree(0.1);
|
||||
PlayTransitionAnimation( animArray("aim_2_crawl"), "prone", movement, 0, animArray("combat_run_f") );
|
||||
self call_overloaded_func( "animscripts\cover_prone", "UpdateProneWrapper", 0.1 );
|
||||
}
|
||||
ProneToProneRun()
|
||||
{
|
||||
ProneToProneMove("run");
|
||||
}
|
||||
ProneCrawlToProne()
|
||||
{
|
||||
assertEX(self.a.pose == "prone", "SetPoseMovement::ProneCrawlToProne "+self.a.pose);
|
||||
assertEX( (self.a.movement=="walk" || self.a.movement=="run"), "SetPoseMovement::ProneCrawlToProne "+self.a.movement);
|
||||
ProneLegsStraightTree(0.1);
|
||||
self call_overloaded_func( "animscripts\cover_prone", "UpdateProneWrapper", 0.1 );
|
||||
PlayTransitionAnimation( animArray("crawl_2_aim"), "prone", "stop", 1 );
|
||||
self ClearAnim( %exposed_modern, 0.2 );
|
||||
}
|
||||
CrouchToProne()
|
||||
{
|
||||
assertEX(self.a.pose == "crouch", "SetPoseMovement::CrouchToProne "+self.a.pose);
|
||||
self setProneAnimNodes( -45, 45, %prone_legs_down, %exposed_aiming, %prone_legs_up );
|
||||
self EnterProneWrapper(1.0);
|
||||
ProneLegsStraightTree(0.3);
|
||||
self call_overloaded_func( "animscripts\cover_prone", "UpdateProneWrapper", 0.1 );
|
||||
PlayTransitionAnimation( animArray("crouch_2_prone"), "prone", "stop", 1 );
|
||||
self ClearAnim( %exposed_modern, 0.2 );
|
||||
}
|
||||
CrouchToProneWalk()
|
||||
{
|
||||
CrouchToProne();
|
||||
ProneToProneRun();
|
||||
}
|
||||
CrouchToProneRun()
|
||||
{
|
||||
CrouchToProne();
|
||||
ProneToProneRun();
|
||||
}
|
||||
StandToProne()
|
||||
{
|
||||
assertEX(self.a.pose == "stand", "SetPoseMovement::StandToProne "+self.a.pose);
|
||||
proneTime = 0.5;
|
||||
transAnim = animArray("stand_2_prone");
|
||||
thread PlayTransitionAnimationThread_WithoutWaitSetStates( transAnim, "prone", "stop", proneTime );
|
||||
self waittillmatch("transAnimDone2", "anim_pose = \"prone\"");
|
||||
waittillframeend;
|
||||
self setProneAnimNodes( -45, 45, %prone_legs_down, %exposed_aiming, %prone_legs_up );
|
||||
self EnterProneWrapper(proneTime);
|
||||
self.a.movement = "stop";
|
||||
self waittillmatch("transAnimDone2", "end");
|
||||
self ClearAnim( %exposed_modern, 0.2 );
|
||||
}
|
||||
StandToProneWalk()
|
||||
{
|
||||
StandToProne();
|
||||
ProneToProneRun();
|
||||
}
|
||||
StandToProneRun()
|
||||
{
|
||||
StandToProne();
|
||||
ProneToProneRun();
|
||||
}
|
||||
CrouchRunToProne()
|
||||
{
|
||||
assertEX((self.a.pose == "crouch")||(self.a.pose == "stand"), "SetPoseMovement::CrouchRunToProne "+self.a.pose);
|
||||
assertEX((self.a.movement == "run"||self.a.movement == "walk"), "SetPoseMovement::CrouchRunToProne "+self.a.movement);
|
||||
pronetime = 0.5;
|
||||
self setProneAnimNodes( -45, 45, %prone_legs_down, %exposed_aiming, %prone_legs_up );
|
||||
self EnterProneWrapper(proneTime);
|
||||
ProneLegsStraightTree(0.2);
|
||||
self call_overloaded_func( "animscripts\cover_prone", "UpdateProneWrapper", 0.1 );
|
||||
runDirection = animscripts\utility::getQuadrant ( self getMotionAngle() );
|
||||
diveanim = animArray("run_2_prone_dive", "move");
|
||||
localDeltaVector = GetMoveDelta (diveanim, 0, 1);
|
||||
endPoint = self LocalToWorldCoords( localDeltaVector );
|
||||
if (self maymovetopoint(endPoint))
|
||||
{
|
||||
PlayTransitionAnimation( diveanim, "prone", "stop", pronetime );
|
||||
}
|
||||
else
|
||||
{
|
||||
PlayTransitionAnimation( animArray("run_2_prone_gunsupport", "move"), "prone", "stop", pronetime );
|
||||
}
|
||||
}
|
||||
CrouchRunToProneWalk()
|
||||
{
|
||||
CrouchRunToProne();
|
||||
ProneToProneRun();
|
||||
}
|
||||
CrouchRunToProneRun()
|
||||
{
|
||||
CrouchRunToProne();
|
||||
ProneToProneRun();
|
||||
}
|
||||
PlayTransitionAnimationThread_WithoutWaitSetStates(transAnim, endPose, endMovement, endAiming, finalAnim, rate)
|
||||
{
|
||||
self endon ("killanimscript");
|
||||
self endon ("entered_pose" + endPose);
|
||||
PlayTransitionAnimationFunc(transAnim, endPose, endMovement, endAiming, finalAnim, rate, false);
|
||||
}
|
||||
PlayTransitionAnimation(transAnim, endPose, endMovement, endAiming, finalAnim, rate)
|
||||
{
|
||||
PlayTransitionAnimationFunc(transAnim, endPose, endMovement, endAiming, finalAnim, rate, true);
|
||||
}
|
||||
PlayTransitionAnimationFunc(transAnim, endPose, endMovement, endAiming, finalAnim, rate, waitSetStatesEnabled)
|
||||
{
|
||||
if (!IsDefined (rate))
|
||||
rate = 1;
|
||||
if (waitSetStatesEnabled)
|
||||
{
|
||||
self thread waitSetStates ( getanimlength(transAnim)/2.0, "killtimerscript", endPose);
|
||||
}
|
||||
self SetFlaggedAnimKnobAllRestart("transAnimDone2", transAnim, %body, 1, .2, rate);
|
||||
if (!IsDefined(self.a.pose))
|
||||
{
|
||||
self.pose = "undefined";
|
||||
}
|
||||
if (!IsDefined(self.a.movement))
|
||||
{
|
||||
self.movement = "undefined";
|
||||
}
|
||||
debugIdentifier = "";
|
||||
self animscripts\shared::DoNoteTracks("transAnimDone2", undefined, debugIdentifier);
|
||||
self notify ("killtimerscript");
|
||||
self.a.pose = endPose;
|
||||
self notify ("entered_pose" + endPose);
|
||||
self.a.movement = endMovement;
|
||||
if (endAiming)
|
||||
{
|
||||
self.a.alertness = "aiming";
|
||||
}
|
||||
else
|
||||
{
|
||||
self.a.alertness = "casual";
|
||||
}
|
||||
if (IsDefined(finalAnim))
|
||||
{
|
||||
self SetAnimKnobAll(finalAnim, %body, 1, 0.3, rate);
|
||||
}
|
||||
}
|
||||
waitSetStates ( timetowait, killmestring, endPose )
|
||||
{
|
||||
self endon("killanimscript");
|
||||
self endon ("death");
|
||||
self endon(killmestring);
|
||||
oldpose = self.a.pose;
|
||||
wait timetowait;
|
||||
if ( oldpose!="prone" && endPose =="prone" )
|
||||
{
|
||||
self call_overloaded_func( "animscripts\cover_prone", "UpdateProneWrapper", 0.1 );
|
||||
self EnterProneWrapper(1.0);
|
||||
}
|
||||
else if ( oldpose=="prone" && endPose !="prone" )
|
||||
{
|
||||
self ExitProneWrapper(1.0);
|
||||
self OrientMode ("face default");
|
||||
}
|
||||
}
|
||||
ProneLegsStraightTree(blendtime)
|
||||
{
|
||||
} |