1 #using scripts\shared\ai_shared;
2 #using scripts\shared\math_shared;
3 #using scripts\shared\ai\archetype_utility;
4 #using scripts\shared\ai\systems\animation_state_machine_utility;
5 #using scripts\shared\ai\systems\behavior_tree_utility;
6 #using scripts\shared\ai\systems\blackboard;
8 #insert scripts\shared\ai\systems\animation_state_machine.gsh;
9 #insert scripts\shared\ai\systems\behavior.gsh;
10 #insert scripts\shared\ai\systems\behavior_tree.gsh;
11 #insert scripts\shared\ai\systems\blackboard.gsh;
12 #insert scripts\shared\ai\utility.gsh;
13 #insert scripts\shared\shared.gsh;
18 #define COVER_AIM_ANGLE_EPSILON 10 // 10 degree allowable threshold for aims against the aimtables
77 if( IsAlive( behaviorTreeEntity ) )
88 return IsDefined( behaviorTreeEntity.node );
109 if ( IsDefined( behaviorTreeEntity.node ) )
129 if( !IsDefined( behaviorTreeEntity.node ) ||
130 !IsDefined( behaviorTreeEntity.node.type ) ||
131 !IsDefined( behaviorTreeEntity.enemy) ||
132 !IsDefined( behaviorTreeEntity.enemy.origin ) )
137 yawToEnemyPosition = AiUtility::GetAimYawToEnemyFromNode( behaviorTreeEntity, behaviorTreeEntity.node, behaviorTreeEntity.enemy );
160 if ( supportsRight && supportsLeft )
170 if ( !legalAimYaw && supportsRight )
182 if ( behaviorTreeEntity ASMIsTransitionRunning() )
212 if ( IsDefined( behaviorTreeEntity.node ) )
214 if ( !IsInArray( GetValidCoverPeekOuts( behaviorTreeEntity.node ),
COVER_MODE_OVER ) )
240 if ( !IsDefined( entity.node ) ||
241 !IsDefined( entity.node.type ) ||
242 !IsDefined( entity.enemy) ||
243 !IsDefined( entity.enemy.origin ) )
251 aimLimitsForCover = entity GetAimLimitsFromEntry( aimTable );
253 yawToEnemyPosition = AiUtility::GetAimYawToEnemyFromNode( entity, entity.node, entity.enemy );
263 pitchToEnemyPosition = AiUtility::GetAimPitchToEnemyFromNode( entity, entity.node, entity.enemy );
268 if ( !legalAimPitch )
300 if( !behaviorTreeEntity ASMIsTransitionRunning() )
318 behaviorTreeEntity IsAtCoverNodeStrict() &&
319 behaviorTreeEntity IsFlankedAtCoverNode() &&
320 !behaviorTreeEntity HasPath();
330 if( IsDefined( behaviorTreeEntity.enemy ) )
333 behaviorTreeEntity GetPerfectInfo( behaviorTreeEntity.enemy );
336 behaviorTreeEntity PathMode(
"move delayed",
false, 2 );
348 behaviorTreeEntity.newEnemyReaction =
false;
355 #define NEAR_NODE_DIST_SQR SQR(24)
358 if ( IsDefined( behaviorTreeEntity.node ) &&
361 if ( DistanceSquared( behaviorTreeEntity.origin, behaviorTreeEntity.node.origin ) <=
NEAR_NODE_DIST_SQR )
373 return behaviorTreeEntity IsAtCoverNodeStrict() &&
374 behaviorTreeEntity ShouldUseCoverNode() &&
375 !behaviorTreeEntity HasPath();
380 return behaviorTreeEntity IsAtCoverNodeStrict() &&
381 !behaviorTreeEntity HasPath();
400 return behaviorTreeEntity IsAtCoverNodeStrict() && !behaviorTreeEntity ShouldUseCoverNode();
410 if(
IS_TRUE( behaviorTreeEntity.node.script_onlyidle ) )
421 return behaviorTreeEntity.suppressionMeter > behaviorTreeEntity.suppressionThreshold;
440 if ( !IsDefined( behaviorTreeEntity.node ) )
453 if( IsDefined( behaviorTreeEntity.treatAllCoversAsGeneric ) )
455 if ( !IsDefined( stepOut ) )
491 if ( IsDefined( behaviorTreeEntity.enemy ) )
493 yawToEnemyPosition = AiUtility::GetAimYawToEnemyFromNode( behaviorTreeEntity, behaviorTreeEntity.node, behaviorTreeEntity.enemy );
498 if ( legalRightDirectionYaw )
505 return coverDirection;
526 if ( IsDefined( behaviorTreeEntity.enemy ) )
528 yawToEnemyPosition = AiUtility::GetAimYawToEnemyFromNode( behaviorTreeEntity, behaviorTreeEntity.node, behaviorTreeEntity.enemy );
533 if ( legalRightDirectionYaw )
541 return coverDirection;
546 behaviorTreeEntity.coverShootStartTime = undefined;
551 behaviorTreeEntity.coverShootStartTime = GetTime();
556 return IsDefined( behaviorTreeEntity.canBeFlanked ) && behaviorTreeEntity.canBeFlanked;