‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
skeleton.gsc
Go to the documentation of this file.
1 #using scripts\shared\ai_shared;
2 #using scripts\shared\callbacks_shared;
3 #using scripts\shared\clientfield_shared;
4 #using scripts\shared\fx_shared;
5 #using scripts\shared\laststand_shared;
6 #using scripts\shared\math_shared;
7 #using scripts\shared\scene_shared;
8 #using scripts\shared\spawner_shared;
9 #using scripts\shared\util_shared;
10 #using scripts\shared\array_shared;
11 #using scripts\shared\system_shared;
12 
13 #using scripts\shared\ai\systems\animation_state_machine_utility;
14 #using scripts\shared\ai\systems\animation_state_machine_notetracks;
15 #using scripts\shared\ai\archetype_utility;
16 #using scripts\shared\ai\systems\behavior_tree_utility;
17 #using scripts\shared\ai\systems\blackboard;
18 #using scripts\shared\ai\systems\debug;
19 #using scripts\shared\ai\systems\gib;
20 #using scripts\codescripts\struct;
21 #using scripts\shared\ai\archetype_mocomps_utility;
22 
23 #insert scripts\shared\archetype_shared\archetype_shared.gsh;
24 #insert scripts\shared\ai\systems\animation_state_machine.gsh;
25 #insert scripts\shared\ai\systems\behavior.gsh;
26 #insert scripts\shared\ai\systems\behavior_tree.gsh;
27 #insert scripts\shared\ai\systems\blackboard.gsh;
28 #insert scripts\shared\ai\systems\gib.gsh;
29 #insert scripts\shared\ai\utility.gsh;
30 #insert scripts\shared\ai\skeleton.gsh;
31 #insert scripts\shared\shared.gsh;
32 #insert scripts\shared\version.gsh;
33 
34 #namespace SkeletonBehavior;
35 
36 ‪REGISTER_SYSTEM( "skeleton", &‪__init__, undefined )
37 
38 function ‪__init__()
39 {
40  // INIT BEHAVIORS
42 
43  // INIT BLACKBOARD
45 
46  // INIT SKELETON ON SPAWN
48 
50  {
52  "actor",
55  1,
56  "int");
57  }
58 }
59 
61 {
62  self.zombie_move_speed = "walk";
63  if(randomint( 2 ) == 0)
64  self.zombie_arms_position = "up";
65  else
66  self.zombie_arms_position = "down";
67  self.missingLegs = false;
68  self setAvoidanceMask( "avoid none" );
69  self PushActors( true );
70 
72 }
73 
74 
76 {
77  ‪BT_REGISTER_API( "skeletonTargetService", &‪skeletonTargetService );
78  ‪BT_REGISTER_API( "skeletonShouldMelee", &‪skeletonShouldMeleeCondition );
79  ‪BT_REGISTER_API( "skeletonGibLegsCondition", &‪skeletonGibLegsCondition );
80  ‪BT_REGISTER_API( "isSkeletonWalking", &‪isSkeletonWalking );
81 
82  ‪BT_REGISTER_API( "skeletonDeathAction", &‪skeletonDeathAction );
83 
85 }
86 
88 {
89  // CREATE BLACKBOARD
91 
92  // USE UTILITY BLACKBOARD
94 
95  // CREATE SKELETON BLACKBOARD
99  ‪BB_REGISTER_ATTRIBUTE( ‪WHICH_BOARD_PULL_TYPE, undefined, undefined );
100  ‪BB_REGISTER_ATTRIBUTE( ‪BOARD_ATTACK_SPOT, undefined, undefined );
101 
102  // REGISTER ANIMSCRIPTED CALLBACK
103  self.___ArchetypeOnAnimscriptedCallback = &‪ArchetypeSkeletonOnAnimscriptedCallback;
104 
105  // ENABLE DEBUGGING IN ODYSSEY
107 }
108 
110 {
111  // UNREGISTER THE BLACKBOARD
112  entity.__blackboard = undefined;
113 
114  // REREGISTER BLACKBOARD
116 }
117 
118 // ------- BLACKBOARD -----------//
119 
121 {
122  if( IsDefined( self.skeleton_arms_position ) )
123  {
124  if( self.zombie_arms_position == "up" )
125  return ‪ARMS_UP;
126  return ‪ARMS_DOWN;
127  }
128 
129  return ‪ARMS_UP;
130 }
131 
133 {
134  if ( IsDefined( self.zombie_move_speed ) )
135  {
136  if( self.zombie_move_speed == "walk" )
137  {
139  }
140  else if( self.zombie_move_speed == "run" )
141  {
143  }
144  else if( self.zombie_move_speed == "sprint" )
145  {
147  }
148  else if( self.zombie_move_speed == "super_sprint" )
149  {
151  }
152  }
154 }
155 
157 {
158  if( self.missingLegs )
159  return ‪HAS_LEGS_NO;
160  return ‪HAS_LEGS_YES;
161 }
162 
163 // ------- BLACKBOARD -----------//
164 
165 
166 
167 function ‪isSkeletonWalking( behaviorTreeEntity )
168 {
169  if( !isdefined(behaviorTreeEntity.zombie_move_speed))
170  return true;
171  return behaviorTreeEntity.zombie_move_speed == "walk" && !‪IS_TRUE(behaviorTreeEntity.missingLegs) && behaviorTreeEntity.zombie_arms_position == "up";
172 }
173 
174 function ‪skeletonGibLegsCondition( behaviorTreeEntity)
175 {
177 }
178 
179 function ‪skeletonNotetrackMeleeFire( animationEntity )
180 {
181  hitEnt = animationentity Melee();
182  if(isDefined(hitEnt) && isDefined(animationentity.aux_melee_damage) && self.team != hitEnt.team )
183  {
184  animationentity [[animationentity.aux_melee_damage]](hitEnt);
185  }
186 }
187 
188 function ‪is_within_fov( start_origin, start_angles, end_origin, fov )
189 {
190  normal = VectorNormalize( end_origin - start_origin );
191  forward = AnglesToForward( start_angles );
192  dot = VectorDot( forward, normal );
193 
194  return dot >= fov;
195 }
196 
197 #define LAST_SEEN_LOSS_LATENCY 3000
198 
199 function ‪skeletonCanSeePlayer( player )
200 {
201  self endon( "death" );
202 
203  if(!isDefined(self.players_visCache))
204  {
205  self.players_visCache = [];
206  }
207  entNum = player GetEntityNumber();
208  if(!isDefined(self.players_visCache[entNum]))
209  {
210  self.players_visCache[entNum] = 0;
211  }
212  if (self.players_visCache[entNum] > GetTime() )
213  {
214  return true;
215  }
216 
217  //zombie_eye = self GetTagOrigin( "tag_eye" );
218  zombie_eye = self.origin + ( 0, 0, 40);
219  player_pos = player.origin + ( 0, 0, 40);
220 
221  //as_debug::drawDebugCross( zombie_eye, 5.0, ( 0.0, 0.0, 1.0 ), 1 );
222  //as_debug::drawDebugCross( player_pos, 5.0, ( 0.0, 1.0, 1.0 ), 1 );
223 
224  distanceSq = DistanceSquared( zombie_eye, player_pos );
225 
226  //Check to see if the skeleton is super close OR super far
227  if( distanceSq < ‪ZM_MELEE_DIST_SQ )
228  {
229  self.players_visCache[entNum] = GetTime() + ‪LAST_SEEN_LOSS_LATENCY;
230  return true;
231  }
232  else if( distanceSq > 1024*1024 )
233  {
234  return false;
235  }
236 
237  if( ‪is_within_fov( zombie_eye, self.angles, player_pos, cos(60.0) ) )
238  {
239  ‪trace = GroundTrace( zombie_eye, player_pos, false, undefined );
240 
241  if( ‪trace["fraction"] < 1.0 )
242  {
243  return false;
244  }
245  else
246  {
247  //as_debug::debugLine( zombie_eye, player_pos, ( 0.0, 1.0, 1.0 ), 1 );
248  self.players_visCache[entNum] = GetTime() + ‪LAST_SEEN_LOSS_LATENCY;
249  return true;
250  }
251  }
252  return false;
253 }
254 
255 
256 function ‪is_player_valid( player, checkIgnoreMeFlag, ignore_laststand_players )
257 {
258  if( !IsDefined( player ) )
259  {
260  return false;
261  }
262 
263  if( !IsAlive( player ) )
264  {
265  return false;
266  }
267 
268  if( !IsPlayer( player ) )
269  {
270  return false;
271  }
272 
273  if( IsDefined(player.is_zombie) && player.is_zombie == true )
274  {
275  return false;
276  }
277 
278  if( player.sessionstate == "spectator" )
279  {
280  return false;
281  }
282 
283  if( player.sessionstate == "intermission" )
284  {
285  return false;
286  }
287 
288  if( ‪IS_TRUE(self.‪intermission) )
289  {
290  return false;
291  }
292 
293  if(!‪IS_TRUE(ignore_laststand_players))
294  {
296  {
297  return false;
298  }
299  }
300 
301 //T6.5todo if ( player isnotarget() )
302 //T6.5todo {
303 //T6.5todo return false;
304 //T6.5todo }
305 
306  //We only want to check this from the zombie attack script
307  if( ‪IS_TRUE(checkIgnoreMeFlag) && player.ignoreme )
308  {
309  return false;
310  }
311 
312  //for additional level specific checks
313  if( IsDefined( level.is_player_valid_override ) )
314  {
315  return [[ level.is_player_valid_override ]]( player );
316  }
317 
318  return true;
319 }
320 
321 function ‪get_closest_valid_player( origin, ignore_player )
322 {
323  valid_player_found = false;
324 
325  players = GetPlayers();
326 
327  if( IsDefined( ignore_player ) )
328  {
329  //PI_CHANGE_BEGIN - 7/2/2009 JV Reenabling change 274916 (from DLC3)
330  for(i = 0; i < ignore_player.size; i++ )
331  {
332  ArrayRemoveValue( players, ignore_player[i] );
333  }
334  //PI_CHANGE_END
335  }
336 
337  // pre-cull any players that are in last stand
338  done = false;
339  while ( players.size && !done )
340  {
341  done = true;
342  for(i = 0; i < players.size; i++ )
343  {
344  player = players[i];
345  if( !‪is_player_valid( player, true ) )
346  {
347  ArrayRemoveValue( players, player );
348  done = false;
349  break;
350  }
351  }
352  }
353 
354  if( players.size == 0 )
355  {
356  return undefined;
357  }
358 
359  while( !valid_player_found )
360  {
361  // find the closest player
362  if( IsDefined( self.closest_player_override ) )
363  {
364  player = [[ self.closest_player_override ]]( origin, players );
365  }
366  else if( isdefined( level.closest_player_override ) )
367  {
368  player = [[ level.closest_player_override ]]( origin, players );
369  }
370  else
371  {
372  player = ArrayGetClosest( origin, players );
373  }
374 
375  if( !isdefined( player ) || players.size == 0 )
376  {
377  return undefined;
378  }
379 
380  // make sure they're not a zombie or in last stand
381  if( !‪is_player_valid( player, true ) )
382  {
383  // unlikely to get here unless there is a wait in one of the closest player overrides
384  ArrayRemoveValue( players, player );
385  if( players.size == 0 )
386  {
387  return undefined;
388  }
389 
390  continue;
391  }
392 
393  return player;
394  }
395 }
396 
397 
398 function ‪skeletonSetGoal(goal)
399 {
400  if(isDefined(self.setGoalOverrideCB))
401  {
402  return [[self.setGoalOverrideCB]](goal);
403  }
404  else
405  {
406  self SetGoal(goal);
407  }
408 }
409 function ‪skeletonTargetService( behaviorTreeEntity)
410 {
411 
412  self endon( "death" );
413 
414  if ( ‪IS_TRUE( behaviorTreeEntity.ignoreall ) )
415  {
416  return false;
417  }
418  if(isDefined(behaviorTreeEntity.enemy) && behaviorTreeEntity.enemy.team == behaviorTreeEntity.team )
419  behaviorTreeEntity ClearEntityTarget();
420 
421  if(behaviorTreeEntity.team == "allies")
422  {
423  if(isDefined(behaviorTreeEntity.favoriteenemy))
424  {
425  behaviorTreeEntity ‪skeletonSetGoal( behaviorTreeEntity.favoriteenemy.origin );
426  return true;
427  }
428  if(isDefined(behaviorTreeEntity.enemy))
429  {
430  behaviorTreeEntity ‪skeletonSetGoal( behaviorTreeEntity.enemy.origin );
431  return true;
432  }
433  target = ‪getClosestToMe(GetAITeamArray( "axis" ));
434  if(isDefined(target))
435  {
436  behaviorTreeEntity ‪skeletonSetGoal( target.origin );
437  return true;
438  }
439  else
440  {
441  behaviorTreeEntity ‪skeletonSetGoal( behaviorTreeEntity.origin );
442  return false;
443  }
444  }
445  else
446  {
447 
448  player = ‪get_closest_valid_player( behaviorTreeEntity.origin, behaviorTreeEntity.ignore_player );
449 
450  if( !isDefined( player ) )
451  {
452  if( IsDefined( behaviorTreeEntity.ignore_player ) )
453  {
454  if(isDefined(level._should_skip_ignore_player_logic) && [[level._should_skip_ignore_player_logic]]() )
455  {
456  return;
457  }
458  behaviorTreeEntity.ignore_player = [];
459  }
460 
461  behaviorTreeEntity ‪skeletonSetGoal( behaviorTreeEntity.origin );
462  return false;
463  }
464  else
465  {
466  if ( IsDefined( player.last_valid_position ) )
467  {
468  canSEE = self ‪skeletonCanSeePlayer( player );
469 
470  //Fill in influence map
471  if( canSEE )
472  {
473  //self SetInfluenceAt( 5, player.last_valid_position, 1.0 );
474  behaviorTreeEntity ‪skeletonSetGoal( player.last_valid_position );
475  //as_debug::drawDebugCross( player.last_valid_position, 5.0, ( 0.0, 1.0, 0.0 ), 5 );
476  return true;
477  }
478  else
479  {
480  influencePos = undefined;
481  //try to find player - get hottest point on influence map and go there
482  //influencePos = self GetBestInfluencepos( 5, 0.01, 1.0 );
483 
484  if( isdefined(influencePos) )
485  {
486  //as_debug::drawDebugCross( influencePos, 5.0, ( 1.0, 0.0, 0.0 ), 5 );
487 
488  //Are we close to our goal?
489  if( DistanceSquared( influencePos, behaviorTreeEntity.origin ) > 32*32 )
490  {
491  behaviorTreeEntity ‪skeletonSetGoal( influencePos );
492  return true;
493  }
494  //self SetGoal( self.origin );
495  behaviorTreeEntity ClearPath();
496  return false;
497  }
498  else
499  {
500  //self SetGoal( self.origin );
501  behaviorTreeEntity ClearPath();
502  return false;
503  }
504  }
505 
506  /*attackPlayer = false;
507  if( DistanceSquared( player.last_valid_position, self.origin ) < (512*512) )
508  {
509  if( canSEE )
510  {
511  behaviorTreeEntity SetGoal( player.last_valid_position );
512  attackPlayer = true;
513  }
514  }
515 
516  if( !attackPlayer )
517  {
518  //Get hottest point on influence map and go there
519  influencePos = self GetBestInfluencepos( 5, 0.01, 1.0 );
520  if( isdefined(influencePos) )
521  {
522  as_debug::drawDebugCross( influencePos, 5.0, ( 1.0, 0.0, 0.0 ), 5 );
523  self SetGoal( influencePos );
524  return true;
525  }
526  else
527  {
528  self SetGoal( self.origin );
529  return false;
530  }
531  }*/
532  return true;
533  }
534  else
535  {
536  behaviorTreeEntity ‪skeletonSetGoal( behaviorTreeEntity.origin );
537  return false;
538  }
539  }
540  }
541 }
542 
543 function ‪isValidEnemy( enemy )
544 {
545  if ( !isdefined( enemy ) )
546  {
547  return false;
548  }
549 
550  return true;
551 }
552 
553 function ‪GetYaw(org)
554 {
555  angles = VectorToAngles(org-self.origin);
556  return angles[1];
557 }
558 
559 // warning! returns (my yaw - yaw to enemy) instead of (yaw to enemy - my yaw)
561 {
562  pos = undefined;
563  if ( ‪isValidEnemy( self.enemy ) )
564  {
565  pos = self.enemy.origin;
566  }
567  else
568  {
569  forward = AnglesToForward(self.angles);
570  forward = VectorScale (forward, 150);
571  pos = self.origin + forward;
572  }
573 
574  yaw = self.angles[1] - ‪GetYaw(pos);
575  yaw = AngleClamp180( yaw );
576  return yaw;
577 }
578 
579 function ‪skeletonShouldMeleeCondition( behaviorTreeEntity )
580 {
581  if( !IsDefined( behaviortreeentity.enemy ) )
582  {
583  return false;
584  }
585 
586  if( IsDefined( behaviorTreeEntity.marked_for_death ) )
587  {
588  return false;
589  }
590 
591  if( ‪IS_TRUE( behaviorTreeEntity.stunned ) )
592  {
593  return false;
594  }
595 
596  yaw = abs( getYawToEnemy() );
597  if( ( yaw > ‪ZM_MELEE_YAW ) )
598  {
599  return false;
600  }
601  if( DistanceSquared( behaviorTreeEntity.origin, behaviorTreeEntity.enemy.origin ) < ‪ZM_MELEE_DIST_SQ )
602  {
603  return true;
604  }
605 
606  return false;
607 }
608 
609 function ‪skeletonDeathAction( behaviorTreeEntity )
610 {
611  if ( IsDefined( behaviorTreeEntity.deathFunction ) )
612  {
613  behaviorTreeEntity [[ behaviorTreeEntity.deathFunction ]]();
614  }
615 }
616 
617 
618 
620 function ‪getClosestTo(origin,entArray)
621 {
622  if (!isDefined(entArray) )
623  return;
624 
625  if (entArray.size == 0 )
626  return;
627 
628  return ArrayGetClosest( origin, entArray );
629 }
630 
632 function ‪getClosestToMe(entArray)
633 {
634  return ‪getClosestTo(self.origin,entArray);
635 }
‪HAS_LEGS_YES
‪#define HAS_LEGS_YES
Definition: blackboard.gsh:165
‪skeletonShouldMeleeCondition
‪function skeletonShouldMeleeCondition(behaviorTreeEntity)
Definition: skeleton.gsc:579
‪GIB_LEGS_RIGHT_LEG_FLAG
‪#define GIB_LEGS_RIGHT_LEG_FLAG
Definition: gib.gsh:28
‪skeletonDeathAction
‪function skeletonDeathAction(behaviorTreeEntity)
Definition: skeleton.gsc:609
‪ARMS_UP
‪#define ARMS_UP
Definition: blackboard.gsh:186
‪BOARD_ATTACK_SPOT
‪#define BOARD_ATTACK_SPOT
Definition: blackboard.gsh:171
‪BT_REGISTER_API
‪#define BT_REGISTER_API(name, function)
Definition: behavior.gsh:1
‪getClosestTo
‪function getClosestTo(origin, entArray)
Definition: skeleton.gsc:620
‪ARCHETYPE_SKELETON
‪#define ARCHETYPE_SKELETON
Definition: archetype_shared.gsh:14
‪intermission
‪function intermission()
Definition: _zm.gsc:6542
‪ArchetypeSkeletonBlackboardInit
‪function private ArchetypeSkeletonBlackboardInit()
Definition: skeleton.gsc:87
‪WHICH_BOARD_PULL_TYPE
‪#define WHICH_BOARD_PULL_TYPE
Definition: blackboard.gsh:170
‪is_within_fov
‪function is_within_fov(start_origin, start_angles, end_origin, fov)
Definition: skeleton.gsc:188
‪skeletonTargetService
‪function skeletonTargetService(behaviorTreeEntity)
Definition: skeleton.gsc:409
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪LOCOMOTION_SPEED_WALK
‪#define LOCOMOTION_SPEED_WALK
Definition: blackboard.gsh:156
‪ARMS_POSITION
‪#define ARMS_POSITION
Definition: blackboard.gsh:185
‪__init__
‪function __init__()
Definition: skeleton.gsc:38
‪BB_REGISTER_ATTRIBUTE
‪#define BB_REGISTER_ATTRIBUTE(name, defaultValue, getter)
Definition: blackboard.gsh:1
‪ASM_REGISTER_NOTETRACK_HANDLER
‪#define ASM_REGISTER_NOTETRACK_HANDLER(notetrackname, handlerfunction)
Definition: animation_state_machine.gsh:4
‪skeletonNotetrackMeleeFire
‪function skeletonNotetrackMeleeFire(animationEntity)
Definition: skeleton.gsc:179
‪trace
‪function trace(from, to, target)
Definition: grapple.gsc:369
‪LOCOMOTION_SPEED_SPRINT
‪#define LOCOMOTION_SPEED_SPRINT
Definition: blackboard.gsh:158
‪skeletonCanSeePlayer
‪function skeletonCanSeePlayer(player)
Definition: skeleton.gsc:199
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪skeletonGibLegsCondition
‪function skeletonGibLegsCondition(behaviorTreeEntity)
Definition: skeleton.gsc:174
‪RegisterUtilityBlackboardAttributes
‪function RegisterUtilityBlackboardAttributes()
Definition: archetype_utility.gsc:139
‪is_player_valid
‪function is_player_valid(player, checkIgnoreMeFlag, ignore_laststand_players)
Definition: skeleton.gsc:256
‪GetYaw
‪function GetYaw(org)
Definition: skeleton.gsc:553
‪LOCOMOTION_SPEED_SUPER_SPRINT
‪#define LOCOMOTION_SPEED_SUPER_SPRINT
Definition: blackboard.gsh:159
‪ARMS_DOWN
‪#define ARMS_DOWN
Definition: blackboard.gsh:187
‪ENABLE_BLACKBOARD_DEBUG_TRACKING
‪#define ENABLE_BLACKBOARD_DEBUG_TRACKING(self)
Definition: blackboard.gsh:7
‪isSkeletonWalking
‪function isSkeletonWalking(behaviorTreeEntity)
Definition: skeleton.gsc:167
‪LOCOMOTION_SPEED_TYPE
‪#define LOCOMOTION_SPEED_TYPE
Definition: blackboard.gsh:155
‪skeletonSetGoal
‪function skeletonSetGoal(goal)
Definition: skeleton.gsc:398
‪ArchetypeSkeletonOnAnimscriptedCallback
‪function private ArchetypeSkeletonOnAnimscriptedCallback(entity)
Definition: skeleton.gsc:109
‪GIB_LEGS_LEFT_LEG_FLAG
‪#define GIB_LEGS_LEFT_LEG_FLAG
Definition: gib.gsh:29
‪getClosestToMe
‪function getClosestToMe(entArray)
Definition: skeleton.gsc:632
‪ZM_MELEE_DIST_SQ
‪#define ZM_MELEE_DIST_SQ
Definition: skeleton.gsh:4
‪IsGibbed
‪function IsGibbed(localClientNum, entity, gibFlag)
Definition: gib.csc:734
‪BB_GetHasLegsStatus
‪function BB_GetHasLegsStatus()
Definition: skeleton.gsc:156
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪get_closest_valid_player
‪function get_closest_valid_player(origin, ignore_player)
Definition: skeleton.gsc:321
‪ASM_SKELETON_MELEE_NOTETRACK
‪#define ASM_SKELETON_MELEE_NOTETRACK
Definition: skeleton.gsh:20
‪HAS_LEGS_NO
‪#define HAS_LEGS_NO
Definition: blackboard.gsh:166
‪add_archetype_spawn_function
‪function add_archetype_spawn_function(archetype, spawn_func)
Definition: ai_shared.csc:23
‪ZM_MELEE_YAW
‪#define ZM_MELEE_YAW
Definition: skeleton.gsh:2
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪SKELETON_CLIENTFIELD
‪#define SKELETON_CLIENTFIELD
Definition: skeleton.gsh:30
‪CreateBlackBoardForEntity
‪function CreateBlackBoardForEntity(entity)
Definition: blackboard.gsc:77
‪player_is_in_laststand
‪function player_is_in_laststand()
Definition: laststand_shared.gsc:18
‪GetYawToEnemy
‪function GetYawToEnemy()
Definition: skeleton.gsc:560
‪skeletonSpawnSetup
‪function skeletonSpawnSetup()
Definition: skeleton.gsc:60
‪shouldRegisterClientFieldForArchetype
‪function shouldRegisterClientFieldForArchetype(archetype)
Definition: ai_shared.csc:72
‪HAS_LEGS_TYPE
‪#define HAS_LEGS_TYPE
Definition: blackboard.gsh:164
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪isValidEnemy
‪function isValidEnemy(enemy)
Definition: skeleton.gsc:543
‪BB_GetLocomotionSpeedType
‪function BB_GetLocomotionSpeedType()
Definition: skeleton.gsc:132
‪BB_GetArmsPosition
‪function BB_GetArmsPosition()
Definition: skeleton.gsc:120
‪InitSkeletonBehaviorsAndASM
‪function private InitSkeletonBehaviorsAndASM()
Definition: skeleton.gsc:75
‪LOCOMOTION_SPEED_RUN
‪#define LOCOMOTION_SPEED_RUN
Definition: blackboard.gsh:157
‪LAST_SEEN_LOSS_LATENCY
‪#define LAST_SEEN_LOSS_LATENCY
Definition: skeleton.gsc:197