‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
archetype_human_riotshield.gsc
Go to the documentation of this file.
1 #using scripts\shared\ai_shared;
2 #using scripts\shared\clientfield_shared;
3 #using scripts\shared\math_shared;
4 #using scripts\shared\spawner_shared;
5 #using scripts\shared\ai\archetype_utility;
6 #using scripts\shared\ai\zombie_utility;
7 #using scripts\shared\ai\systems\ai_interface;
8 #using scripts\shared\ai\systems\animation_state_machine_mocomp;
9 #using scripts\shared\ai\systems\animation_state_machine_utility;
10 #using scripts\shared\ai\systems\behavior_tree_utility;
11 #using scripts\shared\ai\systems\blackboard;
12 #using scripts\shared\ai\systems\debug;
13 #using scripts\shared\ai\systems\gib;
14 #using scripts\shared\ai\systems\shared;
15 
16 // INTERFACE
17 #using scripts\shared\ai\archetype_human_riotshield_interface;
18 
19 #using scripts\shared\ai\archetype_utility;
20 #using scripts\shared\ai\archetype_cover_utility;
21 #using scripts\shared\ai\archetype_locomotion_utility;
22 #using scripts\shared\ai\archetype_mocomps_utility;
23 
24 #insert scripts\shared\archetype_shared\archetype_shared.gsh;
25 #insert scripts\shared\shared.gsh;
26 #insert scripts\shared\version.gsh;
27 #insert scripts\shared\ai\archetype_human_riotshield.gsh;
28 #insert scripts\shared\ai\utility.gsh;
29 #insert scripts\shared\ai\systems\animation_state_machine.gsh;
30 #insert scripts\shared\ai\systems\behavior.gsh;
31 #insert scripts\shared\ai\systems\behavior_tree.gsh;
32 #insert scripts\shared\ai\systems\blackboard.gsh;
33 #insert scripts\shared\ai\systems\gib.gsh;
34 
35 function autoexec ‪main()
36 {
37  // INIT BLACKBOARD
39 
40  // INIT RIOTSHIELD ON SPAWN
42 
44 
46 }
47 
48 #namespace HumanRiotshieldBehavior;
49 
51 {
52  // ------- TACTICAL WALK -----------//
53  ‪BT_REGISTER_API( "riotshieldShouldTacticalWalk", &‪riotshieldShouldTacticalWalk );
54  ‪BT_REGISTER_API( "riotshieldNonCombatLocomotionCondition", &‪riotshieldNonCombatLocomotionCondition );
55  ‪BT_REGISTER_API( "unarmedWalkAction", &‪unarmedWalkActionStart );
56  ‪BT_REGISTER_API( "riotshieldTacticalWalkStart", &‪riotshieldTacticalWalkStart );
57 
58  ‪BT_REGISTER_API( "riotshieldAdvanceOnEnemyService", &‪riotshieldAdvanceOnEnemyService );
59 
60  ‪BT_REGISTER_API( "riotshieldShouldFlinch", &‪riotshieldShouldFlinch );
61  ‪BT_REGISTER_API( "riotshieldIncrementFlinchCount", &‪riotshieldIncrementFlinchCount );
62  ‪BT_REGISTER_API( "riotshieldClearFlinchCount", &‪riotshieldClearFlinchCount );
63 
64  // ------- UNARMED -----------//
65  ‪BT_REGISTER_API( "riotshieldUnarmedTargetService", &‪riotshieldUnarmedTargetService );
66  ‪BT_REGISTER_API( "riotshieldUnarmedAdvanceOnEnemyService", &‪riotshieldUnarmedAdvanceOnEnemyService );
67 }
68 
70 {
71  entity = self;
72 
73  // CREATE BLACKBOARD
75 
76  // CREATE INTERFACE
78 
79  // USE UTILITY BLACKBOARD
81 
82  // REGISTER ANIMSCRIPTED CALLBACK
83  self.___ArchetypeOnAnimscriptedCallback = &‪ArchetypeHumanRiotshieldOnAnimscriptedCallback;
84 
85  // ENABLE DEBUGGING IN ODYSSEY
87 
89 }
90 
92 {
93  // UNREGISTER THE BLACKBOARD
94  entity.__blackboard = undefined;
95 
96  // REREGISTER BLACKBOARD
98 }
99 
100 function private ‪riotshieldMoveMode()
101 {
102  entity = self;
103 
104  if ( entity ‪ai::get_behavior_attribute( "phalanx" ) )
105  {
106  return "marching";
107  }
108 
109  return "normal";
110 }
111 
112 function private ‪riotshieldShouldFlinch( entity )
113 {
114  if ( entity HasPath() && entity ‪ai::get_behavior_attribute( "phalanx" ))
115  {
116  // Always flinch when moving in a phalanx.
117  return true;
118  }
119 
120  if ( entity.damagelocation != "riotshield" )
121  {
122  return false;
123  }
124 
125  if ( entity.damagelocation == "riotshield" &&
126  entity.flinchCount >= ‪RIOTSHIELD_FLINCH_COUNT_TO_STAGGER &&
127  ( entity.lastFlinchTime + ‪RIOTSHIELD_FLINCH_RESET_TIME ) >= GetTime() )
128  {
129  return false;
130  }
131 
132  return true;
133 }
134 
135 function private ‪riotshieldIncrementFlinchCount( entity )
136 {
137  entity.flinchCount++;
138  entity.lastFlinchTime = GetTime();
139 }
140 
141 function private ‪riotshieldClearFlinchCount( entity )
142 {
143  entity.lastFlinchTime = GetTime();
144  entity.flinchCount = 0;
145 }
146 
147 function private ‪riotshieldShouldTacticalWalk( behaviorTreeEntity )
148 {
149  // always tactical walk
150  return true;
151 }
152 
153 function private ‪riotshieldNonCombatLocomotionCondition( behaviorTreeEntity )
154 {
155  if ( IsDefined( behaviorTreeEntity.enemy ) )
156  {
157  if ( DistanceSquared( behaviorTreeEntity.origin, behaviorTreeEntity LastKnownPos( behaviorTreeEntity.enemy ) ) > ‪RIOTSHIELD_RUN_DIST_SQ )
158  {
159  return true;
160  }
161  }
162 
163  return false;
164 }
165 
166 function private ‪riotshieldAdvanceOnEnemyService( behaviorTreeEntity )
167 {
168  itsBeenAWhile = ( GetTime() > behaviorTreeEntity.nextFindBestCoverTime );
169  isAtScriptGoal = behaviorTreeEntity IsAtGoal();
170  tooLongAtNode = false;
171 
172  if ( behaviorTreeEntity ‪ai::get_behavior_attribute( "phalanx" ) )
173  {
174  return false;
175  }
176 
177  if ( IsDefined( behaviorTreeEntity.chosenNode ) )
178  {
179  dist_sq = DistanceSquared( behaviorTreeEntity.origin, behaviorTreeEntity.chosenNode.origin );
180  if ( dist_sq < ‪RIOTSHIELD_AT_NODE_DIST_SQ )
181  {
182  if ( !IsDefined( behaviorTreeEntity.timeAtChosenNode ) )
183  {
184  behaviorTreeEntity.timeAtChosenNode = GetTime();
185  }
186  }
187  }
188 
189  if ( IsDefined( behaviorTreeEntity.timeAtChosenNode ) )
190  {
191  if ( GetTime() - behaviorTreeEntity.timeAtChosenNode > behaviorTreeEntity.timeAtNodeMax )
192  {
193  tooLongAtNode = true;
194  behaviorTreeEntity.timeAtChosenNode = undefined;
195  }
196  }
197 
198  shouldLookForBetterCover = itsBeenAWhile || !isAtScriptGoal || tooLongAtNode;
199 
200  if ( shouldLookForBetterCover && IsDefined( behaviorTreeEntity.enemy ) )
201  {
202  closestRandomNode = undefined;
203  closestRandomNodes = behaviorTreeEntity FindBestCoverNodes( behaviorTreeEntity.goalradius, behaviorTreeEntity.goalpos );
204 
205  foreach( node in closestRandomNodes )
206  {
207  if ( IsDefined( behaviorTreeEntity.chosenNode ) && behaviorTreeEntity.chosenNode == node )
208  {
209  continue;
210  }
211 
213  {
214  closestRandomNode = node;
215  break;
216  }
217  }
218 
219  if ( !IsDefined( closestRandomNode ) )
220  {
221  closestRandomNode = closestRandomNodes[0];
222  }
223 
224  if( IsDefined( closestRandomNode )
225  && behaviorTreeEntity FindPath( behaviorTreeEntity.origin, closestRandomNode.origin, true, false )
226  )
227  {
228  AiUtility::ReleaseClaimNode( behaviorTreeEntity );
229  ‪AiUtility::useCoverNodeWrapper( behaviorTreeEntity, closestRandomNode );
230 
231  behaviorTreeEntity.chosenNode = closestRandomNode;
232  behaviorTreeEntity.timeAtNodeMax = RandomIntRange( behaviorTreeEntity.moveDelayMin, behaviorTreeEntity.moveDelayMax );
233  behaviorTreeEntity.timeAtChosenNode = undefined;
234 
235  return true;
236  }
237  }
238 
239  return false;
240 }
241 
242 function private ‪riotshieldTacticalWalkStart( behaviorTreeEntity )
243 {
244  ‪AiUtility::resetCoverParameters( behaviorTreeEntity );
245  ‪AiUtility::setCanBeFlanked( behaviorTreeEntity, false );
246 
248  behaviorTreeEntity OrientMode( "face enemy" );
249 }
250 
251 function private ‪riotshieldUnarmedTargetService( behaviorTreeEntity )
252 {
253  // Don't change targets during melee
254  if ( !‪AiUtility::shouldMutexMelee( behaviorTreeEntity ) )
255  {
256  return false;
257  }
258 
259  enemies = [];
260  ai = GetAiArray();
261 
262  // Add AI's that are on different teams.
263  foreach( index, value in ai )
264  {
265  if ( value.team != behaviorTreeEntity.team && IsActor( value ) )
266  {
267  enemies[enemies.size] = value;
268  }
269  }
270 
271  // Find the closest enemy based on distance.
272  if ( enemies.size > 0 )
273  {
274  closestEnemy = undefined;
275  closestEnemyDistance = 0;
276 
277  for ( index = 0; index < enemies.size; index++ )
278  {
279  enemy = enemies[index];
280  enemyDistance = DistanceSquared( behaviorTreeEntity.origin, enemy.origin );
281  checkEnemy = false;
282 
283  if ( enemyDistance > behaviorTreeEntity.goalradius * behaviorTreeEntity.goalradius )
284  {
285  continue;
286  }
287 
288  if ( !IsDefined( enemy.targeted_by ) || enemy.targeted_by == behaviorTreeEntity )
289  {
290  checkEnemy = true;
291  }
292  else
293  {
294  targetDistance = DistanceSquared( enemy.targeted_by.origin, enemy.origin );
295  if ( enemyDistance < targetDistance )
296  {
297  checkEnemy = true;
298  }
299  }
300 
301  if ( checkEnemy )
302  {
303  if ( !IsDefined( closestEnemy ) || enemyDistance < closestEnemyDistance )
304  {
305  closestEnemyDistance = enemyDistance;
306  closestEnemy = enemy;
307  }
308  }
309  }
310 
311  if ( IsDefined( behaviorTreeEntity.favoriteenemy ) )
312  {
313  behaviorTreeEntity.favoriteenemy.targeted_by = undefined;
314  }
315 
316  behaviorTreeEntity.favoriteenemy = closestEnemy;
317 
318  if ( IsDefined( behaviorTreeEntity.favoriteenemy ) )
319  {
320  behaviorTreeEntity.favoriteenemy.targeted_by = behaviorTreeEntity;
321  }
322 
323  return true;
324  }
325 
326  return false;
327 }
328 
329 function private ‪riotshieldUnarmedAdvanceOnEnemyService( behaviorTreeEntity )
330 {
331  if ( GetTime() < behaviorTreeEntity.nextFindBestCoverTime )
332  {
333  return false;
334  }
335 
336  if( IsDefined( behaviorTreeEntity.favoriteenemy ) )
337  {
338  /#
339  RecordLine( behaviorTreeEntity.favoriteenemy.origin, behaviorTreeEntity.origin, ‪ORANGE, "Animscript", behaviorTreeEntity );
340  #/
341 
342  enemyDistance = DistanceSquared( behaviorTreeEntity.favoriteenemy.origin, behaviorTreeEntity.origin );
343  if ( enemyDistance < behaviorTreeEntity.goalradius * behaviorTreeEntity.goalradius )
344  {
345  behaviorTreeEntity UsePosition( behaviorTreeEntity.favoriteenemy.origin );
346  return true;
347  }
348  }
349 
350  behaviorTreeEntity ClearUsePosition();
351  return false;
352 }
353 
354 function private ‪unarmedWalkActionStart( behaviorTreeEntity )
355 {
357  behaviorTreeEntity OrientMode( "face enemy" );
358 }
359 
360 
362  inflictor, attacker, ‪damage, meansOfDeath, weapon, dir, hitLoc, offsetTime )
363 {
364  entity = self;
365 
367 
368  return ‪damage;
369 }
370 
372  eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, boneIndex, modelIndex )
373 {
374  entity = self;
375 
376  if ( sHitLoc == "riotshield" )
377  {
379  entity.health += 1;
380 
381  return 1;
382  }
383 
384  if ( sWeapon.name == "incendiary_grenade" )
385  {
386  iDamage = entity.health;
387  }
388 
389  return iDamage;
390 }
391 
392 #namespace HumanRiotshieldServerUtils;
393 
395 {
396  entity = self;
397 
399 
400  entity.moveDelayMin = ‪RIOTSHIELD_MOVE_DELAY_MIN;
401  entity.moveDelayMax = ‪RIOTSHIELD_MOVE_DELAY_MAX;
402  entity.ignoreRunAndGunDist = true;
403 
406 
408 }
409 
410 // end #namespace HumanRiotshieldServerUtils;
411 
‪RIOTSHIELD_RUN_DIST_SQ
‪#define RIOTSHIELD_RUN_DIST_SQ
Definition: archetype_human_riotshield.gsh:15
‪AddAIOverrideDamageCallback
‪function AddAIOverrideDamageCallback(entity, callback, addToFront)
Definition: archetype_utility.gsc:542
‪BT_REGISTER_API
‪#define BT_REGISTER_API(name, function)
Definition: behavior.gsh:1
‪riotshieldTacticalWalkStart
‪function private riotshieldTacticalWalkStart(behaviorTreeEntity)
Definition: archetype_human_riotshield.gsc:242
‪RIOTSHIELD_WEAPON
‪#define RIOTSHIELD_WEAPON
Definition: archetype_human_riotshield.gsh:1
‪AddAIOverrideKilledCallback
‪function AddAIOverrideKilledCallback(entity, callback)
Definition: archetype_utility.gsc:618
‪RegisterBehaviorScriptFunctions
‪function RegisterBehaviorScriptFunctions()
Definition: archetype_human_riotshield.gsc:50
‪useCoverNodeWrapper
‪function useCoverNodeWrapper(behaviorTreeEntity, node)
Definition: archetype_utility.gsc:1495
‪riotshieldClearFlinchCount
‪function private riotshieldClearFlinchCount(entity)
Definition: archetype_human_riotshield.gsc:141
‪RegisterHumanRiotshieldInterfaceAttributes
‪function RegisterHumanRiotshieldInterfaceAttributes()
Definition: archetype_human_riotshield_interface.gsc:6
‪BB_REGISTER_ATTRIBUTE
‪#define BB_REGISTER_ATTRIBUTE(name, defaultValue, getter)
Definition: blackboard.gsh:1
‪resetCoverParameters
‪function resetCoverParameters(behaviorTreeEntity)
Definition: archetype_cover_utility.gsc:430
‪riotshieldShouldTacticalWalk
‪function private riotshieldShouldTacticalWalk(behaviorTreeEntity)
Definition: archetype_human_riotshield.gsc:147
‪humanRiotshieldSpawnSetup
‪function humanRiotshieldSpawnSetup()
Definition: archetype_human_riotshield.gsc:394
‪riotshieldDamageOverride
‪function private riotshieldDamageOverride(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, boneIndex, modelIndex)
Definition: archetype_human_riotshield.gsc:371
‪RIOTSHIELD_FLINCH_RESET_TIME
‪#define RIOTSHIELD_FLINCH_RESET_TIME
Definition: archetype_human_riotshield.gsh:21
‪SetBlackBoardAttribute
‪function SetBlackBoardAttribute(entity, attributeName, attributeValue)
Definition: blackboard.gsc:56
‪setCanBeFlanked
‪function setCanBeFlanked(behaviorTreeEntity, canBeFlanked)
Definition: archetype_cover_utility.gsc:559
‪riotshieldAdvanceOnEnemyService
‪function private riotshieldAdvanceOnEnemyService(behaviorTreeEntity)
Definition: archetype_human_riotshield.gsc:166
‪riotshieldIncrementFlinchCount
‪function private riotshieldIncrementFlinchCount(entity)
Definition: archetype_human_riotshield.gsc:135
‪RegisterUtilityBlackboardAttributes
‪function RegisterUtilityBlackboardAttributes()
Definition: archetype_utility.gsc:139
‪riotshieldKilledOverride
‪function private riotshieldKilledOverride(inflictor, attacker, damage, meansOfDeath, weapon, dir, hitLoc, offsetTime)
Definition: archetype_human_riotshield.gsc:361
‪shouldMutexMelee
‪function shouldMutexMelee(behaviorTreeEntity)
Definition: archetype_utility.gsc:2663
‪unarmedWalkActionStart
‪function private unarmedWalkActionStart(behaviorTreeEntity)
Definition: archetype_human_riotshield.gsc:354
‪STANCE
‪#define STANCE
Definition: blackboard.gsh:36
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪ENABLE_BLACKBOARD_DEBUG_TRACKING
‪#define ENABLE_BLACKBOARD_DEBUG_TRACKING(self)
Definition: blackboard.gsh:7
‪dropRiotshield
‪function dropRiotshield(behaviorTreeEntity)
Definition: archetype_utility.gsc:2543
‪riotshieldUnarmedAdvanceOnEnemyService
‪function private riotshieldUnarmedAdvanceOnEnemyService(behaviorTreeEntity)
Definition: archetype_human_riotshield.gsc:329
‪DEFAULT_MOVEMENT_STANCE
‪#define DEFAULT_MOVEMENT_STANCE
Definition: blackboard.gsh:281
‪RIOTSHIELD_MOVE_DELAY_MAX
‪#define RIOTSHIELD_MOVE_DELAY_MAX
Definition: archetype_human_riotshield.gsh:11
‪riotshieldUnarmedTargetService
‪function private riotshieldUnarmedTargetService(behaviorTreeEntity)
Definition: archetype_human_riotshield.gsc:251
‪getCoverType
‪function getCoverType(node)
Definition: archetype_utility.gsc:1898
‪RIOTSHIELD_MODEL
‪#define RIOTSHIELD_MODEL
Definition: archetype_human_riotshield.gsh:2
‪COVER_EXPOSED
‪#define COVER_EXPOSED
Definition: blackboard.gsh:96
‪add_archetype_spawn_function
‪function add_archetype_spawn_function(archetype, spawn_func)
Definition: ai_shared.csc:23
‪RIOTSHIELD_MOVE_DELAY_MIN
‪#define RIOTSHIELD_MOVE_DELAY_MIN
Definition: archetype_human_riotshield.gsh:10
‪riotshieldNonCombatLocomotionCondition
‪function private riotshieldNonCombatLocomotionCondition(behaviorTreeEntity)
Definition: archetype_human_riotshield.gsc:153
‪CreateBlackBoardForEntity
‪function CreateBlackBoardForEntity(entity)
Definition: blackboard.gsc:77
‪RIOTSHIELD_FLINCH_COUNT_TO_STAGGER
‪#define RIOTSHIELD_FLINCH_COUNT_TO_STAGGER
Definition: archetype_human_riotshield.gsh:18
‪RIOTSHIELD_AT_NODE_DIST_SQ
‪#define RIOTSHIELD_AT_NODE_DIST_SQ
Definition: archetype_human_riotshield.gsh:13
‪ArchetypeHumanRiotshieldOnAnimscriptedCallback
‪function private ArchetypeHumanRiotshieldOnAnimscriptedCallback(entity)
Definition: archetype_human_riotshield.gsc:91
‪attachRiotshield
‪function attachRiotshield(entity, riotshieldWeapon, riotshieldModel, riotshieldTag)
Definition: archetype_utility.gsc:2522
‪RIOTSHIELD_TAG
‪#define RIOTSHIELD_TAG
Definition: archetype_human_riotshield.gsh:3
‪ARCHETYPE_HUMAN_RIOTSHIELD
‪#define ARCHETYPE_HUMAN_RIOTSHIELD
Definition: archetype_shared.gsh:6
‪MOVE_MODE
‪#define MOVE_MODE
Definition: blackboard.gsh:145
‪ArchetypeHumanRiotshieldBlackboardInit
‪function private ArchetypeHumanRiotshieldBlackboardInit()
Definition: archetype_human_riotshield.gsc:69
‪riotshieldShouldFlinch
‪function private riotshieldShouldFlinch(entity)
Definition: archetype_human_riotshield.gsc:112
‪ORANGE
‪#define ORANGE
Definition: shared.gsh:179
‪get_behavior_attribute
‪function get_behavior_attribute(attribute)
Definition: ai_shared.gsc:184
‪main
‪function autoexec main()
Definition: archetype_human_riotshield.gsc:35
‪CreateInterfaceForEntity
‪function CreateInterfaceForEntity(entity)
Definition: ai_interface.gsc:110
‪riotshieldMoveMode
‪function private riotshieldMoveMode()
Definition: archetype_human_riotshield.gsc:100