‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_combat_robot.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\ai_shared;
4 #using scripts\shared\ai_puppeteer_shared;
5 #using scripts\shared\callbacks_shared;
6 #using scripts\shared\challenges_shared;
7 #using scripts\shared\clientfield_shared;
8 #using scripts\shared\flagsys_shared;
9 #using scripts\shared\killstreaks_shared;
10 #using scripts\shared\objpoints_shared;
11 #using scripts\shared\scoreevents_shared;
12 #using scripts\shared\ai\archetype_utility;
13 #using scripts\shared\ai\systems\gib;
14 #using scripts\shared\entityheadicons_shared;
15 #using scripts\shared\util_shared;
16 #using scripts\shared\vehicleriders_shared;
17 #using scripts\shared\weapons\_heatseekingmissile;
18 #using scripts\shared\ai\systems\blackboard;
19 
20 #using scripts\mp\_challenges;
21 #using scripts\mp\gametypes\_globallogic_audio;
22 #using scripts\mp\killstreaks\_killstreak_bundles;
23 #using scripts\mp\killstreaks\_killstreak_detect;
24 #using scripts\mp\killstreaks\_killstreak_hacking;
25 #using scripts\mp\killstreaks\_killstreakrules;
26 #using scripts\mp\killstreaks\_killstreaks;
27 #using scripts\mp\killstreaks\_supplydrop;
28 
29 #insert scripts\mp\_hacker_tool.gsh;
30 #insert scripts\mp\killstreaks\_killstreaks.gsh;
31 #insert scripts\mp\killstreaks\_remote_weapons.gsh;
32 #insert scripts\shared\shared.gsh;
33 #insert scripts\shared\ai\archetype_damage_effects.gsh;
34 #insert scripts\shared\ai\archetype_robot.gsh;
35 #insert scripts\shared\ai\systems\blackboard.gsh;
36 #insert scripts\shared\ai\systems\gib.gsh;
37 
38 #namespace combat_robot;
39 
40 #define COMBAT_ROBOT_FORWARD_SPAWN_OFFSET 72
41 #define COMBAT_ROBOT_GUARD_RADIUS 1000
42 #define COMBAT_ROBOT_DEFEND_ICON "t7_hud_ks_c54i_drop"
43 #define COMBAT_ROBOT_NAME "combat_robot"
44 #define COMBAT_ROBOT_INFLUENCER "small_vehicle"
45 #define COMBAT_ROBOT_MARKER_NAME "combat_robot_marker"
46 #define INVENTORY_COMBAT_ROBOT_NAME "inventory_combat_robot"
47 
48 // Tweaks to how the combat robot's body is thrown after exploding
49 #define COMBAT_ROBOT_VELOCITY_SCALAR ( 1 / 8 ) // Scales the initial velocity
50 #define COMBAT_ROBOT_ADD_X_VELOCITY_MIN -20
51 #define COMBAT_ROBOT_ADD_X_VELOCITY_MAX 20
52 #define COMBAT_ROBOT_ADD_Y_VELOCITY_MIN -20
53 #define COMBAT_ROBOT_ADD_Y_VELOCITY_MAX 20
54 #define COMBAT_ROBOT_ADD_Z_VELOCITY_MIN 60
55 #define COMBAT_ROBOT_ADD_Z_VELOCITY_MAX 80
56 
57 // Time in seconds the combat robot will shutdown before exploding.
58 #define COMBAT_ROBOT_MIN_SHUTDOWN 3.0
59 #define COMBAT_ROBOT_MAX_SHUTDOWN 4.5
60 
61 // The combat robot will give up chasing an enemy if they haven't attacked them for this long.
62 #define COMBAT_ROBOT_GIVE_UP_ON_ENEMY 10000
63 
64 // The combat robot will ignore unattackable enemies for this long.
65 #define COMBAT_ROBOT_IGNORE_UNATTACKABLE_ENEMY 5000
66 
67 #define COMBAT_ROBOT_NAV_MESH_VALID_LOCATION_BOUNDARY 18
68 #define COMBAT_ROBOT_NAV_MESH_VALID_LOCATION_TOLERANCE 4
69 
70 #define COMBAT_ROBOT_KILLCAM_TIME_OFFSET ( 750 )
71 
72 #precache( "string", "KILLSTREAK_COMBAT_ROBOT_ESCORT_HINT" );
73 #precache( "string", "KILLSTREAK_COMBAT_ROBOT_GUARD_HINT" );
74 #precache( "string", "KILLSTREAK_COMBAT_ROBOT_INBOUND" );
75 #precache( "string", "KILLSTREAK_COMBAT_ROBOT_NOT_AVAILABLE" );
76 #precache( "string", "KILLSTREAK_COMBAT_ROBOT_HACKED" );
77 #precache( "string", "KILLSTREAK_COMBAT_ROBOT_PATROL_FAIL" );
78 #precache( "string", "KILLSTREAK_DESTROYED_COMBAT_ROBOT" );
79 #precache( "triggerstring", "KILLSTREAK_COMBAT_ROBOT_ESCORT_HINT" );
80 #precache( "triggerstring", "KILLSTREAK_COMBAT_ROBOT_GUARD_HINT" );
81 
82 #precache( "material", COMBAT_ROBOT_DEFEND_ICON );
83 
84 function ‪init()
85 {
88  ‪killstreaks::register_strings( ‪COMBAT_ROBOT_NAME, &"KILLSTREAK_COMBAT_ROBOT_EARNED", &"KILLSTREAK_COMBAT_ROBOT_NOT_AVAILABLE", &"KILLSTREAK_COMBAT_ROBOT_INBOUND", undefined, &"KILLSTREAK_COMBAT_ROBOT_HACKED" );
89  ‪killstreaks::register_dialog( ‪COMBAT_ROBOT_NAME, "mpl_killstreak_combat_robot", "combatRobotDialogBundle", "combatRobotPilotDialogBundle", "friendlyCombatRobot", "enemyCombatRobot", "enemyCombatRobotMultiple", "friendlyCombatRobotHacked", "enemyCombatRobotHacked", "requestCombatRobot", "threatCombatRobot" );
90 
91  // TODO: Move to killstreak data
92  level.killstreaks[‪INVENTORY_COMBAT_ROBOT_NAME].threatOnKill = true;
93  level.killstreaks[‪COMBAT_ROBOT_NAME].threatOnKill = true;
94 
95  level thread ‪_CleanupRobotCorpses();
96 }
97 
98 function private ‪_CalculateProjectedGuardPosition( player )
99 {
100  // Find the closest navmesh position projected out from the reticle.
101  return GetClosestPointOnNavMesh( player.origin, 48 );
102 }
103 
104 function private ‪_CalculateRobotSpawnPosition( player )
105 {
106  desiredSpawnPosition = AnglesToForward( player.angles ) *
107  ‪COMBAT_ROBOT_FORWARD_SPAWN_OFFSET + player.origin;
108 
109  return GetClosestPointOnNavMesh( desiredSpawnPosition, 48 );
110 }
111 
112 function private ‪_CleanupRobotCorpses()
113 {
114  corpseDeleteTime = 15000;
115 
116  while ( true )
117  {
118  deleteCorpses = [];
119 
120  foreach ( corpse in GetCorpseArray() )
121  {
122  if ( IsDefined( corpse.birthtime ) &&
123  IsDefined( corpse.archetype ) &&
124  corpse.archetype == "robot" &&
125  ( corpse.birthtime + corpseDeleteTime ) < GetTime() )
126  {
127  deleteCorpses[ deleteCorpses.size ] = corpse;
128  }
129  }
130 
131  for ( index = 0; index < deleteCorpses.size; index++ )
132  {
133  deleteCorpses[ index ] Delete();
134  }
135 
136  wait ( corpseDeleteTime / 1000 ) / 2;
137  }
138 }
139 
141 {
142  robot = self;
143  robot.properName = "";
144  // Prevent the robot from being damaged based on a hurt trigger when being called in.
145  robot.ignoreTriggerDamage = true;
146 
147  robot.empShutdownTime = ‪COMBAT_ROBOT_EMP_DURATION;
148  robot.minWalkDistance = 60;
149  robot.superSprintDistance = 180;
150  robot.robotRusherMinRadius = 64;
151  robot.robotRusherMaxRadius = 120;
152  robot.allowPushActors = false;
153  robot.chargeMeleeDistance = 0; // Disable charge melee, more effective to shoot.
154  robot.fovcosine = 0; // 360 degree field of view
155  robot.fovcosinebusy = 0; // 360 degree field of view even when busy
156  robot.MaxSightDistSqrd = ‪SQR( 2000 );
157 
159 
160  // Disable head gibbing.
162  robot ‪clientfield::set( ‪GIB_CLIENTFIELD, robot.gib_state );
163 
164  ‪_ConfigureRobotTeam( robot, player, ‪isHacked );
165 
166  robot ‪ai::set_behavior_attribute( "can_become_crawler", false );
167  robot ‪ai::set_behavior_attribute( "can_be_meleed", false );
168  robot ‪ai::set_behavior_attribute( "can_initiateaivsaimelee", false );
169  robot ‪ai::set_behavior_attribute( "supports_super_sprint", true );
170 }
171 
172 function private ‪_ConfigureRobotTeam( robot, player, ‪isHacked )
173 {
174  if ( ‪isHacked )
175  {
176  lightsState = ‪ROBOT_LIGHTS_HACKED;
177  }
178  else
179  {
180  lightsState = ‪ROBOT_LIGHTS_ON;
181  }
182  robot ‪ai::set_behavior_attribute( "robot_lights", lightsState );
183  robot thread ‪WatchCombatRobotOwnerDisconnect( player );
184 
185  if ( !isdefined( robot.objective ) )
186  {
187  robot.objective = GetEquipmentHeadObjective( GetWeapon( "combat_robot_marker" ) );
188  }
189 
190  robot thread ‪_WatchModeSwap( robot, player );
191  robot thread ‪_Underwater( robot );
192 }
193 
194 
195 function private ‪_CreateGuardMarker( robot, position )
196 {
197  owner = robot.owner;
198  guardMarker = ‪spawn( "script_model", ( 0, 0, 0 ) );
199  guardMarker.origin = position;
200  guardMarker ‪entityheadicons::setEntityHeadIcon( owner.pers["team"], owner, undefined, &"airdrop_combatrobot" );
201 
202  return guardMarker;
203 }
204 
205 function private ‪_DestroyGuardMarker( robot )
206 {
207  if ( isdefined( robot.guardMarker ) )
208  {
209  robot.guardMarker delete();
210  }
211 }
212 
213 function private ‪_Underwater( robot )
214 {
215  robot endon( "death" );
216 
217  while ( true )
218  {
219  if ( ( robot.origin[2] + ‪ROBOT_HEIGHT / 2.0 ) <= GetWaterHeight( robot.origin ) )
220  {
221  robot ASMSetAnimationRate( 0.85 );
222  }
223  else
224  {
225  robot ASMSetAnimationRate( 1.0 );
226  }
227 
228  wait 0.1;
229  }
230 }
231 
232 function private ‪_Escort( robot )
233 {
234  robot endon( "death" );
235 
236  robot.escorting = true;
237  robot.guarding = false;
238 
239  ‪_DestroyGuardMarker( robot );
240 
241  while ( robot.escorting )
242  {
243  attackingEnemy = false;
244 
245  if ( IsDefined( robot.enemy ) && IsAlive( robot.enemy ) )
246  {
247  if ( ( robot LastKnownTime( robot.enemy ) + ‪COMBAT_ROBOT_GIVE_UP_ON_ENEMY ) >= GetTime() )
248  {
249  robot ‪ai::set_behavior_attribute( "move_mode", "rusher" );
250 
251  attackingEnemy = true;
252  }
253  else
254  {
255  robot ClearEnemy();
256  }
257  }
258 
259  if ( !attackingEnemy && IsDefined( robot.owner ) && IsAlive( robot.owner ) )
260  {
261  lookAheadTime = 1.0;
262  predicitedPosition =
263  robot.owner.origin + VectorScale( robot.owner GetVelocity(), lookAheadTime );
264 
265  robot ‪ai::set_behavior_attribute( "escort_position", predicitedPosition );
266  robot ‪ai::set_behavior_attribute( "move_mode", "escort" );
267  }
268 
269  wait 1;
270  }
271 }
272 
273 function private ‪_IgnoreUnattackableEnemy( robot, enemy )
274 {
275  robot endon( "death" );
276 
277  robot SetIgnoreEnt( enemy, true );
278 
280 
281  robot SetIgnoreEnt( enemy, false );
282 }
283 
284 function private ‪_GuardPosition( robot, position )
285 {
286  robot endon( "death" );
287 
288  robot.goalradius = ‪COMBAT_ROBOT_GUARD_RADIUS;
289  robot SetGoal( position );
290 
291  robot.escorting = false;
292  robot.guarding = true;
293 
294  ‪_DestroyGuardMarker( robot );
295 
296  robot.guardMarker = ‪_CreateGuardMarker( robot, position );
297 
298  while ( robot.guarding )
299  {
300  attackingEnemy = false;
301 
302  if ( IsDefined( robot.enemy ) && IsAlive( robot.enemy ) )
303  {
304  if ( ( robot LastKnownTime( robot.enemy ) + ‪COMBAT_ROBOT_GIVE_UP_ON_ENEMY ) >= GetTime() )
305  {
306  // Robot still within goalradius, continue pursuit.
307  robot ‪ai::set_behavior_attribute( "move_mode", "rusher" );
308 
309  attackingEnemy = true;
310  }
311  else
312  {
313  robot ClearEnemy();
314  }
315  }
316 
317  if ( !attackingEnemy )
318  {
319  robot ‪ai::set_behavior_attribute( "move_mode", "guard" );
320  }
321 
322  wait 1;
323  }
324 }
325 
326 function ‪_WatchModeSwap( robot, player )
327 {
328  robot endon( "death" );
329 
330  nextSwitchTime = GetTime();
331 
332  while ( true )
333  {
335 
336  if( !isdefined( robot.useTrigger ) )
337  continue;
338 
339  robot.useTrigger waittill( "trigger" );
340 
341  if ( nextSwitchTime <= GetTime() && IsAlive( player ) )
342  {
343  if ( ‪IS_TRUE( robot.guarding ) )
344  {
345  robot.guarding = false;
346  robot.escorting = true;
347 
348  player playsoundtoplayer( "uin_mp_combat_bot_escort", player );
349  robot thread ‪_Escort( robot );
350  if( isdefined( robot.useTrigger ) )
351  robot.useTrigger SetHintString( &"KILLSTREAK_COMBAT_ROBOT_GUARD_HINT" );
352 
353  if( isdefined( robot.markerFXHandle ) )
354  robot.markerFXHandle delete();
355  }
356  else
357  {
358  navGuardPosition = ‪_CalculateProjectedGuardPosition( player );
359 
360  if ( IsDefined( navGuardPosition ) )
361  {
362  robot.guarding = true;
363  robot.escorting = false;
364 
365  player playsoundtoplayer( "uin_mp_combat_bot_guard", player );
366  robot thread ‪_GuardPosition( robot, navGuardPosition );
367  if( isdefined( robot.useTrigger ) )
368  robot.useTrigger SetHintString( &"KILLSTREAK_COMBAT_ROBOT_ESCORT_HINT" );
369 
370  if( isdefined( robot.markerFXHandle ) )
371  robot.markerFXHandle delete();
372 
373  params = level.killstreakBundle[‪COMBAT_ROBOT_NAME];
374  if( isdefined( params.ksCombatRobotPatrolFX ) )
375  {
376  point = player.origin;
377  if( !isdefined( point ) )
378  point = navGuardPosition;
379 
380  robot.markerFXHandle = SpawnFx( params.ksCombatRobotPatrolFX, point + ( 0, 0, 3 ), ( 0, 0, 1 ), ( 1, 0, 0 ) );
381  robot.markerFXHandle.team = player.team;
382  TriggerFX( robot.markerFXHandle );
383 
384  robot.markerFXHandle SetInvisibleToAll();
385  robot.markerFXHandle SetVisibleToPlayer( player );
386  }
387  }
388  else
389  {
390  player iPrintLnBold( &"KILLSTREAK_COMBAT_ROBOT_PATROL_FAIL" );
391  }
392  }
393 
394  robot notify("bhtn_action_notify", "modeSwap");
395 
396  nextSwitchTime = GetTime() + 1000;
397  }
398  }
399 }
400 
401 function ‪ActivateCombatRobot( killstreak )
402 {
403  player = self;
404  team = self.team;
405 
406  if( !self ‪supplydrop::isSupplyDropGrenadeAllowed( killstreak ) )
407  {
408  return false;
409  }
410 
411  killstreak_id = self ‪killstreakrules::killstreakStart( killstreak, team, false, false );
412  if ( killstreak_id == -1 )
413  {
414  return false;
415  }
416 
417  context = SpawnStruct();
418  context.prolog = &‪Prolog;
419  context.epilog = &‪Epilog;
420 
421  context.hasFlares = 1;
422  context.radius = level.killstreakCoreBundle.ksAirdropRobotRadius;
423  context.dist_from_boundary = ‪COMBAT_ROBOT_NAV_MESH_VALID_LOCATION_BOUNDARY;
424  context.max_dist_from_location = ‪COMBAT_ROBOT_NAV_MESH_VALID_LOCATION_TOLERANCE;
425  context.perform_physics_trace = true;
426  context.drop_from_goal_distance2d = 96; // combat robot doesn't need this value to be strict (note: drop ship related)
427  context.isLocationGood = &‪supplydrop::IsLocationGood;
428  context.objective = &"airdrop_combatrobot";
429  context.killstreakRef = killstreak;
430  context.validLocationSound = level.killstreakCoreBundle.ksValidCombatRobotLocationSound;
431  context.vehiclename = "combat_robot_dropship";
432  context.killstreak_id = killstreak_id;
434 
435  // This offset is specific to the exit vtol animation of the combat rider.
436  context.dropOffset = (0, -120, 0);
437 
438  ‪result = self ‪supplydrop::useSupplyDropMarker( killstreak_id, context );
439 
440  if ( !isdefined(‪result) || !‪result )
441  {
442  ‪killstreakrules::killstreakStop( killstreak, team, killstreak_id );
443  return false;
444  }
445 
446  self ‪killstreaks::play_killstreak_start_dialog( ‪COMBAT_ROBOT_NAME, self.team, killstreak_id );
448 
449  self AddWeaponStat( GetWeapon( ‪COMBAT_ROBOT_MARKER_NAME ), "used", 1 );
450 
451  return ‪result;
452 }
453 
454 
456 {
457  robot = self;
458  robot endon( "death" );
459  robot endon( "combat_robot_land" );
460 
461  while( true )
462  {
466  }
467 }
468 
469 function ‪WatchHelicopterDeath( context )
470 {
471  helicopter = self;
472  helicopter waittill( "death" );
473 
474  ‪callback::callback( #"on_vehicle_killed" );
475 
476  if( isdefined( context.marker ) )
477  {
478  context.marker delete();
479  context.marker = undefined;
480 
481  if( isdefined( context.markerFXHandle ) )
482  {
483  context.markerFXHandle delete();
484  context.markerFXHandle = undefined;
485  }
486  ‪supplydrop::DelDropLocation( context.killstreak_id );
487  }
488 }
489 
490 function ‪Prolog( context )
491 {
492  helicopter = self;
493  player = helicopter.owner;
494 
495  spawnPosition = ( 0,0,0 );
496  spawnAngles = ( 0,0,0 );
497 
498  combatRobot = SpawnActor(
499  "spawner_bo3_robot_grunt_assault_mp",
500  spawnPosition,
501  spawnAngles,
502  "",
503  true );
504  combatRobot.missileTrackDamage = 0;
505  combatRobot ‪killstreaks::configure_team( ‪COMBAT_ROBOT_NAME, context.killstreak_id, player, ‪COMBAT_ROBOT_INFLUENCER, undefined, &‪ConfigureTeamPost );
507  combatRobot thread ‪_Escort( combatRobot );
508 
509  combatRobot thread ‪WatchCombatRobotHelicopterHacked( helicopter );
510  combatRobot thread ‪WatchCombatRobotShutdown();
511  combatRobot thread ‪WatchCombatRobotDeath();
513  combatRobot thread ‪sndWatchCombatRobotVoxNotifies();
514 
515  helicopter thread ‪WatchHelicopterDeath( context );
516  helicopter.unloadTimeout = 6;
517 
518  ‪killstreak_detect::killstreakTargetSet( combatRobot, ( 0, 0, 50 ) );
519 
520  combatRobot.maxhealth = combatRobot.health;
521 
523 
524  if ( isdefined( tableHealth ) )
525  {
526  combatRobot.maxhealth = tableHealth;
527  }
528 
529  combatRobot.health = combatRobot.maxhealth;
530  combatRobot.treat_owner_damage_as_friendly_fire = true;
531  combatRobot.ignore_team_kills = true;
532  combatRobot.remoteMissileDamage = combatRobot.maxhealth + 1;
533  combatRobot.rocketDamage = combatRobot.maxhealth / 2 + 1;
535  combatRobot ‪clientfield::set( "enemyvehicle", ‪ENEMY_VEHICLE_ACTIVE );
536  combatRobot.soundmod = "drone_land";
537 
539 
540  combatRobot.vehicle = helicopter;
541  combatRobot.vehicle.ignore_seat_check = true;
542  combatRobot ‪vehicle::get_in( helicopter , "driver", true );
543 
544  combatRobot.overrideDropPosition = player.markerPosition;
545 
546  combatRobot thread ‪WatchCombatRobotLanding();
547  combatRobot thread ‪sndWatchExit();
548  combatRobot thread ‪sndWatchLanding();
549  combatRobot thread ‪sndWatchActivate();
550 
551  foreach( player in level.players )
552  {
553  combatRobot ‪respectNotTargetedByRobotPerk( player );
554  }
555 
557  context.robot = combatRobot;
558 }
559 
561 {
562  combatRobot = self;
563  combatRobot setignoreent( player, player hasperk( "specialty_nottargetedbyrobot" ) );
564 }
565 
566 function ‪Epilog( context )
567 {
568  helicopter = self;
569 
570  context.robot thread ‪DropKillThread();
571  context.robot.startTime = GetTime() + ‪COMBAT_ROBOT_KILLCAM_TIME_OFFSET; // set killcam to start a time offset from when drop ship arrives
572  thread ‪CleanupThread( context );
573 
574  helicopter ‪WaitThenSetDeleteAfterDestructionWaitTime( 0.8, ‪VAL( self.unloadTimeout, 0 ) + 0.1 );
575 
576  helicopter ‪vehicle::unload( "all", undefined, true, 0.8 ); // removes robot as rider so that it doesn't
577 }
578 
579 function ‪WaitThenSetDeleteAfterDestructionWaitTime( set_wait_time, delete_after_destruction_wait_time )
580 {
581  wait set_wait_time;
582 
583  if ( isdefined( self ) )
584  {
585  self.delete_after_destruction_wait_time = delete_after_destruction_wait_time;
586  }
587 }
588 
589 function ‪HackedCallbackPost( hacker )
590 {
591  robot = self;
592  robot ClearEnemy();
593  robot ‪SetupCombatRobotHintTrigger( hacker );
594 }
595 
596 
598 {
599  robot = self;
600  robot endon( "death" );
601  robot endon( "killstreak_hacked" );
602  robot endon( "combat_robot_land" );
603 
604  helicopter endon( "death" );
605 
606  helicopter waittill( "killstreak_hacked", hacker );
607 
608  if( robot ‪flagsys::get( "in_vehicle" ) == false )
609  return;
610 
611  robot [[ robot.killstreak_hackedCallback ]]( hacker );
612 }
613 
614 function ‪CleanupThread( context )
615 {
616  robot = context.robot;
617  while( isdefined( robot ) && isdefined( context.marker ) && ( robot ‪flagsys::get( "in_vehicle" ) ) )
618  {
619  wait 1;
620  }
621  if( isdefined( context.marker ) )
622  {
623  context.marker delete();
624  context.marker = undefined;
625 
626  if( isdefined( context.markerFXHandle ) )
627  {
628  context.markerFXHandle delete();
629  context.markerFXHandle = undefined;
630  }
631  ‪supplydrop::DelDropLocation( context.killstreak_id );
632  }
633 }
634 
636 {
637  combatRobot = self;
638  combatRobot endon( "combat_robot_shutdown" );
640  combatRobot waittill( "death", attacker, damageFromUnderneath, weapon );
641  // combatRobot waittill( "death", attacker, damageFromUnderneath, weapon, point, dir, modType );
642 
643  attacker = self [[ level.figure_out_attacker ]]( attacker );
644 
645  if ( isdefined( attacker ) && IsPlayer( attacker ) && ( !isdefined( combatRobot.owner ) || combatRobot.owner ‪util::IsEnemyPlayer( attacker ) ) )
646  {
647  attacker ‪challenges::destroyScoreStreak( weapon, false, true );
649  ‪scoreevents::processScoreEvent( "destroyed_combat_robot", attacker, combatRobot.owner, weapon );
650  LUINotifyEvent( &"player_callout", 2, &"KILLSTREAK_DESTROYED_COMBAT_ROBOT", attacker.entnum );
651  }
652 
653  combatRobot ‪killstreaks::play_destroyed_dialog_on_owner( ‪COMBAT_ROBOT_NAME, combatRobot.killstreak_id );
654 
655  combatRobot notify( "combat_robot_shutdown" );
656 }
657 
659 {
660  robot = self;
661  robot endon( "death" );
662  robot endon( "combat_robot_shutdown" );
663 
664  // wait for landing
665  while( robot ‪flagsys::get( "in_vehicle" ) )
666  {
667  wait 1;
668  }
669 
670  robot notify( "combat_robot_land" );
671 
672  robot.ignoreTriggerDamage = false;
673 
674  // only check if on nav mesh after finishing traversals
675  while ( isdefined( robot.traverseStartNode ) )
676  {
677  robot waittill( "traverse_end" );
678  }
679 
680  v_on_navmesh = GetClosestPointOnNavMesh( robot.origin, 50, 20 );
681 
682  if ( isdefined ( v_on_navmesh ) )
683  {
684  player = robot.owner;
685 
686  robot ‪SetupCombatRobotHintTrigger( player );
687  }
688  else
689  {
690  robot notify( "combat_robot_shutdown" );
691  }
692 }
693 
695 {
696  robot = self;
697  if ( isdefined( robot.useTrigger ) )
698  {
699  robot.useTrigger delete();
700  }
701  robot.useTrigger = ‪spawn( "trigger_radius_use", player.origin, 32, 32 );
702  robot.useTrigger EnableLinkTo();
703  robot.useTrigger LinkTo( player );
704  robot.useTrigger SetHintLowPriority( true );
705  robot.useTrigger SetCursorHint( "HINT_NOICON" );
706  robot.useTrigger SetHintString( &"KILLSTREAK_COMBAT_ROBOT_GUARD_HINT" );
707 
708  robot.useTrigger SetTeamForTrigger( player.team );
709  robot.useTrigger.team = player.team;
710 
711  player ClientClaimTrigger( robot.useTrigger );
712  player.remoteControlTrigger = robot.useTrigger;
713  robot.useTrigger.ClaimedBy = player;
714 }
715 
717 {
718  combatRobot = self;
719  combatRobot notify( "WatchCombatRobotOwnerDisconnect_singleton" );
720  combatRobot endon( "WatchCombatRobotOwnerDisconnect_singleton" );
721  combatRobot endon( "combat_robot_shutdown" );
722 
723  player ‪util::waittill_any( "joined_team", "disconnect", "joined_spectators" );
724  combatRobot notify( "combat_robot_shutdown" );
725 }
726 
727 function private ‪_corpseWatcher()
728 {
729  archetype = self.archetype;
730  self waittill("actor_corpse", corpse);
731  corpse ‪clientfield::set("arch_actor_fire_fx", ‪BURN_SMOLDER);
732 }
733 
734 function private ‪_explodeRobot( combatRobot )
735 {
736  combatRobot ‪clientfield::set("arch_actor_fire_fx", ‪BURN_BODY);
739  combatRobot thread ‪_corpseWatcher();
740 
741  if ( RandomInt( 100 ) >= 50 )
742  ‪GibServerUtils::GibLeftArm( combatRobot );
743  else
744  ‪GibServerUtils::GibRightArm( combatRobot );
745 
746  ‪GibServerUtils::GibLegs( combatRobot );
747  ‪GibServerUtils::GibHead( combatRobot );
748 
749  velocity = combatRobot GetVelocity() * ‪COMBAT_ROBOT_VELOCITY_SCALAR;
750 
751  combatRobot StartRagdoll();
752  combatRobot LaunchRagdoll(
753  ( velocity[0] + RandomFloatRange( ‪COMBAT_ROBOT_ADD_X_VELOCITY_MIN, ‪COMBAT_ROBOT_ADD_X_VELOCITY_MAX ),
756  "j_mainroot" );
757 }
758 
760 {
761  combatRobot = self;
762 
764 
765  combatRobot ‪ai::set_behavior_attribute( "shutdown", true );
766 
768 
769  ‪_explodeRobot( combatRobot );
770 
771  params = level.killstreakBundle[‪COMBAT_ROBOT_NAME];
772 
773  if( isdefined( params.ksExplosionFX ) )
774  {
775  PlayFXOnTag( params.ksExplosionFX, combatRobot, "tag_origin" );
776  }
777  Target_Remove( combatRobot );
778 
779  ‪DEFAULT( params.ksExplosionOuterRadius, 200 );
780  ‪DEFAULT( params.ksExplosionInnerRadius, 1 );
781  ‪DEFAULT( params.ksExplosionOuterDamage, 25 );
782  ‪DEFAULT( params.ksExplosionInnerDamage, 350 );
783  ‪DEFAULT( params.ksExplosionMagnitude, 1 );
784 
785  PhysicsExplosionSphere( combatRobot.origin,
786  params.ksExplosionOuterRadius,
787  params.ksExplosionInnerRadius,
788  params.ksExplosionMagnitude,
789  params.ksExplosionOuterDamage,
790  params.ksExplosionInnerDamage );
791 
792  if( isdefined( combatRobot.owner ) )
793  {
794  RadiusDamage( combatRobot.origin,
795  params.ksExplosionOuterRadius,
796  params.ksExplosionInnerDamage,
797  params.ksExplosionOuterDamage,
798  combatRobot.owner,
799  "MOD_EXPLOSIVE",
800  GetWeapon( ‪COMBAT_ROBOT_MARKER_NAME ) );
801 
802  if( isdefined( params.ksExplosionRumble ) )
803  combatRobot.owner PlayRumbleOnEntity( params.ksExplosionRumble );
804  }
805 
806  wait( 0.2 );
807 
808  combatRobot notify( "combat_robot_shutdown" );
809 }
810 
812 {
813  combatRobot = self;
814  combatRobotTeam = combatRobot.originalteam;
815  combatRobotKillstreakId = combatRobot.killstreak_id;
816  combatRobot waittill( "combat_robot_shutdown" );
817 
818  combatRobot playsound ("evt_combat_bot_mech_fail_explode");
819 
820  if( isdefined( combatRobot.useTrigger ) )
821  combatRobot.useTrigger delete();
822 
823  if( isdefined( combatRobot.markerFXHandle ) )
824  combatRobot.markerFXHandle delete();
825 
826  ‪_DestroyGuardMarker( combatRobot );
827 
828  ‪killstreakrules::killstreakStop( ‪COMBAT_ROBOT_NAME, combatRobotTeam, combatRobotKillstreakId );
829 
830  if( isdefined( combatRobot ) )
831  {
832  if( Target_IsTarget( combatRobot ) )
833  Target_Remove( combatRobot );
834  if( !level.gameEnded ) // kill and do damage do nothing after game end
835  {
836  if( combatRobot ‪flagsys::get( "in_vehicle" ) )
837  combatRobot Unlink();
838  combatRobot Kill();
839  }
840  }
841 }
842 
844 {
845  combatRobot = self;
846  combatRobot endon( "combat_robot_shutdown" );
847  combatRobot endon( "death" );
848 
849  combatRobot PlaySoundOnTag( "vox_robot_chatter", "j_head" );
850 
851  while( 1 )
852  {
853  soundAlias = undefined;
854  combatRobot waittill("bhtn_action_notify", notify_string);
855 
856  switch( notify_string )
857  {
858  case "charge":
859  case "attack_melee":
860  case "attack_kill":
861  case "modeSwap":
862  soundAlias = "vox_robot_chatter";
863  break;
864  }
865 
866  if( isdefined( soundAlias ) )
867  {
868  combatRobot PlaySoundOnTag( soundAlias, "j_head" );
869  wait(1.2);
870  }
871  }
872 }
873 function ‪sndWatchExit()
874 {
875  combatRobot = self;
876  combatRobot endon( "combat_robot_shutdown" );
877  combatRobot endon( "death" );
878 
879  combatRobot waittill( "exiting_vehicle" );
880 
881  combatRobot playsound( "veh_vtol_supply_robot_launch" );
882 }
884 {
885  combatRobot = self;
886  combatRobot endon( "combat_robot_shutdown" );
887  combatRobot endon( "death" );
888 
889  combatRobot waittill( "falling", falltime );
890 
891  wait_time = falltime - .5;
892 
893  if ( wait_time > 0 )
894  wait( wait_time );
895 
896  combatRobot playsound( "veh_vtol_supply_robot_land" );
897 }
899 {
900  combatRobot = self;
901  combatRobot endon( "combat_robot_shutdown" );
902  combatRobot endon( "death" );
903 
904  combatRobot waittill( "landing" );
905  wait(.1);
906  combatRobot playsound( "veh_vtol_supply_robot_activate" );
907 }
908 
909 function ‪combatRobotDamageOverride( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, boneIndex, modelIndex )
910 {
911  combatRobot = self;
912 
913  if( combatRobot ‪flagsys::get( "in_vehicle" ) && ( sMeansOfDeath == "MOD_TRIGGER_HURT" ) ) // the dropship goes through hurt triggers sometimes
914  iDamage = 0;
915  else
916  iDamage = ‪killstreaks::OnDamagePerWeapon( ‪COMBAT_ROBOT_NAME, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, self.maxhealth, undefined, self.maxhealth*0.4, undefined, 0, undefined, true, 1.0 );
917 
918  combatRobot.missileTrackDamage += iDamage;
919 
920  if ( iDamage > 0 && isdefined( eAttacker ) )
921  {
922  if ( isPlayer( eAttacker) )
923  {
924  if ( isdefined( combatRobot.owner ) )
925  {
926  ‪challenges::combat_robot_damage( eAttacker, combatRobot.Owner );
927  }
928  }
929  }
930  return iDamage;
931 }
‪processScoreEvent
‪function processScoreEvent(event, player, victim, weapon)
Definition: scoreevents_shared.gsc:19
‪_CalculateProjectedGuardPosition
‪function private _CalculateProjectedGuardPosition(player)
Definition: _combat_robot.gsc:98
‪_WatchModeSwap
‪function _WatchModeSwap(robot, player)
Definition: _combat_robot.gsc:326
‪COMBAT_ROBOT_ADD_X_VELOCITY_MIN
‪#define COMBAT_ROBOT_ADD_X_VELOCITY_MIN
Definition: _combat_robot.gsc:50
‪ActivateCombatRobot
‪function ActivateCombatRobot(killstreak)
Definition: _combat_robot.gsc:401
‪callback
‪function callback(event, localclientnum, params)
Definition: callbacks_shared.csc:13
‪BURN_BODY
‪#define BURN_BODY
Definition: archetype_damage_effects.gsh:4
‪AddAIOverrideDamageCallback
‪function AddAIOverrideDamageCallback(entity, callback, addToFront)
Definition: archetype_utility.gsc:542
‪WatchCombatRobotLanding
‪function WatchCombatRobotLanding()
Definition: _combat_robot.gsc:658
‪is_clone_touching_crate
‪function is_clone_touching_crate()
Definition: _supplydrop.gsc:2281
‪ROBOT_MIND_CONTROL_EXPLOSION_ON
‪#define ROBOT_MIND_CONTROL_EXPLOSION_ON
Definition: archetype_robot.gsh:171
‪DropKillThread
‪function DropKillThread()
Definition: _combat_robot.gsc:455
‪WaitForTimeout
‪function WaitForTimeout(killstreak, duration, callback, endCondition1, endCondition2, endCondition3)
Definition: _killstreaks.gsc:2913
‪_IgnoreUnattackableEnemy
‪function private _IgnoreUnattackableEnemy(robot, enemy)
Definition: _combat_robot.gsc:273
‪INVENTORY_COMBAT_ROBOT_NAME
‪#define INVENTORY_COMBAT_ROBOT_NAME
Definition: _combat_robot.gsc:46
‪WatchCombatRobotOwnerDisconnect
‪function WatchCombatRobotOwnerDisconnect(player)
Definition: _combat_robot.gsc:716
‪GibLeftArm
‪function GibLeftArm(entity)
Definition: gib.gsc:450
‪ROBOT_MIND_CONTROL_EXPLOSION_CLIENTFIELD
‪#define ROBOT_MIND_CONTROL_EXPLOSION_CLIENTFIELD
Definition: archetype_robot.gsh:167
‪COMBAT_ROBOT_INFLUENCER
‪#define COMBAT_ROBOT_INFLUENCER
Definition: _combat_robot.gsc:44
‪init
‪function init()
Definition: _combat_robot.gsc:84
‪MissileTarget_ProximityDetonateIncomingMissile
‪function MissileTarget_ProximityDetonateIncomingMissile(endon1, endon2, allowDirectDamage)
Definition: _heatseekingmissile.gsc:1085
‪get_in
‪function get_in(vh, str_pos, b_teleport=false)
Definition: vehicleriders_shared.gsc:226
‪COMBAT_ROBOT_VELOCITY_SCALAR
‪#define COMBAT_ROBOT_VELOCITY_SCALAR
Definition: _combat_robot.gsc:49
‪GIB_CLIENTFIELD
‪#define GIB_CLIENTFIELD
Definition: gib.gsh:36
‪play_killstreak_start_dialog
‪function play_killstreak_start_dialog(killstreakType, team, killstreakId)
Definition: _killstreaks.gsc:1905
‪COMBAT_ROBOT_DURATION
‪#define COMBAT_ROBOT_DURATION
Definition: _killstreaks.gsh:320
‪destroyScoreStreak
‪function destroyScoreStreak(weapon, playerControlled, groundBased, countAsKillstreakVehicle=true)
Definition: challenges_shared.gsc:784
‪PHYSICS_TRACE_MASK_WATER
‪#define PHYSICS_TRACE_MASK_WATER
Definition: shared.gsh:132
‪VAL
‪#define VAL(__var, __default)
Definition: shared.gsh:272
‪WatchCombatRobotHelicopterHacked
‪function WatchCombatRobotHelicopterHacked(helicopter)
Definition: _combat_robot.gsc:597
‪CleanupThread
‪function CleanupThread(context)
Definition: _combat_robot.gsc:614
‪play_pilot_dialog_on_owner
‪function play_pilot_dialog_on_owner(dialogKey, killstreakType, killstreakId)
Definition: _killstreaks.gsc:2010
‪OnDamagePerWeapon
‪function OnDamagePerWeapon(killstreak_ref, attacker, damage, flags, type, weapon, max_health, destroyed_callback, low_health, low_health_callback, emp_damage, emp_callback, allow_bullet_damage, chargeLevel)
Definition: _killstreaks.gsc:2667
‪WaitThenSetDeleteAfterDestructionWaitTime
‪function WaitThenSetDeleteAfterDestructionWaitTime(set_wait_time, delete_after_destruction_wait_time)
Definition: _combat_robot.gsc:579
‪COMBAT_ROBOT_NAME
‪#define COMBAT_ROBOT_NAME
Definition: _combat_robot.gsc:43
‪is_touching_crate
‪function is_touching_crate()
Definition: _supplydrop.gsc:2228
‪COMBAT_ROBOT_ADD_Z_VELOCITY_MAX
‪#define COMBAT_ROBOT_ADD_Z_VELOCITY_MAX
Definition: _combat_robot.gsc:55
‪ENEMY_VEHICLE_ACTIVE
‪#define ENEMY_VEHICLE_ACTIVE
Definition: _hacker_tool.gsh:2
‪COMBAT_ROBOT_NAV_MESH_VALID_LOCATION_TOLERANCE
‪#define COMBAT_ROBOT_NAV_MESH_VALID_LOCATION_TOLERANCE
Definition: _combat_robot.gsc:68
‪ROBOT_LIGHTS_ON
‪#define ROBOT_LIGHTS_ON
Definition: archetype_robot.gsh:182
‪unload
‪function unload(str_group="all", str_mode, remove_rider_before_unloading, remove_riders_wait_time)
Definition: vehicleriders_shared.gsc:584
‪ROBOT_MODE
‪#define ROBOT_MODE
Definition: blackboard.gsh:152
‪HackedCallbackPost
‪function HackedCallbackPost(hacker)
Definition: _combat_robot.gsc:589
‪SetBlackBoardAttribute
‪function SetBlackBoardAttribute(entity, attributeName, attributeValue)
Definition: blackboard.gsc:56
‪COMBAT_ROBOT_IGNORE_UNATTACKABLE_ENEMY
‪#define COMBAT_ROBOT_IGNORE_UNATTACKABLE_ENEMY
Definition: _combat_robot.gsc:65
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪_Escort
‪function private _Escort(robot)
Definition: _combat_robot.gsc:232
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪SQR
‪#define SQR(__var)
Definition: shared.gsh:293
‪COMBAT_ROBOT_EMP_DURATION
‪#define COMBAT_ROBOT_EMP_DURATION
Definition: _killstreaks.gsh:321
‪sndWatchCombatRobotVoxNotifies
‪function sndWatchCombatRobotVoxNotifies()
Definition: _combat_robot.gsc:843
‪_Underwater
‪function private _Underwater(robot)
Definition: _combat_robot.gsc:213
‪GIB_UNDAMAGED_FLAG
‪#define GIB_UNDAMAGED_FLAG
Definition: gib.gsh:20
‪IsEnemyPlayer
‪function IsEnemyPlayer(player)
Definition: util_shared.csc:1220
‪useSupplyDropMarker
‪function useSupplyDropMarker(package_contents_id, context)
Definition: _supplydrop.gsc:575
‪combatRobotDamageOverride
‪function combatRobotDamageOverride(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, boneIndex, modelIndex)
Definition: _combat_robot.gsc:909
‪ConfigureTeamPost
‪function ConfigureTeamPost(player, isHacked)
Definition: _combat_robot.gsc:140
‪WatchHelicopterDeath
‪function WatchHelicopterDeath(context)
Definition: _combat_robot.gsc:469
‪SetupCombatRobotHintTrigger
‪function SetupCombatRobotHintTrigger(player)
Definition: _combat_robot.gsc:694
‪COMBAT_ROBOT_ADD_Y_VELOCITY_MAX
‪#define COMBAT_ROBOT_ADD_Y_VELOCITY_MAX
Definition: _combat_robot.gsc:53
‪displayKillstreakStartTeamMessageToAll
‪function displayKillstreakStartTeamMessageToAll(hardpointType)
Definition: _killstreakrules.gsc:246
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪COMBAT_ROBOT_FORWARD_SPAWN_OFFSET
‪#define COMBAT_ROBOT_FORWARD_SPAWN_OFFSET
Definition: _combat_robot.gsc:40
‪on_spawned
‪function on_spawned(func, obj)
Definition: callbacks_shared.csc:245
‪OnCombatRobotTimeout
‪function OnCombatRobotTimeout()
Definition: _combat_robot.gsc:759
‪sndWatchLanding
‪function sndWatchLanding()
Definition: _combat_robot.gsc:883
‪ROBOT_LIGHTS_HACKED
‪#define ROBOT_LIGHTS_HACKED
Definition: archetype_robot.gsh:185
‪Epilog
‪function Epilog(context)
Definition: _combat_robot.gsc:566
‪WatchCombatRobotShutdown
‪function WatchCombatRobotShutdown()
Definition: _combat_robot.gsc:811
‪play_destroyed_dialog_on_owner
‪function play_destroyed_dialog_on_owner(killstreakType, killstreakId)
Definition: _killstreaks.gsc:1982
‪isSupplyDropGrenadeAllowed
‪function isSupplyDropGrenadeAllowed(killstreak)
Definition: _supplydrop.gsc:646
‪COMBAT_ROBOT_GUARD_RADIUS
‪#define COMBAT_ROBOT_GUARD_RADIUS
Definition: _combat_robot.gsc:41
‪_corpseWatcher
‪function private _corpseWatcher()
Definition: _combat_robot.gsc:727
‪Prolog
‪function Prolog(context)
Definition: _combat_robot.gsc:490
‪sndWatchActivate
‪function sndWatchActivate()
Definition: _combat_robot.gsc:898
‪DelDropLocation
‪function DelDropLocation(killstreak_id)
Definition: _supplydrop.gsc:663
‪_CleanupRobotCorpses
‪function private _CleanupRobotCorpses()
Definition: _combat_robot.gsc:112
‪waittill_any
‪function waittill_any(str_notify1, str_notify2, str_notify3, str_notify4, str_notify5)
Definition: util_shared.csc:375
‪ROBOT_HEIGHT
‪#define ROBOT_HEIGHT
Definition: archetype_robot.gsh:103
‪killstreakTargetSet
‪function killstreakTargetSet(killstreakEntity, offset)
Definition: _killstreak_detect.gsc:29
‪combat_robot_damage
‪function combat_robot_damage(eAttacker, combatRobotOwner)
Definition: _challenges.gsc:1747
‪get_max_health
‪function get_max_health(killstreakType)
Definition: _killstreak_bundles.gsc:188
‪register_dialog
‪function register_dialog(killstreakType, informDialog, taacomDialogBundleKey, pilotDialogArrayKey, startDialogKey, enemyStartDialogKey, enemyStartMultipleDialogKey, hackedDialogKey, hackedStartDialogKey, requestDialogKey, threatDialogKey, isInventory)
Definition: _killstreaks.gsc:239
‪PHYSICS_TRACE_MASK_PHYSICS
‪#define PHYSICS_TRACE_MASK_PHYSICS
Definition: shared.gsh:130
‪COMBAT_ROBOT_GIVE_UP_ON_ENEMY
‪#define COMBAT_ROBOT_GIVE_UP_ON_ENEMY
Definition: _combat_robot.gsc:62
‪COMBAT_ROBOT_MIN_SHUTDOWN
‪#define COMBAT_ROBOT_MIN_SHUTDOWN
Definition: _combat_robot.gsc:58
‪WatchCombatRobotDeath
‪function WatchCombatRobotDeath()
Definition: _combat_robot.gsc:635
‪_GuardPosition
‪function private _GuardPosition(robot, position)
Definition: _combat_robot.gsc:284
‪_CreateGuardMarker
‪function private _CreateGuardMarker(robot, position)
Definition: _combat_robot.gsc:195
‪_DestroyGuardMarker
‪function private _DestroyGuardMarker(robot)
Definition: _combat_robot.gsc:205
‪register_strings
‪function register_strings(killstreakType, receivedText, notUsableText, inboundText, inboundNearPlayerText, hackedText, utilizesAirspace=true, isInventory=false)
Definition: _killstreaks.gsc:223
‪killstreakStop
‪function killstreakStop(hardpointType, team, id)
Definition: _killstreakrules.gsc:293
‪killstreakStart
‪function killstreakStart(hardpointType, team, hacked, displayTeamMessage)
Definition: _killstreakrules.gsc:184
‪setEntityHeadIcon
‪function setEntityHeadIcon(team, owner, offset, objective, constant_size)
Definition: entityheadicons_shared.gsc:43
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪IsLocationGood
‪function IsLocationGood(location, context)
Definition: _supplydrop.gsc:668
‪set_behavior_attribute
‪function set_behavior_attribute(attribute, value)
Definition: ai_shared.gsc:159
‪configure_team
‪function configure_team(killstreakType, killstreakId, owner, influencerType, configureTeamPreFunction, configureTeamPostFunction, isHacked=false)
Definition: _killstreaks.gsc:2806
‪_ConfigureRobotTeam
‪function private _ConfigureRobotTeam(robot, player, isHacked)
Definition: _combat_robot.gsc:172
‪COMBAT_ROBOT_ADD_X_VELOCITY_MAX
‪#define COMBAT_ROBOT_ADD_X_VELOCITY_MAX
Definition: _combat_robot.gsc:51
‪respectNotTargetedByRobotPerk
‪function respectNotTargetedByRobotPerk(player)
Definition: _combat_robot.gsc:560
‪remove_on_spawned
‪function remove_on_spawned(func, obj)
Definition: callbacks_shared.csc:259
‪_explodeRobot
‪function private _explodeRobot(combatRobot)
Definition: _combat_robot.gsc:734
‪register_alt_weapon
‪function register_alt_weapon(killstreakType, weaponName, isInventory)
Definition: _killstreaks.gsc:318
‪COMBAT_ROBOT_MARKER_NAME
‪#define COMBAT_ROBOT_MARKER_NAME
Definition: _combat_robot.gsc:45
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪COMBAT_ROBOT_MAX_SHUTDOWN
‪#define COMBAT_ROBOT_MAX_SHUTDOWN
Definition: _combat_robot.gsc:59
‪enable_hacking
‪function enable_hacking(killstreakName, preHackFunction, postHackFunction)
Definition: _killstreak_hacking.gsc:22
‪GibLegs
‪function GibLegs(entity)
Definition: gib.gsc:507
‪COMBAT_ROBOT_ADD_Z_VELOCITY_MIN
‪#define COMBAT_ROBOT_ADD_Z_VELOCITY_MIN
Definition: _combat_robot.gsc:54
‪result
‪function result(death, attacker, mod, weapon)
Definition: _zm_aat_blast_furnace.gsc:46
‪COMBAT_ROBOT_NAV_MESH_VALID_LOCATION_BOUNDARY
‪#define COMBAT_ROBOT_NAV_MESH_VALID_LOCATION_BOUNDARY
Definition: _combat_robot.gsc:67
‪sndWatchExit
‪function sndWatchExit()
Definition: _combat_robot.gsc:873
‪destroyNonAirScoreStreak_PostStatsLock
‪function destroyNonAirScoreStreak_PostStatsLock(weapon)
Definition: challenges_shared.gsc:126
‪isHacked
‪function isHacked()
Definition: util_shared.gsc:2493
‪_CalculateRobotSpawnPosition
‪function private _CalculateRobotSpawnPosition(player)
Definition: _combat_robot.gsc:104
‪GibRightArm
‪function GibRightArm(entity)
Definition: gib.gsc:467
‪GibHead
‪function GibHead(entity)
Definition: gib.gsc:443
‪BURN_SMOLDER
‪#define BURN_SMOLDER
Definition: archetype_damage_effects.gsh:6
‪SET_GIBBED
‪#define SET_GIBBED(gib_state, gib_flag)
Definition: gib.gsh:51
‪GIB_TORSO_HEAD_FLAG
‪#define GIB_TORSO_HEAD_FLAG
Definition: gib.gsh:24
‪COMBAT_ROBOT_KILLCAM_TIME_OFFSET
‪#define COMBAT_ROBOT_KILLCAM_TIME_OFFSET
Definition: _combat_robot.gsc:70
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265
‪COMBAT_ROBOT_ADD_Y_VELOCITY_MIN
‪#define COMBAT_ROBOT_ADD_Y_VELOCITY_MIN
Definition: _combat_robot.gsc:52