‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
archetype_human_cover.gsc
Go to the documentation of this file.
1 // COMMON AI SYSTEMS INCLUDES
2 #using scripts\shared\ai_shared;
3 #using scripts\shared\ai_shared;
4 #using scripts\shared\ai\systems\ai_blackboard;
5 #using scripts\shared\ai\systems\ai_interface;
6 #using scripts\shared\ai\systems\animation_state_machine_utility;
7 #using scripts\shared\ai\systems\behavior_tree_utility;
8 #using scripts\shared\ai\systems\blackboard;
9 
10 #insert scripts\shared\ai\systems\animation_state_machine.gsh;
11 #insert scripts\shared\ai\systems\blackboard.gsh;
12 #insert scripts\shared\ai\systems\behavior.gsh;
13 #insert scripts\shared\ai\systems\behavior_tree.gsh;
14 
15 // ADDITIONAL INCLUDES
16 #using scripts\shared\ai\archetype_utility;
17 #using scripts\shared\ai\archetype_cover_utility;
18 #using scripts\shared\array_shared;
19 #using scripts\shared\laststand_shared;
20 
21 #insert scripts\shared\ai\utility.gsh;
22 #insert scripts\shared\shared.gsh;
23 
25 {
26  ‪BT_REGISTER_API( "shouldReturnToCoverCondition", &‪shouldReturnToCoverCondition );
27  ‪BT_REGISTER_API( "shouldReturnToSuppressedCover", &‪shouldReturnToSuppressedCover );
28 
29  ‪BT_REGISTER_API( "shouldAdjustToCover", &‪shouldAdjustToCover );
30  ‪BT_REGISTER_API( "prepareForAdjustToCover", &‪prepareForAdjustToCover );
31 
32  ‪BT_REGISTER_API( "coverBlindfireShootStart", &‪coverBlindfireShootActionStart );
33 
34  ‪BT_REGISTER_API( "canChangeStanceAtCoverCondition", &‪canChangeStanceAtCoverCondition );
35  ‪BT_REGISTER_API( "coverChangeStanceActionStart", &‪coverChangeStanceActionStart );
36 
37  ‪BT_REGISTER_API( "prepareToChangeStanceToStand", &‪prepareToChangeStanceToStand );
38  ‪BT_REGISTER_API( "cleanUpChangeStanceToStand", &‪cleanUpChangeStanceToStand );
39 
40  ‪BT_REGISTER_API( "prepareToChangeStanceToCrouch", &‪prepareToChangeStanceToCrouch );
41  ‪BT_REGISTER_API( "cleanUpChangeStanceToCrouch", &‪cleanUpChangeStanceToCrouch );
42 
43  ‪BT_REGISTER_API( "shouldVantageAtCoverCondition", &‪shouldVantageAtCoverCondition );
44  ‪BT_REGISTER_API( "supportsVantageCoverCondition", &‪supportsVantageCoverCondition );
45  ‪BT_REGISTER_API( "coverVantageInitialize", &‪coverVantageInitialize );
46 
47  ‪BT_REGISTER_API( "shouldThrowGrenadeAtCoverCondition", &‪shouldThrowGrenadeAtCoverCondition );
48  ‪BT_REGISTER_API( "coverPrepareToThrowGrenade", &‪coverPrepareToThrowGrenade );
49  ‪BT_REGISTER_API( "coverCleanUpToThrowGrenade", &‪coverCleanUpToThrowGrenade );
50 
51  ‪BT_REGISTER_API( "senseNearbyPlayers", &‪senseNearbyPlayers );
52 }
53 
54 function ‪shouldThrowGrenadeAtCoverCondition( behaviorTreeEntity, throwIfPossible = false )
55 {
56  // sjakatdar - Please do not use level.AIDisableGrenadeThrows, not a preferred method to disable grenades by script. Only used by campaign zombies.
57  if( ‪IS_TRUE(level.AIDisableGrenadeThrows) )
58  {
59  return false;
60  }
61 
62  if( !IsDefined( behaviorTreeEntity.enemy ) )
63  {
64  return false;
65  }
66 
67  if ( !IsSentient( behaviorTreeEntity.enemy ) )
68  {
69  return false;
70  }
71 
72  if ( IsVehicle( behaviorTreeEntity.enemy ) && behaviorTreeEntity.enemy.vehicleclass === "helicopter" )
73  {
74  return false;
75  }
76 
77  if ( ‪ai::HasAiAttribute( behaviorTreeEntity, "useGrenades" ) && !‪ai::GetAiAttribute( behaviorTreeEntity, "useGrenades" ) )
78  {
79  return false;
80  }
81 
82  // Only throw a grenade if the enemy is within 60 degrees to the left or right of where the actor or the actor's node is facing.
83  entityAngles = behaviorTreeEntity.angles;
84 
85  if ( IsDefined( behaviorTreeEntity.node ) &&
86  ‪NODE_TYPE_COVER( behaviorTreeEntity.node ) &&
87  behaviorTreeEntity IsAtCoverNodeStrict() )
88  {
89  entityAngles = behaviorTreeEntity.node.angles;
90  }
91 
92  toEnemy = behaviorTreeEntity.enemy.origin - behaviorTreeEntity.origin;
93  toEnemy = VectorNormalize( ( toEnemy[0], toEnemy[1], 0 ) );
94 
95  entityForward = AnglesToForward( entityAngles );
96  entityForward = VectorNormalize( ( entityForward[0], entityForward[1], 0 ) );
97 
98  // cos( 60 degrees ) = 0.5
99  if ( VectorDot( toEnemy, entityForward ) < 0.5 )
100  {
101  return false;
102  }
103 
104  if ( !throwIfPossible )
105  {
106  // Don't throw grenades at enemys that are next to players.
107  if ( behaviorTreeEntity.team === "allies" )
108  {
109  foreach( player in level.players )
110  {
111  if( DistanceSquared( behaviorTreeEntity.enemy.origin, player.origin ) <= ‪ALLIED_GRENADE_SAFE_DIST_SQ )
112  {
113  return false;
114  }
115  }
116  }
117 
118  // Don't throw grenades at enemies that are close to laststand players.
119  foreach( player in level.players )
120  {
121  if ( player ‪laststand::player_is_in_laststand() &&
122  DistanceSquared( behaviortreeentity.enemy.origin, player.origin ) <= ‪LASTSTAND_GRENADE_SAFE_DIST_SQ )
123  {
124  return false;
125  }
126  }
127 
128  // if there was a grenade thrown by the same team recently, don't throw another one
129  grenadeThrowInfos = ‪Blackboard::GetBlackboardEvents( "team_grenade_throw" );
130  foreach ( grenadeThrowInfo in grenadeThrowInfos )
131  {
132  if( grenadeThrowInfo.data.grenadeThrowerTeam === behaviorTreeEntity.team )
133  {
134  return false;
135  }
136  }
137 
138  // if there was a grenade that was thrown at the enemy recently, then dont throw it again
139  grenadeThrowInfos = ‪Blackboard::GetBlackboardEvents( "human_grenade_throw" );
140 
141  foreach ( grenadeThrowInfo in grenadeThrowInfos )
142  {
143  if( IsDefined( grenadeThrowInfo.data.grenadeThrownAt ) && IsAlive( grenadeThrowInfo.data.grenadeThrownAt ) )
144  {
145  if( grenadeThrowInfo.data.grenadeThrower == behaviorTreeEntity )
146  {
147  return false;
148  }
149 
150  if( IsDefined( grenadeThrowInfo.data.grenadeThrownAt ) &&
151  grenadeThrowInfo.data.grenadeThrownAt == behaviorTreeEntity.enemy )
152  {
153  return false;
154  }
155 
156  if ( IsDefined( grenadeThrowInfo.data.grenadeThrownPosition ) &&
157  IsDefined( behaviorTreeEntity.grenadeThrowPosition ) &&
158  DistanceSquared( grenadeThrowInfo.data.grenadeThrownPosition, behaviorTreeEntity.grenadeThrowPosition ) <= ‪GRENADE_OVERLAP_DIST_SQ )
159  {
160  // Prevent too many grenades in the same area.
161  return false;
162  }
163  }
164  }
165  }
166 
167  throw_dist = Distance2DSquared( behaviorTreeEntity.origin, behaviorTreeEntity LastKnownPos( behaviorTreeEntity.enemy ) );
168  if ( throw_dist < MIN_GRENADE_THROW_DIST_SQ || throw_dist > ‪MAX_GRENADE_THROW_DIST_SQ )
169  {
170  return false;
171  }
172 
173  arm_offset = ‪TEMP_get_arm_offset( behaviorTreeEntity, behaviorTreeEntity LastKnownPos( behaviorTreeEntity.enemy ) );
174  throw_vel = behaviorTreeEntity CanThrowGrenadePos( arm_offset, behaviorTreeEntity LastKnownPos( behaviorTreeEntity.enemy ) );
175 
176  if ( !IsDefined( throw_vel ) )
177  {
178  return false;
179  }
180 
181  return true;
182 }
183 
184 #define SENSE_DISTANCE 360
185 #define SENSE_DISTANCE_SQ SQR(SENSE_DISTANCE)
186 function private ‪senseNearbyPlayers( entity )
187 {
188  players = GetPlayers();
189 
190  foreach ( player in players )
191  {
192  distanceSq = DistanceSquared( player.origin, entity.origin );
193 
194  if ( distanceSq <= ‪SENSE_DISTANCE_SQ )
195  {
196  distanceToPlayer = Sqrt( distanceSq );
197 
198  chanceToDetect = RandomFloat( 1.0 );
199 
200  if ( chanceToDetect < ( distanceToPlayer / ‪SENSE_DISTANCE ) )
201  {
202  entity GetPerfectInfo( player );
203  }
204  }
205  }
206 }
207 
208 function private ‪coverPrepareToThrowGrenade( behaviorTreeEntity )
209 {
211 
212  if ( IsDefined( behaviorTreeEntity.enemy ) )
213  {
214  behaviorTreeEntity.grenadeThrowPosition = behaviorTreeEntity LastKnownPos( behaviorTreeEntity.enemy );
215  }
216 
217  grenadeThrowInfo = SpawnStruct();
218  grenadeThrowInfo.grenadeThrower = behaviorTreeEntity;
219  grenadeThrowInfo.grenadeThrownAt = behaviorTreeEntity.enemy;
220  grenadeThrowInfo.grenadeThrownPosition = behaviorTreeEntity.grenadeThrowPosition;
221  ‪Blackboard::AddBlackboardEvent( "human_grenade_throw", grenadeThrowInfo, RandomIntRange( ‪MIN_GRENADE_THROW_TIME, ‪MAX_GRENADE_THROW_TIME ) );
222 
223  grenadeThrowInfo = SpawnStruct();
224  grenadeThrowInfo.grenadeThrowerTeam = behaviorTreeEntity.team;
225  ‪Blackboard::AddBlackboardEvent( "team_grenade_throw", grenadeThrowInfo, RandomIntRange( ‪MIN_GRENADE_TEAM_TIME, ‪MAX_GRENADE_TEAM_TIME ) );
226 
227  behaviorTreeEntity.prepareGrenadeAmmo = behaviorTreeEntity.grenadeammo;
228 }
229 
230 function private ‪coverCleanUpToThrowGrenade( behaviorTreeEntity )
231 {
232  ‪AiUtility::resetCoverParameters( behaviorTreeEntity );
233 
234  if ( behaviorTreeEntity.prepareGrenadeAmmo == behaviorTreeEntity.grenadeammo )
235  {
236  // Actor was killed before being able to drop a grenade, drop one instead.
237  if ( behaviorTreeEntity.health <= 0 )
238  {
239  grenade = undefined;
240 
241  // Need someone living to spawn the dropped grenade, otherwise it cannot be picked up.
242  if ( IsActor( behaviorTreeEntity.enemy ) && IsDefined( behaviorTreeEntity.grenadeweapon ) )
243  {
244  grenade = behaviorTreeEntity.enemy MagicGrenadeType(
245  behaviorTreeEntity.grenadeweapon,
246  behaviorTreeEntity GetTagOrigin( "j_wrist_ri" ),
247  (0, 0, 0),
248  behaviorTreeEntity.grenadeweapon.aifusetime / 1000 );
249  }
250  else if ( IsPlayer( behaviorTreeEntity.enemy ) && IsDefined( behaviorTreeEntity.grenadeweapon ) )
251  {
252  grenade = behaviorTreeEntity.enemy MagicGrenadePlayer(
253  behaviorTreeEntity.grenadeweapon,
254  behaviorTreeEntity GetTagOrigin( "j_wrist_ri" ),
255  (0, 0, 0) );
256  }
257 
258  if ( IsDefined( grenade ) )
259  {
260  grenade.owner = behaviorTreeEntity;
261  grenade.team = behaviorTreeEntity.team;
262  // Since the grenade is spawned so closely to the actor, disable collision against the actor.
263  grenade SetContents( grenade SetContents( 0 ) & ~( ‪CONTENTS_ACTOR | ‪CONTENTS_CORPSE | ‪CONTENTS_VEHICLE | ‪CONTENTS_PLAYER ) );
264  }
265  }
266  }
267 }
268 
269 function private ‪canChangeStanceAtCoverCondition( behaviorTreeEntity )
270 {
271  switch ( ‪Blackboard::GetBlackBoardAttribute( behaviorTreeEntity, ‪STANCE ) )
272  {
273  case ‪STANCE_STAND:
274  return ‪AiUtility::isStanceAllowedAtNode( ‪STANCE_CROUCH, behaviorTreeEntity.node );
275  case ‪STANCE_CROUCH:
276  return ‪AiUtility::isStanceAllowedAtNode( ‪STANCE_STAND, behaviorTreeEntity.node );
277  }
278 
279  return false;
280 }
281 
282 function private ‪shouldReturnToSuppressedCover( entity )
283 {
284  if ( !entity IsAtGoal() )
285  {
286  return true;
287  }
288 
289  return false;
290 }
291 
292 function private ‪shouldReturnToCoverCondition( behaviorTreeEntity )
293 {
294  if ( behaviorTreeEntity ASMIsTransitionRunning() )
295  {
296  return false;
297  }
298 
299  if ( IsDefined( behaviorTreeEntity.coverShootStartTime ) )
300  {
301  // take a few shots before returning
302  if ( GetTime() < behaviorTreeEntity.coverShootStartTime + ‪COVER_SHOOT_MIN_TIME )
303  {
304  return false;
305  }
306 
307  // try to finish off enemy
308  if ( IsDefined( behaviorTreeEntity.enemy ) &&
309  IsPlayer( behaviorTreeEntity.enemy ) &&
310  behaviorTreeEntity.enemy.health < behaviorTreeEntity.enemy.maxHealth * 0.5 )
311  {
312  if ( GetTime() < behaviorTreeEntity.coverShootStartTime + ‪COVER_SHOOT_TAKEDOWN_TIME )
313  {
314  return false;
315  }
316  }
317  }
318 
319  if ( ‪AiUtility::isSuppressedAtCoverCondition( behaviorTreeEntity ) )
320  {
321  return true;
322  }
323 
324  if ( !behaviorTreeEntity IsAtGoal() )
325  {
326  // AI's that lean out of cover can fall outside of a very small goalradius, use the node's position instead.
327  if ( IsDefined( behaviorTreeEntity.node ) )
328  {
329  offsetOrigin = behaviorTreeEntity GetNodeOffsetPosition( behaviorTreeEntity.node );
330 
331  return !behaviorTreeEntity IsPosAtGoal( offsetOrigin );
332  }
333 
334  return true;
335  }
336 
337  if ( !behaviorTreeEntity IsSafeFromGrenade() )
338  {
339  return true;
340  }
341 
342  return false;
343 }
344 
345 function private ‪shouldAdjustToCover( behaviorTreeEntity )
346 {
347  if( !IsDefined( behaviorTreeEntity.node ) )
348  {
349  return false;
350  }
351 
352  // if the current stance is crouch, and highest supported stance for the node is crouch too then,
353  // there are no animations for that. Just do a pure animation blend.
354  highestSupportedStance = ‪AiUtility::getHighestNodeStance( behaviorTreeEntity.node );
355  currentStance = ‪Blackboard::GetBlackBoardAttribute( behaviorTreeEntity, ‪STANCE );
356 
357  if( currentStance == ‪STANCE_CROUCH && highestSupportedStance == ‪STANCE_CROUCH )
358  {
359  return false;
360  }
361 
362  // if AI has just arrived at this cover node ( meaning previousCoverMode != COVER_ALERT_MODE )
363  // That means he needs to adjust to the cover for the first time
364  coverMode = ‪Blackboard::GetBlackBoardAttribute( behaviorTreeEntity, ‪COVER_MODE );
365  previousCoverMode = ‪Blackboard::GetBlackBoardAttribute( behaviorTreeEntity, ‪PREVIOUS_COVER_MODE );
366 
367  if ( coverMode != ‪COVER_ALERT_MODE && previousCoverMode != ‪COVER_ALERT_MODE && !behaviorTreeEntity.keepClaimedNode )
368  {
369  return true;
370  }
371 
372  // if somehow the AI is at the covernode with appropriate COVER_MODE, but unsupported stance, then
373  // let him adjust to the cover node.
374  if( !‪AiUtility::isStanceAllowedAtNode( currentStance, behaviorTreeEntity.node ) )
375  {
376  return true;
377  }
378 
379  return false;
380 }
381 
382 
383 // ------- COVER - VANTAGE SHOOT BEHAVIOR -----------//
384 // TODO - Fix and enable vantage behavior.
385 function private ‪shouldVantageAtCoverCondition( behaviorTreeEntity )
386 {
387  if( !IsDefined( behaviorTreeEntity.node ) ||
388  !IsDefined( behaviorTreeEntity.node.type ) ||
389  !IsDefined( behaviorTreeEntity.enemy) ||
390  !IsDefined( behaviorTreeEntity.enemy.origin ) )
391  {
392  return false;
393  }
394 
395  yawToEnemyPosition = AiUtility::GetAimYawToEnemyFromNode( behaviorTreeEntity, behaviorTreeEntity.node, behaviorTreeEntity.enemy );
396  pitchToEnemyPosition = AiUtility::GetAimPitchToEnemyFromNode( behaviorTreeEntity, behaviorTreeEntity.node, behaviorTreeEntity.enemy );
397  aimLimitsForCover = behaviortreeentity GetAimLimitsFromEntry(‪AIM_LIMIT_TABLE_ENTRY_COVER_VANTAGE);
398 
399  legalAim = false;
400 
401  // allow vantage aiming if our target is within the 25 to 85 degree arc in front of us and 3 or more feet below us
402  if ( yawToEnemyPosition < aimLimitsForCover[‪AIM_LEFT] &&
403  yawToEnemyPosition > aimLimitsForCover[‪AIM_RIGHT] &&
404  pitchToEnemyPosition < 85.0 &&
405  pitchToEnemyPosition > 25.0 &&
406  ( behaviorTreeEntity.node.origin[2] - behaviorTreeEntity.enemy.origin[2] ) >= ( 3 * 12 ) )
407  {
408  legalAim = true;
409  }
410 
411  return legalAim;
412 }
413 
414 function private ‪supportsVantageCoverCondition( behaviorTreeEntity )
415 {
416  return false;
417 
418  /*
419  coverMode = Blackboard::GetBlackBoardAttribute( behaviorTreeEntity, COVER_MODE );
420 
421  if ( IsDefined( behaviorTreeEntity.node ) && IsDefined( coverMode ) && coverMode == COVER_ALERT_MODE )
422  {
423  if( NODE_COVER_CROUCH( behaviorTreeEntity.node ) || NODE_COVER_STAND( behaviorTreeEntity.node ) )
424  {
425  return true;
426  }
427  }
428 
429  return false;
430  */
431 }
432 
433 function private ‪coverVantageInitialize( behaviorTreeEntity, asmStateName )
434 {
435  ‪AiUtility::keepClaimNode( behaviorTreeEntity );
437 }
438 
439 // ------- COVER - BLINDFIRE SHOOT BEHAVIOR -----------//
440 function private ‪coverBlindfireShootActionStart( behaviorTreeEntity, asmStateName )
441 {
442  ‪AiUtility::keepClaimNode( behaviorTreeEntity );
444  ‪AiUtility::chooseCoverDirection( behaviorTreeEntity );
445 }
446 
447 // ------- COVER - CHANGE STANCE BEHAVIOR -----------//
448 function private ‪prepareToChangeStanceToStand( behaviorTreeEntity, asmStateName )
449 {
450  ‪AiUtility::cleanupCoverMode( behaviorTreeEntity );
452 }
453 
454 function private ‪cleanUpChangeStanceToStand( behaviorTreeEntity, asmStateName )
455 {
456  ‪AiUtility::releaseClaimNode( behaviorTreeEntity );
457  behaviorTreeEntity.newEnemyReaction = false;
458 }
459 
460 function private ‪prepareToChangeStanceToCrouch( behaviorTreeEntity, asmStateName )
461 {
462  ‪AiUtility::cleanupCoverMode( behaviorTreeEntity );
464 }
465 
466 function private ‪cleanUpChangeStanceToCrouch( behaviorTreeEntity, asmStateName )
467 {
468  ‪AiUtility::releaseClaimNode( behaviorTreeEntity );
469  behaviorTreeEntity.newEnemyReaction = false;
470 }
471 
472 // ------- COVER - ADJUST STANCE BEHAVIOR -----------//
473 function private ‪prepareForAdjustToCover( behaviorTreeEntity, asmStateName )
474 {
475  ‪AiUtility::keepClaimNode( behaviorTreeEntity );
476 
477  highestSupportedStance = ‪AiUtility::getHighestNodeStance( behaviorTreeEntity.node );
478  ‪Blackboard::SetBlackBoardAttribute( behaviorTreeEntity, ‪DESIRED_STANCE, highestSupportedStance );
479 }
480 
481 // ------- COVER - CHANGE STANCE BEHAVIOR -----------
482 function private ‪coverChangeStanceActionStart( behaviorTreeEntity, asmStateName )
483 {
485  ‪AiUtility::keepClaimNode( behaviorTreeEntity );
486 
487  switch ( ‪Blackboard::GetBlackBoardAttribute( behaviorTreeEntity, ‪STANCE ) )
488  {
489  case ‪STANCE_STAND:
491  break;
492  case ‪STANCE_CROUCH:
494  break;
495  }
496 }
497 
498 #define COVER_AIM_ANGLE_EPSILON 10
499 
500 function ‪TEMP_get_arm_offset( behaviorTreeEntity, throwPosition )
501 {
502  stance = ‪Blackboard::GetBlackBoardAttribute( behaviorTreeEntity, ‪STANCE );
503  arm_offset = undefined;
504 
505  // ( forward/back, left/right, up/down )
506  if ( stance == ‪STANCE_CROUCH )
507  {
508  arm_offset = ( 13, -1, 56 );
509  }
510  else
511  {
512  arm_offset = ( 14, -3, 80 );
513  }
514 
515  if( IsDefined( behaviorTreeEntity.node ) && behaviorTreeEntity IsAtCoverNodeStrict() )
516  {
517  if( ‪NODE_COVER_LEFT(behaviorTreeEntity.node) )
518  {
519  if ( stance == ‪STANCE_CROUCH )
520  {
521  arm_offset = ( -38, 15, 23 );
522  }
523  else
524  {
525  arm_offset = ( -45, 0, 40 );
526  }
527  }
528  else if( ‪NODE_COVER_RIGHT(behaviorTreeEntity.node) )
529  {
530  if ( stance == ‪STANCE_CROUCH )
531  {
532  arm_offset = ( 46, 12, 26 );
533  }
534  else
535  {
536  arm_offset = ( 34, -21, 50 );
537  }
538  }
539  else if( ‪NODE_COVER_STAND(behaviorTreeEntity.node) )
540  {
541  arm_offset = ( 10, 7, 77 );
542  }
543  else if( ‪NODE_COVER_CROUCH(behaviorTreeEntity.node) )
544  {
545  arm_offset = ( 19, 5, 60 );
546  }
547  else if( ‪NODE_COVER_PILLAR(behaviorTreeEntity.node) )
548  {
549  leftOffset = undefined;
550  rightOffset = undefined;
551 
552  if ( stance == ‪STANCE_CROUCH )
553  {
554  leftOffset = ( -20, 0, 35 );
555  rightOffset = ( 34, 6, 50 );
556  }
557  else
558  {
559  leftOffset = ( -24, 0, 76 );
560  rightOffset = ( 24, 0, 76 );
561  }
562 
563  if( ‪ISNODEDONTLEFT( behaviorTreeEntity.node ) )
564  {
565  arm_offset = rightOffset;
566  }
567  else if( ‪ISNODEDONTRIGHT( behaviorTreeEntity.node ) )
568  {
569  arm_offset = leftOffset;
570  }
571  else
572  {
573  yawToEnemyPosition = AngleClamp180( VectorToAngles( throwPosition - behaviorTreeEntity.node.origin )[1] - behaviorTreeEntity.node.angles[1] );
574  aimLimitsForDirectionRight = behaviortreeentity GetAimLimitsFromEntry( ‪AIM_LIMIT_TABLE_ENTRY_PILLAR_RIGHT_LEAN );
575 
576  legalRightDirectionYaw = yawToEnemyPosition >= ( aimLimitsForDirectionRight[‪AIM_RIGHT] - ‪COVER_AIM_ANGLE_EPSILON ) && yawToEnemyPosition <= 0;
577 
578  if( legalRightDirectionYaw )
579  {
580  arm_offset = rightOffset;
581  }
582  else
583  {
584  arm_offset = leftOffset;
585  }
586  }
587  }
588  }
589 
590  return arm_offset;
591 }
‪senseNearbyPlayers
‪function private senseNearbyPlayers(entity)
Definition: archetype_human_cover.gsc:186
‪COVER_MODE
‪#define COVER_MODE
Definition: blackboard.gsh:41
‪MAX_GRENADE_THROW_DIST_SQ
‪#define MAX_GRENADE_THROW_DIST_SQ
Definition: behavior.gsh:37
‪CONTENTS_ACTOR
‪#define CONTENTS_ACTOR
Definition: shared.gsh:112
‪ALLIED_GRENADE_SAFE_DIST_SQ
‪#define ALLIED_GRENADE_SAFE_DIST_SQ
Definition: behavior.gsh:49
‪cleanupCoverMode
‪function cleanupCoverMode(behaviorTreeEntity)
Definition: archetype_cover_utility.gsc:564
‪BT_REGISTER_API
‪#define BT_REGISTER_API(name, function)
Definition: behavior.gsh:1
‪NODE_TYPE_COVER
‪#define NODE_TYPE_COVER(_node)
Definition: utility.gsh:17
‪COVER_BLIND_MODE
‪#define COVER_BLIND_MODE
Definition: blackboard.gsh:110
‪NODE_COVER_STAND
‪#define NODE_COVER_STAND(_node)
Definition: utility.gsh:9
‪COVER_VANTAGE_MODE
‪#define COVER_VANTAGE_MODE
Definition: blackboard.gsh:112
‪shouldAdjustToCover
‪function private shouldAdjustToCover(behaviorTreeEntity)
Definition: archetype_human_cover.gsc:345
‪CONTENTS_VEHICLE
‪#define CONTENTS_VEHICLE
Definition: shared.gsh:119
‪NODE_COVER_PILLAR
‪#define NODE_COVER_PILLAR(_node)
Definition: utility.gsh:8
‪NODE_COVER_LEFT
‪#define NODE_COVER_LEFT(_node)
Definition: utility.gsh:6
‪isStanceAllowedAtNode
‪function isStanceAllowedAtNode(stance, node)
Definition: archetype_utility.gsc:2094
‪coverBlindfireShootActionStart
‪function private coverBlindfireShootActionStart(behaviorTreeEntity, asmStateName)
Definition: archetype_human_cover.gsc:440
‪resetCoverParameters
‪function resetCoverParameters(behaviorTreeEntity)
Definition: archetype_cover_utility.gsc:430
‪TEMP_get_arm_offset
‪function TEMP_get_arm_offset(behaviorTreeEntity, throwPosition)
Definition: archetype_human_cover.gsc:500
‪HasAiAttribute
‪function HasAiAttribute(entity, attribute)
Definition: ai_interface.gsc:132
‪SetBlackBoardAttribute
‪function SetBlackBoardAttribute(entity, attributeName, attributeValue)
Definition: blackboard.gsc:56
‪prepareToChangeStanceToCrouch
‪function private prepareToChangeStanceToCrouch(behaviorTreeEntity, asmStateName)
Definition: archetype_human_cover.gsc:460
‪shouldVantageAtCoverCondition
‪function private shouldVantageAtCoverCondition(behaviorTreeEntity)
Definition: archetype_human_cover.gsc:385
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪GetBlackBoardAttribute
‪function GetBlackBoardAttribute(entity, attributeName)
Definition: blackboard.gsc:32
‪coverPrepareToThrowGrenade
‪function private coverPrepareToThrowGrenade(behaviorTreeEntity)
Definition: archetype_human_cover.gsc:208
‪coverChangeStanceActionStart
‪function private coverChangeStanceActionStart(behaviorTreeEntity, asmStateName)
Definition: archetype_human_cover.gsc:482
‪keepClaimedNodeAndChooseCoverDirection
‪function keepClaimedNodeAndChooseCoverDirection(behaviorTreeEntity)
Definition: archetype_cover_utility.gsc:424
‪LASTSTAND_GRENADE_SAFE_DIST_SQ
‪#define LASTSTAND_GRENADE_SAFE_DIST_SQ
Definition: behavior.gsh:50
‪shouldReturnToSuppressedCover
‪function private shouldReturnToSuppressedCover(entity)
Definition: archetype_human_cover.gsc:282
‪COVER_SHOOT_MIN_TIME
‪#define COVER_SHOOT_MIN_TIME
Definition: behavior.gsh:84
‪AIM_LIMIT_TABLE_ENTRY_COVER_VANTAGE
‪#define AIM_LIMIT_TABLE_ENTRY_COVER_VANTAGE
Definition: blackboard.gsh:268
‪STANCE
‪#define STANCE
Definition: blackboard.gsh:36
‪STANCE_STAND
‪#define STANCE_STAND
Definition: blackboard.gsh:273
‪RegisterBehaviorScriptfunctions
‪function autoexec RegisterBehaviorScriptfunctions()
Definition: archetype_human_cover.gsc:24
‪DESIRED_STANCE
‪#define DESIRED_STANCE
Definition: blackboard.gsh:18
‪supportsVantageCoverCondition
‪function private supportsVantageCoverCondition(behaviorTreeEntity)
Definition: archetype_human_cover.gsc:414
‪prepareForAdjustToCover
‪function private prepareForAdjustToCover(behaviorTreeEntity, asmStateName)
Definition: archetype_human_cover.gsc:473
‪NODE_COVER_RIGHT
‪#define NODE_COVER_RIGHT(_node)
Definition: utility.gsh:7
‪AIM_LEFT
‪#define AIM_LEFT
Definition: blackboard.gsh:257
‪coverVantageInitialize
‪function private coverVantageInitialize(behaviorTreeEntity, asmStateName)
Definition: archetype_human_cover.gsc:433
‪ISNODEDONTRIGHT
‪#define ISNODEDONTRIGHT(__node)
Definition: utility.gsh:2
‪cleanUpChangeStanceToStand
‪function private cleanUpChangeStanceToStand(behaviorTreeEntity, asmStateName)
Definition: archetype_human_cover.gsc:454
‪COVER_AIM_ANGLE_EPSILON
‪#define COVER_AIM_ANGLE_EPSILON
Definition: archetype_human_cover.gsc:498
‪AIM_LIMIT_TABLE_ENTRY_PILLAR_RIGHT_LEAN
‪#define AIM_LIMIT_TABLE_ENTRY_PILLAR_RIGHT_LEAN
Definition: blackboard.gsh:270
‪AddBlackboardEvent
‪function AddBlackboardEvent(eventName, data, timeToLiveInMillis)
Definition: ai_blackboard.gsc:47
‪ISNODEDONTLEFT
‪#define ISNODEDONTLEFT(__node)
Definition: utility.gsh:3
‪releaseClaimNode
‪function releaseClaimNode(behaviorTreeEntity)
Definition: archetype_utility.gsc:2188
‪SENSE_DISTANCE_SQ
‪#define SENSE_DISTANCE_SQ
Definition: archetype_human_cover.gsc:185
‪CONTENTS_CORPSE
‪#define CONTENTS_CORPSE
Definition: shared.gsh:122
‪keepClaimNode
‪function keepClaimNode(behaviorTreeEntity)
Definition: archetype_utility.gsc:2181
‪isSuppressedAtCoverCondition
‪function isSuppressedAtCoverCondition(behaviorTreeEntity)
Definition: archetype_cover_utility.gsc:418
‪GetAiAttribute
‪function GetAiAttribute(entity, attribute)
Definition: ai_interface.gsc:118
‪MIN_GRENADE_THROW_TIME
‪#define MIN_GRENADE_THROW_TIME
Definition: behavior.gsh:46
‪chooseCoverDirection
‪function chooseCoverDirection(behaviorTreeEntity, stepOut)
Definition: archetype_cover_utility.gsc:438
‪canChangeStanceAtCoverCondition
‪function private canChangeStanceAtCoverCondition(behaviorTreeEntity)
Definition: archetype_human_cover.gsc:269
‪GRENADE_OVERLAP_DIST_SQ
‪#define GRENADE_OVERLAP_DIST_SQ
Definition: behavior.gsh:48
‪cleanUpChangeStanceToCrouch
‪function private cleanUpChangeStanceToCrouch(behaviorTreeEntity, asmStateName)
Definition: archetype_human_cover.gsc:466
‪PREVIOUS_COVER_MODE
‪#define PREVIOUS_COVER_MODE
Definition: blackboard.gsh:42
‪coverCleanUpToThrowGrenade
‪function private coverCleanUpToThrowGrenade(behaviorTreeEntity)
Definition: archetype_human_cover.gsc:230
‪player_is_in_laststand
‪function player_is_in_laststand()
Definition: laststand_shared.gsc:18
‪MIN_GRENADE_TEAM_TIME
‪#define MIN_GRENADE_TEAM_TIME
Definition: behavior.gsh:40
‪COVER_ALERT_MODE
‪#define COVER_ALERT_MODE
Definition: blackboard.gsh:113
‪CONTENTS_PLAYER
‪#define CONTENTS_PLAYER
Definition: shared.gsh:121
‪MAX_GRENADE_TEAM_TIME
‪#define MAX_GRENADE_TEAM_TIME
Definition: behavior.gsh:41
‪STANCE_CROUCH
‪#define STANCE_CROUCH
Definition: blackboard.gsh:274
‪prepareToChangeStanceToStand
‪function private prepareToChangeStanceToStand(behaviorTreeEntity, asmStateName)
Definition: archetype_human_cover.gsc:448
‪COVER_SHOOT_TAKEDOWN_TIME
‪#define COVER_SHOOT_TAKEDOWN_TIME
Definition: behavior.gsh:85
‪GetBlackboardEvents
‪function GetBlackboardEvents(eventName)
Definition: ai_blackboard.gsc:64
‪shouldThrowGrenadeAtCoverCondition
‪function shouldThrowGrenadeAtCoverCondition(behaviorTreeEntity, throwIfPossible=false)
Definition: archetype_human_cover.gsc:54
‪AIM_RIGHT
‪#define AIM_RIGHT
Definition: blackboard.gsh:256
‪getHighestNodeStance
‪function getHighestNodeStance(node)
Definition: archetype_utility.gsc:2059
‪shouldReturnToCoverCondition
‪function private shouldReturnToCoverCondition(behaviorTreeEntity)
Definition: archetype_human_cover.gsc:292
‪NODE_COVER_CROUCH
‪#define NODE_COVER_CROUCH(_node)
Definition: utility.gsh:10
‪SENSE_DISTANCE
‪#define SENSE_DISTANCE
Definition: archetype_human_cover.gsc:184
‪MAX_GRENADE_THROW_TIME
‪#define MAX_GRENADE_THROW_TIME
Definition: behavior.gsh:47