‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_dart.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\challenges_shared;
5 #using scripts\shared\clientfield_shared;
6 #using scripts\shared\hostmigration_shared;
7 #using scripts\shared\killstreaks_shared;
8 #using scripts\shared\popups_shared;
9 #using scripts\shared\util_shared;
10 #using scripts\shared\vehicle_shared;
11 #using scripts\shared\vehicle_death_shared;
12 #using scripts\shared\weapons\_hacker_tool;
13 #using scripts\shared\scoreevents_shared;
14 #using scripts\shared\math_shared;
15 #using scripts\shared\weapons\_heatseekingmissile;
16 #using scripts\mp\killstreaks\_qrdrone;
17 #using scripts\mp\killstreaks\_airsupport;
18 #using scripts\shared\vehicle_ai_shared;
19 
20 #using scripts\mp\_util;
21 #using scripts\mp\gametypes\_shellshock;
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\_remote_weapons;
28 
29 #insert scripts\mp\_hacker_tool.gsh;
30 #insert scripts\mp\killstreaks\_killstreaks.gsh;
31 #insert scripts\shared\clientfields.gsh;
32 #insert scripts\shared\shared.gsh;
33 #insert scripts\shared\version.gsh;
34 #using scripts\shared\visionset_mgr_shared;
35 
36 #namespace dart;
37 #define DART_NAME "dart"
38 #define DART_KILLSTREAK_NAME "killstreak_dart"
39 #define DART_STAT_NAME "dart_used"
40 
41 #precache( "string", "KILLSTREAK_DART_HACKED" );
42 #precache( "string", "KILLSTREAK_DART_EARNED" );
43 #precache( "string", "KILLSTREAK_DART_NOT_AVAILABLE" );
44 #precache( "string", "KILLSTREAK_DART_INBOUND" );
45 #precache( "string", "KILLSTREAK_DART_HACKED" );
46 #precache( "string", "KILLSTREAK_DESTROYED_DART" );
47 #precache( "string", "mpl_killstreak_dart_strt" );
48 
49 function ‪init()
50 {
52  ‪killstreaks::register_strings( ‪DART_NAME, &"KILLSTREAK_DART_EARNED", &"KILLSTREAK_DART_NOT_AVAILABLE", &"KILLSTREAK_DART_INBOUND", undefined, &"KILLSTREAK_DART_HACKED" );
53  ‪killstreaks::register_dialog( ‪DART_NAME, "mpl_killstreak_dart_strt", "dartDialogBundle", "dartPilotDialogBundle", "friendlyDart", "enemyDart", "enemyDartMultiple", "friendlyDartHacked", "enemyDartHacked", "requestDart", "threatDart" );
55 
56  ‪killstreaks::register_alt_weapon( ‪DART_NAME, "killstreak_remote" );
59 
60  ‪clientfield::register( "toplayer", "dart_update_ammo", ‪VERSION_SHIP, 2, "int" );
61  ‪clientfield::register( "toplayer", "fog_bank_3", ‪VERSION_SHIP, 1, "int" );
62 
64 
66 }
67 
68 function ‪wait_dart_timed_out( time )
69 {
70  self endon( "disconnect" );
71  self endon( "death" );
72  self endon( "dart_throw_failed" );
73  self endon( "dart_entered" );
74 
75  wait( time );
76 
77  self notify( "dart_throw_timed_out" );
78 }
79 
81 {
82  thread ‪dart::wait_dart_timed_out( 5 );
83 
84  notifyString = self ‪util::waittill_any_return( "death", "disconnect", "dart_entered", "dart_throw_timed_out","dart_throw_failed" );
85 
86  if ( notifyString == "dart_entered" || notifyString == "death" )
87  return true;
88 
89  return false;
90 }
91 
92 function ‪ActivateDart( killstreakType )
93 {
94  player = self;
95 
96  assert( IsPlayer( player ) );
97 
98  if( !player ‪killstreakrules::isKillstreakAllowed( ‪DART_NAME, player.team ) )
99  return false;
100 
101  player DisableOffhandWeapons();
102 
103  missileWeapon = player GetCurrentWeapon();
104  if( !( isdefined( missileWeapon ) && ( ( missileWeapon.name == "dart" ) || ( missileWeapon.name == "inventory_dart" ) ) ) )
105  return false;
106 
107  player thread ‪WatchThrow( missileWeapon );
108 
109  notifyString = player ‪util::waittill_any_return( "weapon_change", "grenade_fire", "death", "disconnect", "joined_team", "emp_jammed", "emp_grenaded" );
110 
111  if( notifyString == "death" || notifyString == "emp_jammed" || notifyString == "emp_grenaded" )
112  {
113  if( player.waitingOnDartThrow )
114  player notify( "dart_putaway" );
115 
116  player EnableOffhandWeapons();
117  return false;
118  }
119 
120  if( notifyString == "grenade_fire" )
121  {
122  // wait for the killStreakStart results
123  return player ‪wait_for_throw_status();
124  }
125 
126  if( notifyString == "weapon_change" )
127  {
128  if( player.waitingOnDartThrow )
129  player notify( "dart_putaway" );
130 
131  player EnableOffhandWeapons();
132  return false;
133  }
134 
135  return true;
136 }
137 
139 {
140  self thread ‪waitThenDelete( 0.05 );
141  self.origin = self.origin + ( 0, 0, 1000 );
142 }
143 
144 function ‪WatchThrow( missileWeapon )
145 {
146  assert( IsPlayer( self ) );
147  player = self;
148  playerEntNum = player.entNum;
149 
150  player endon( "disconnect" );
151  player endon( "joined_team" );
152  // player endon( "death" ); // once the dart is thrown, even after death, the player should control it
153  player endon( "dart_putaway" );
154 
155  level endon( "game_ended" );
156 
157  player.waitingOnDartThrow = 1;
158  player waittill( "grenade_fire", grenade, weapon );
159  player.waitingOnDartThrow = 0;
160 
161  if( weapon != missileWeapon )
162  {
163  self notify("dart_throw_failed");
164  return;
165  }
166 
167  ‪trace = player ‪check_launch_space(grenade.origin);
168 
169  if ( ‪trace["fraction"] < 1.0 )
170  {
171  self iprintlnbold( &"KILLSTREAK_DART_NOT_AVAILABLE" );
172  grenade ‪cleanup_grenade();
173  self notify("dart_throw_failed");
174  return;
175  }
176 
177  killstreak_id = player ‪killstreakrules::killstreakStart( ‪DART_NAME, player.team, undefined, false );
178  if( killstreak_id == ‪INVALID_KILLSTREAK_ID )
179  {
180  grenade ‪cleanup_grenade();
181  self notify("dart_throw_failed");
182  return;
183  }
184 
185  player.dart_thrown_time = GetTime();
186 
187  player TakeWeapon( missileWeapon );
188 
189  player ‪killstreaks::set_killstreak_delay_killcam( ‪DART_NAME ); // special case: death while watching does not prevent riding dart, and thus no killcam
190  player.resurrect_not_allowed_by = ‪DART_NAME;
191 
192  player AddWeaponStat( GetWeapon( "dart" ), "used", 1 );
194 
195  dart = player ‪SpawnDart( grenade, killstreak_id, ‪trace["position"] );
196  if( isdefined( dart ) )
197  {
198  player ‪killstreaks::play_killstreak_start_dialog( ‪DART_NAME, player.team, killstreak_id );
199  }
200 }
201 
202 function ‪HackedPreFunction( hacker )
203 {
204  dart = self;
205  dart.owner ‪util::freeze_player_controls( false );
206  ‪visionset_mgr::deactivate( "visionset", ‪DART_VISIONSET_ALIAS, dart.owner );
207  dart.owner ‪clientfield::set_to_player( "fog_bank_3", 0 );
208  dart.owner unlink();
209  dart ‪clientfield::set( "vehicletransition", 0 );
211  dart.owner ‪killstreaks::unhide_compass();
215 }
216 
217 function ‪HackedPostFunction( hacker )
218 {
219  dart = self;
220  hacker ‪StartDartRemoteControl( dart );
221 
223  hacker ‪remote_weapons::UseRemoteWeapon( dart, ‪DART_NAME, false );
225 }
226 
228 {
229  dart = self;
230  if ( dart.health > dart.hackedhealth )
231  {
232  dart.health = dart.hackedhealth;
233  }
234 }
235 
236 function ‪check_launch_space(origin)
237 {
238  player_angles = self getPlayerAngles();
239  forward = AnglesToForward( player_angles );
240  spawn_origin = origin + VectorScale( forward, 50 );
241 
242  radius = 10;
243  return physicstrace( origin, spawn_origin, ( -radius, -radius, 0 ), ( radius, radius, 2 * radius ), self, ‪PHYSICS_TRACE_MASK_PHYSICS );
244 }
245 
246 function ‪SpawnDart( grenade, killstreak_id, spawn_origin )
247 {
248  player = self;
249  assert( IsPlayer( player ) );
250  playerEntNum = player.entNum;
251  player_angles = player getPlayerAngles();
252 
253  grenade ‪cleanup_grenade();
254 
255  params = level.killstreakBundle[‪DART_NAME];
256 
257  ‪DEFAULT( params.ksDartVehicle, "veh_dart_mp" );
258  ‪DEFAULT( params.ksDartInitialSpeed, 35 );
259  ‪DEFAULT( params.ksDartAcceleration, 35 );
260 
261  dart = SpawnVehicle( params.ksDartVehicle, spawn_origin, player_angles, "dynamic_spawn_ai" );
262 
263  dart.is_shutting_down = 0;
264  dart.team = player.team;
265  dart SetSpeedImmediate( params.ksDartInitialSpeed, params.ksDartAcceleration );
267  dart.health = dart.maxhealth;
269  dart.hackedHealthUpdateCallback = &‪dart_hacked_health_update;
270 
271  dart ‪killstreaks::configure_team( ‪DART_NAME, killstreak_id, player, "small_vehicle" );
273 
274  dart ‪clientfield::set( "enemyvehicle", ‪ENEMY_VEHICLE_ACTIVE );
275  dart.killstreak_id = killstreak_id;
276  dart.hardpointType = ‪DART_NAME;
277  dart thread ‪killstreaks::WaitForTimeout( ‪DART_NAME, ‪DART_DURATION, &‪stop_remote_weapon, "remote_weapon_end", "death" );
278  dart hacker_tool::registerWithhackerTool( ‪DART_HACKER_TOOL_RADIUS, ‪DART_HACKER_TOOL_DURATION );
279  dart.overrideVehicleDamage = &‪dartDamageOverride;
280  dart.DetonateViaEMP = &‪emp_damage_cb;
281  dart.do_scripted_crash = false;
282  dart.delete_on_death = true;
283  dart.one_remote_use = true;
284  dart.vehcheckforpredictedcrash = true;
285  dart.predictedCollisionTime = 0.2;
286  dart.glasscollision_alt = true;
287  dart.damageTaken = 0;
288  dart.death_enter_cb = &‪waitRemoteControl;
289 
290  Target_Set( dart );
291 
293  dart ‪vehicle::add_to_target_group( dart );
294 
295  dart thread ‪WatchCollision();
296 
297  dart thread ‪WatchDeath();
298 
299  dart thread ‪WatchOwnerNonDeathEvents();
300 
301  dart.forceWaitRemoteControl = true;
302 
303  player ‪util::waittill_any( "weapon_change", "death" ); // wait for the killstreak weapon to go away, or the player dies (special case for Dart)
304 
305  player ‪remote_weapons::UseRemoteWeapon( dart, ‪DART_NAME, true, true, true );
306 
307  player notify( "dart_entered" );
308 
309  return dart;
310 }
311 
313 {
314  dart = self;
315 
316  remote_controlled = ‪IS_TRUE( dart.control_initiated ) || ‪IS_TRUE( dart.controlled );
317 
318  if( remote_controlled )
319  {
320  notifyString = dart ‪util::waittill_any_return( "remote_weapon_end", "dart_left" );
321  if ( isdefined( notifyString ) )
322  {
323  if( notifyString == "remote_weapon_end" )
324  dart waittill( "dart_left" );
325  else
326  dart waittill( "remote_weapon_end" );
327  }
328  }
329  else
330  dart waittill( "dart_left" );
331 }
332 
334 {
335  player = self;
336  assert( IsPlayer( player ) );
337 
338  if( !dart.is_shutting_down )
339  {
340  player.dart_thrown_time = undefined;
341 
342  dart UseVehicle( player, 0 );
343  player.resurrect_not_allowed_by = undefined;
344  dart ‪clientfield::set( "vehicletransition", 1 );
345  dart thread ‪WatchAmmo();
346  dart thread ‪vehicle::monitor_missiles_locked_on_to_me( player );
347  dart thread ‪vehicle::monitor_damage_as_occupant( player );
348 
350  player.no_fade2black = true;
351 
352  dart.inHeliProximity = false;
353 
354  minHeightOverride = undefined;
355  minz_struct = ‪struct::get( "vehicle_oob_minz", "targetname");
356  if( isdefined( minz_struct ) )
357  minHeightOverride = minz_struct.origin[2];
358 
359  dart thread ‪qrdrone::QRDrone_watch_distance( ‪DART_MAX_HEIGHT_OFFSET, minHeightOverride );
360  dart.distance_shutdown_override = &‪DartDistanceFailure;
361 
363  ‪visionset_mgr::activate( "visionset", ‪DART_VISIONSET_ALIAS, self, 1, 90000, 1 );
364  player ‪clientfield::set_to_player( "fog_bank_3", 1 );
365  }
366 }
367 
368 function ‪EndDartRemoteControl( dart, exitRequestedByOwner )
369 {
370  dart thread ‪leave_dart();
371 }
372 
374 {
375  thread ‪stop_remote_weapon();
376 }
377 
378 function ‪stop_remote_weapon( attacker, weapon )
379 {
380  dart = self;
381 
382  dart.DetonateViaEMP = undefined;
383 
384  attacker = self [[ level.figure_out_attacker ]]( attacker );
385  if ( isdefined( attacker ) && ( !isdefined( dart.owner ) || dart.owner ‪util::IsEnemyPlayer( attacker ) ) )
386  {
387  ‪challenges::destroyedAircraft( attacker, weapon, true );
388  attacker ‪challenges::addFlySwatterStat( weapon, self );
389  ‪scoreevents::processScoreEvent( "destroyed_dart", attacker, dart.owner, weapon );
390  LUINotifyEvent( &"player_callout", 2, &"KILLSTREAK_DESTROYED_DART", attacker.entnum );
391  }
392 
393  if( isdefined( attacker ) && attacker != dart.owner )
394  {
396  }
397 
398  dart thread ‪remote_weapons::EndRemoteControlWeaponUse( false );
399 }
400 
401 function ‪dartDamageOverride( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal )
402 {
403  dart = self;
404 
405  if( ( sMeansOfDeath == "MOD_TRIGGER_HURT" ) || ‪IS_TRUE( dart.is_shutting_down ) )
406  return 0;
407 
408  player = dart.owner;
409 
410  iDamage = ‪killstreaks::OnDamagePerWeapon( ‪DART_NAME, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, self.maxhealth, &‪stop_remote_weapon, self.maxhealth*0.4, undefined,
411  0, &‪emp_damage_cb, true, 1.0 );
412 
413  return iDamage;
414 }
415 
416 function ‪emp_damage_cb( attacker, weapon )
417 {
418  dart = self;
419  dart ‪stop_remote_weapon( attacker, weapon );
420 }
421 
423 {
424  self endon( "death" );
425 
426  while( 1 )
427  {
428  self waittill( "veh_predictedcollision", velocity, normal, ent, stype );
429  self notify( "veh_collision", velocity, normal, ent, stype );
430 
431  if( stype == "glass" )
432  continue;
433  else
434  break;
435  }
436 }
437 
439 {
440  dart = self;
441  dart endon( "death" );
442  dart.owner endon( "disconnect" );
443 
444  dart thread ‪DarPredictedCollision();
445 
446 
447  while( 1 )
448  {
449  dart waittill( "veh_collision", velocity, normal, ent, stype );
450 
451  if( stype === "glass" )
452  continue;
453 
454  dart SetSpeedImmediate( 0 );
456 
457  dart thread ‪stop_remote_weapon();
458  break;
459  }
460 }
461 
462 function ‪WatchDeath()
463 {
464  dart = self;
465  player = dart.owner;
466 
467  player endon( "dart_entered" ); // the remote weapon script should handle it from here on
468  dart endon( "delete" );
469 
470  dart waittill( "death" );
471  //dart waittill( "death", attacker, damageFromUnderneath, weapon, point, dir, modType );
472 
473  dart thread ‪leave_dart();
474 }
475 
476 function ‪WatchOwnerNonDeathEvents( endCondition1, endCondition2 )
477 {
478  dart = self;
479  player = dart.owner;
480 
481  player endon( "dart_entered" ); // the remote weapon script should handle it from here on
482  dart endon( "death" );
483 
484  dart thread ‪WatchForGameEnd();
485 
486  player ‪util::waittill_any( "joined_team", "disconnect", "joined_spectators", "emp_jammed" );
487 
488  dart thread ‪leave_dart();
489 }
490 
492 {
493  dart = self;
494  dart endon( "death" );
495 
496  level waittill( "game_ended" );
497 
498  dart thread ‪leave_dart();
499 }
500 
501 function ‪WatchAmmo()
502 {
503  dart = self;
504  dart endon( "death" );
505 
506  player = dart.owner;
507 
508  player endon( "disconnect" );
509 
510  shotCount = 0;
511 
512  params = level.killstreakBundle[‪DART_NAME];
513 
514  ‪DEFAULT( params.ksDartShotCount, 3 );
515  ‪DEFAULT( params.ksDartBladeCount, 6 );
516  ‪DEFAULT( params.ksDartWaitTimeAfterLastShot, 1 );
517 
518  ‪DEFAULT( params.ksBladeStartDistance, 0 );
519  ‪DEFAULT( params.ksBladeEndDistance, 10000 );
520  ‪DEFAULT( params.ksBladeStartSpreadRadius, 50 );
521  ‪DEFAULT( params.ksBladeEndSpreadRadius, 1 );
522 
523  player ‪clientfield::set_to_player( "dart_update_ammo", params.ksDartShotCount );
524 
525  while( true )
526  {
527  dart waittill( "weapon_fired" );
528  shotCount++;
529 
530  player ‪clientfield::set_to_player( "dart_update_ammo", params.ksDartShotCount - shotCount );
531 
532  if( shotCount >= params.ksDartShotCount )
533  {
534  dart DisableDriverFiring( true );
535  wait( params.ksDartWaitTimeAfterLastShot );
536  dart ‪stop_remote_weapon();
537  }
538  }
539 }
540 
541 function ‪leave_dart()
542 {
543  dart = self;
544  owner = dart.owner;
545 
546  if( isdefined( owner ) )
547  {
549  owner ‪clientfield::set_to_player( "fog_bank_3", 0 );
550  owner ‪qrdrone::destroyHud();
551  }
552 
553  if( isdefined( dart ) && ( dart.is_shutting_down == 1 ) )
554  return;
555 
556  dart.is_shutting_down = 1;
557 
558  dart ‪clientfield::set( "timeout_beep", 0 );
559  dart ‪vehicle::lights_off();
561  dart Hide();
562 
563  dart_original_team = dart.originalteam;
564  dart_killstreak_id = dart.killstreak_id;
565 
566  if( Target_IsTarget( dart ) )
567  Target_Remove( dart );
568 
569  iF( isalive( dart ) )
570  dart notify( "death" );
571 
572  params = level.killstreakBundle[‪DART_NAME];
573 
574  ‪DEFAULT( params.ksDartExplosionOuterRadius, 200 );
575  ‪DEFAULT( params.ksDartExplosionInnerRadius, 1 );
576  ‪DEFAULT( params.ksDartExplosionOuterDamage, 25 );
577  ‪DEFAULT( params.ksDartExplosionInnerDamage, 350 );
578  ‪DEFAULT( params.ksDartExplosionMagnitude, 1 );
579 
580  PhysicsExplosionSphere( dart.origin,
581  params.ksDartExplosionOuterRadius,
582  params.ksDartExplosionInnerRadius,
583  params.ksDartExplosionMagnitude,
584  params.ksDartExplosionOuterDamage,
585  params.ksDartExplosionInnerDamage );
586 
587  if( isdefined( owner ) )
588  {
589  owner ‪killstreaks::set_killstreak_delay_killcam( ‪DART_NAME ); // hold the respawn till we finish here
590 
591  dart RadiusDamage( dart.origin,
592  params.ksDartExplosionOuterRadius,
593  params.ksDartExplosionInnerDamage,
594  params.ksDartExplosionOuterDamage,
595  owner,
596  "MOD_EXPLOSIVE",
597  GetWeapon( "dart" ) );
598 
599  owner thread ‪play_bda_dialog( self.pilotIndex );
600 
601  if( ‪IS_TRUE( dart.controlled ) || ‪IS_TRUE( dart.control_initiated ) )
602  {
603  owner SetClientUIVisibilityFlag( "hud_visible", 0 );
604  owner unlink();
605  dart ‪clientfield::set( "vehicletransition", 0 );
606 
607  if( isdefined( params.ksExplosionRumble ) )
608  owner PlayRumbleOnEntity( params.ksExplosionRumble );
609 
612 
614 
615  owner ‪util::freeze_player_controls( true );
616 
617  forward = AnglesToForward( dart.angles );
618  ‪DEFAULT( params.ksDartCameraWatchDistance, 350 );
619  moveAmount = VectorScale( forward, -( params.ksDartCameraWatchDistance ) );
620 
621  size = 4;
622  ‪trace = physicstrace( dart.origin, dart.origin + moveAmount, ( -size, -size, -size ), ( size, size, size ), undefined, ‪PHYSICS_TRACE_MASK_PHYSICS );
623 
624  cam = ‪spawn( "script_model", ‪trace["position"] );
625  cam SetModel( "tag_origin" );
626  cam LinkTo( dart );
627  dart SetSpeedImmediate( 0 );
628 
629  owner CameraSetPosition( cam.origin );
630  owner CameraSetLookAt( dart.origin );
631  owner CameraActivate( true );
632 
633  ‪DEFAULT( params.ksDartCameraWatchDuration, 2 );
634  wait( params.ksDartCameraWatchDuration );
635 
636  if ( isdefined( owner ) )
637  {
638  owner CameraActivate( false );
639  }
640 
641  cam delete();
642 
643  if( isdefined( owner ) )
644  {
645  if( !level.gameEnded )
646  owner ‪util::freeze_player_controls( false );
647 
648  owner SetClientUIVisibilityFlag( "hud_visible", 1 );
649  }
650  }
651 
652  if ( isdefined( owner ) )
653  {
655  }
656  }
657 
658  ‪killstreakrules::killstreakStop( ‪DART_NAME, dart_original_team, dart_killstreak_id );
659 
660  if ( isdefined( dart ) )
661  {
662  dart notify( "dart_left" );
663  }
664 }
665 
666 function ‪DeleteOnConditions( condition )
667 {
668  dart = self;
669  dart endon( "delete" );
670 
671  if( isdefined( condition ) )
672  dart waittill( condition );
673 
674  dart notify( "delete" );
675  dart delete();
676 }
677 
678 function ‪waitThenDelete( waitTime )
679 {
680  self endon( "delete" );
681  self endon( "death" );
682  wait( waitTime );
683  self delete();
684 }
685 
686 function ‪play_bda_dialog( pilotIndex )
687 {
688  self endon( "game_ended" );
689 
690  wait( 0.5 );
691 
692  if ( !isdefined( self.dartBda ) || self.dartBda == 0 )
693  {
694  bdaDialog = "killNone";
695  }
696  else if ( self.dartBda == 1 )
697  {
698  bdaDialog = "kill1";
699  }
700  else if ( self.dartBda == 2 )
701  {
702  bdaDialog = "kill2";
703  }
704  else if ( self.dartBda == 3 )
705  {
706  bdaDialog = "kill3";
707  }
708  else if ( self.dartBda > 3 )
709  {
710  bdaDialog = "killMultiple";
711  }
712 
713  self ‪killstreaks::play_pilot_dialog( bdaDialog, ‪DART_NAME, undefined, pilotIndex );
714 
715  self.dartBda = undefined;
716 }
717 
718 function ‪EnableDartMissileLocking() // self == dart
719 {
720  dart = self;
721  player = dart.owner;
722  weapon = dart SeatGetWeapon( 0 );
723 
724  player.get_stinger_target_override = &‪GetDartMissileTargets;
725  player.is_still_valid_target_for_stinger_override = &‪IsStillValidDartMissileTarget;
726  player.is_valid_target_for_stinger_override = &‪IsValidDartMissileTarget;
727  player.dart_killstreak_weapon = weapon;
728 
729  player thread ‪heatseekingmissile::StingerIRTLoop( weapon );
730 }
731 
732 function ‪DisableDartMissileLocking() // self == dart
733 {
734  player = self.owner;
735 
736  player.get_stinger_target_override = undefined;
737  player.is_still_valid_target_for_stinger_override = undefined;
738  player.is_valid_target_for_stinger_override = undefined;
739  player.dart_killstreak_weapon = undefined;
740 
741  player notify( "stinger_IRT_off" );
743 }
744 
746 {
747  targets = ArrayCombine( target_getArray(), level.MissileEntities, false, false );
748  targets = ArrayCombine( targets, level.players, false, false );
749 
750  return targets;
751 }
752 
753 function ‪IsValidDartMissileTarget( ent ) // self == player
754 {
755  player = self;
756 
757  if ( !isdefined( ent ) )
758  return false;
759 
760  entIsPlayer = IsPlayer( ent );
761 
762  if ( entIsPlayer && !IsAlive( ent ) )
763  return false;
764 
765  if ( ent.ignoreme === true )
766  return false;
767 
768  dart = player GetVehicleOccupied();
769  if ( !isdefined( dart ) )
770  return false;
771 
772  if ( DistanceSquared( dart.origin, ent.origin ) > ‪SQR( player.dart_killstreak_weapon.lockOnMaxRange ) )
773  return false;
774 
775  if ( entIsPlayer && ent HasPerk( "specialty_nokillstreakreticle" ) )
776  return false;
777 
778  return true;
779 }
780 
781 function ‪IsStillValidDartMissileTarget( ent, weapon ) // self == player
782 {
783  player = self;
784 
785  if ( !( target_isTarget( ent ) || IsPlayer( ent ) ) && !( isdefined( ent.allowContinuedLockonAfterInvis ) && ent.allowContinuedLockonAfterInvis ) )
786  return false;
787 
788  dart = player GetVehicleOccupied();
789  if ( !isdefined( dart ) )
790  return false;
791 
792  entIsPlayer = IsPlayer( ent );
793 
794  if ( entIsPlayer && !IsAlive( ent ) )
795  return false;
796 
797  if ( ent.ignoreme === true )
798  return false;
799 
800  if ( DistanceSquared( dart.origin, ent.origin ) > ‪SQR( player.dart_killstreak_weapon.lockOnMaxRange ) )
801  return false;
802 
803  if ( entIsPlayer && ent HasPerk( "specialty_nokillstreakreticle" ) )
804  return false;
805 
807  return false;
808 
809  return true;
810 }
‪monitor_missiles_locked_on_to_me
‪function monitor_missiles_locked_on_to_me(player, wait_time=0.1)
Definition: vehicle_shared.gsc:3617
‪processScoreEvent
‪function processScoreEvent(event, player, victim, weapon)
Definition: scoreevents_shared.gsc:19
‪WatchOwnerNonDeathEvents
‪function WatchOwnerNonDeathEvents(endCondition1, endCondition2)
Definition: _dart.gsc:476
‪UseRemoteWeapon
‪function UseRemoteWeapon(weapon, weaponName, immediate, allowManualDeactivation=true, always_allow_ride=false)
Definition: _remote_weapons.gsc:74
‪activate
‪function activate()
Definition: traps_shared.gsc:655
‪lights_off
‪function lights_off(localClientNum)
Definition: vehicle_shared.csc:652
‪DartDistanceFailure
‪function DartDistanceFailure()
Definition: _dart.gsc:373
‪DART_HACKER_TOOL_RADIUS
‪#define DART_HACKER_TOOL_RADIUS
Definition: _killstreaks.gsh:277
‪WaitForTimeout
‪function WaitForTimeout(killstreak, duration, callback, endCondition1, endCondition2, endCondition3)
Definition: _killstreaks.gsc:2913
‪WatchDeath
‪function WatchDeath()
Definition: _dart.gsc:462
‪dart_hacked_health_update
‪function dart_hacked_health_update(hacker)
Definition: _dart.gsc:227
‪set_to_player
‪function set_to_player(str_field_name, n_value)
Definition: clientfield_shared.gsc:58
‪DART_MAX_HEIGHT_OFFSET
‪#define DART_MAX_HEIGHT_OFFSET
Definition: _killstreaks.gsh:275
‪ramp_in_out_thread_per_player_death_shutdown
‪function ramp_in_out_thread_per_player_death_shutdown(player, ramp_in, full_period, ramp_out)
Definition: visionset_mgr_shared.gsc:385
‪stop_monitor_missiles_locked_on_to_me
‪function stop_monitor_missiles_locked_on_to_me()
Definition: vehicle_shared.gsc:3640
‪emp_damage_cb
‪function emp_damage_cb(attacker, weapon)
Definition: _dart.gsc:416
‪DART_HIDE_COMPASS_ON_REMOTE_CONTROL
‪#define DART_HIDE_COMPASS_ON_REMOTE_CONTROL
Definition: _killstreaks.gsh:328
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪waittill_any_return
‪function waittill_any_return(string1, string2, string3, string4, string5, string6, string7)
Definition: util_shared.csc:212
‪play_killstreak_start_dialog
‪function play_killstreak_start_dialog(killstreakType, team, killstreakId)
Definition: _killstreaks.gsc:1905
‪EndDartRemoteControl
‪function EndDartRemoteControl(dart, exitRequestedByOwner)
Definition: _dart.gsc:368
‪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
‪trace
‪function trace(from, to, target)
Definition: grapple.gsc:369
‪addFlySwatterStat
‪function addFlySwatterStat(weapon, aircraft)
Definition: challenges_shared.gsc:86
‪ENEMY_VEHICLE_ACTIVE
‪#define ENEMY_VEHICLE_ACTIVE
Definition: _hacker_tool.gsh:2
‪GetDartMissileTargets
‪function GetDartMissileTargets()
Definition: _dart.gsc:745
‪play_bda_dialog
‪function play_bda_dialog(pilotIndex)
Definition: _dart.gsc:686
‪cleanup_grenade
‪function cleanup_grenade()
Definition: _dart.gsc:138
‪freeze_player_controls
‪function freeze_player_controls(b_frozen=true)
Definition: util_shared.gsc:2474
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪destroyHud
‪function destroyHud()
Definition: _qrdrone.gsc:1608
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪DART_HACKER_TOOL_DURATION
‪#define DART_HACKER_TOOL_DURATION
Definition: _killstreaks.gsh:278
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪wait_for_throw_status
‪function wait_for_throw_status()
Definition: _dart.gsc:80
‪DisableDartMissileLocking
‪function DisableDartMissileLocking()
Definition: _dart.gsc:732
‪SQR
‪#define SQR(__var)
Definition: shared.gsh:293
‪IsStillValidDartMissileTarget
‪function IsStillValidDartMissileTarget(ent, weapon)
Definition: _dart.gsc:781
‪reset_killstreak_delay_killcam
‪function reset_killstreak_delay_killcam()
Definition: _killstreaks.gsc:2451
‪RegisterRemoteWeapon
‪function RegisterRemoteWeapon(weaponName, hintString, useCallback, endUseCallback, hideCompassOnUse=true)
Definition: _remote_weapons.gsc:63
‪DisplayKillstreakTeamMessageToAll
‪function DisplayKillstreakTeamMessageToAll(killstreak, player)
Definition: popups_shared.gsc:91
‪DART_DURATION
‪#define DART_DURATION
Definition: _killstreaks.gsh:269
‪play_pilot_dialog
‪function play_pilot_dialog(dialogKey, killstreakType, killstreakId, pilotIndex)
Definition: _killstreaks.gsc:2024
‪IsEnemyPlayer
‪function IsEnemyPlayer(player)
Definition: util_shared.csc:1220
‪QRDrone_watch_distance
‪function QRDrone_watch_distance()
Definition: _qrdrone.csc:400
‪WatchAmmo
‪function WatchAmmo()
Definition: _dart.gsc:501
‪set_killstreak_delay_killcam
‪function set_killstreak_delay_killcam(killstreak_name)
Definition: _killstreaks.gsc:2446
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪WatchCollision
‪function WatchCollision()
Definition: _dart.gsc:438
‪check_launch_space
‪function check_launch_space(origin)
Definition: _dart.gsc:236
‪destroyedAircraft
‪function destroyedAircraft(attacker, weapon, playerControlled)
Definition: challenges_shared.gsc:1405
‪HackedPreFunction
‪function HackedPreFunction(hacker)
Definition: _dart.gsc:202
‪StartDartRemoteControl
‪function StartDartRemoteControl(dart)
Definition: _dart.gsc:333
‪monitor_damage_as_occupant
‪function monitor_damage_as_occupant(player)
Definition: vehicle_shared.gsc:3722
‪play_destroyed_dialog_on_owner
‪function play_destroyed_dialog_on_owner(killstreakType, killstreakId)
Definition: _killstreaks.gsc:1982
‪isKillstreakAllowed
‪function isKillstreakAllowed(hardpointType, team)
Definition: _killstreakrules.gsc:352
‪wait_dart_timed_out
‪function wait_dart_timed_out(time)
Definition: _dart.gsc:68
‪init
‪function init()
Definition: _dart.gsc:49
‪DarPredictedCollision
‪function DarPredictedCollision()
Definition: _dart.gsc:422
‪WatchForGameEnd
‪function WatchForGameEnd()
Definition: _dart.gsc:491
‪death_fx
‪function death_fx()
Definition: _qrdrone.gsc:958
‪WatchThrow
‪function WatchThrow(missileWeapon)
Definition: _dart.gsc:144
‪waittill_any
‪function waittill_any(str_notify1, str_notify2, str_notify3, str_notify4, str_notify5)
Definition: util_shared.csc:375
‪deactivate
‪function deactivate()
Definition: traps_shared.gsc:649
‪waitThenDelete
‪function waitThenDelete(waitTime)
Definition: _dart.gsc:678
‪ActivateDart
‪function ActivateDart(killstreakType)
Definition: _dart.gsc:92
‪ClearIRTarget
‪function ClearIRTarget()
Definition: _heatseekingmissile.gsc:47
‪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
‪INVALID_KILLSTREAK_ID
‪#define INVALID_KILLSTREAK_ID
Definition: _killstreaks.gsh:2
‪PHYSICS_TRACE_MASK_PHYSICS
‪#define PHYSICS_TRACE_MASK_PHYSICS
Definition: shared.gsh:130
‪unhide_compass
‪function unhide_compass()
Definition: _killstreaks.gsc:2461
‪DART_NAME
‪#define DART_NAME
Definition: _dart.gsc:37
‪set_vehicle_drivable_time_starting_now
‪function set_vehicle_drivable_time_starting_now(killstreak, duration_ms=(-1))
Definition: _killstreak_hacking.gsc:140
‪SpawnDart
‪function SpawnDart(grenade, killstreak_id, spawn_origin)
Definition: _dart.gsc:246
‪add_to_target_group
‪function add_to_target_group(target_ent)
Definition: vehicle_shared.gsc:3603
‪waitRemoteControl
‪function waitRemoteControl()
Definition: _dart.gsc:312
‪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
‪get_hacked_health
‪function get_hacked_health(killstreakType)
Definition: _killstreak_bundles.gsc:202
‪register_info
‪function register_info(type, name, version, lerp_step_count)
Definition: visionset_mgr_shared.csc:334
‪leave_dart
‪function leave_dart()
Definition: _dart.gsc:541
‪killstreakStart
‪function killstreakStart(hardpointType, team, hacked, displayTeamMessage)
Definition: _killstreakrules.gsc:184
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪override_entity_camera_in_demo
‪function override_entity_camera_in_demo(killstreakType, value, isInventory)
Definition: _killstreaks.gsc:411
‪configure_team
‪function configure_team(killstreakType, killstreakId, owner, influencerType, configureTeamPreFunction, configureTeamPostFunction, isHacked=false)
Definition: _killstreaks.gsc:2806
‪DART_KILLSTREAK_NAME
‪#define DART_KILLSTREAK_NAME
Definition: _dart.gsc:38
‪EndRemoteControlWeaponUse
‪function EndRemoteControlWeaponUse(exitRequestedByOwner)
Definition: _remote_weapons.gsc:369
‪DeleteOnConditions
‪function DeleteOnConditions(condition)
Definition: _dart.gsc:666
‪register_alt_weapon
‪function register_alt_weapon(killstreakType, weaponName, isInventory)
Definition: _killstreaks.gsc:318
‪clear_using_remote
‪function clear_using_remote(immediate, skipNotify)
Definition: _killstreaks.gsc:2403
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪IsValidDartMissileTarget
‪function IsValidDartMissileTarget(ent)
Definition: _dart.gsc:753
‪init_target_group
‪function init_target_group()
Definition: vehicle_shared.gsc:3598
‪enable_hacking
‪function enable_hacking(killstreakName, preHackFunction, postHackFunction)
Definition: _killstreak_hacking.gsc:22
‪InsideStingerReticleLocked
‪function InsideStingerReticleLocked(target, weapon)
Definition: _heatseekingmissile.gsc:544
‪EnableDartMissileLocking
‪function EnableDartMissileLocking()
Definition: _dart.gsc:718
‪stop_monitor_damage_as_occupant
‪function stop_monitor_damage_as_occupant()
Definition: vehicle_shared.gsc:3717
‪StingerIRTLoop
‪function StingerIRTLoop(weapon)
Definition: _heatseekingmissile.gsc:188
‪DART_VISIONSET_ALIAS
‪#define DART_VISIONSET_ALIAS
Definition: _killstreaks.gsh:337
‪dartDamageOverride
‪function dartDamageOverride(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal)
Definition: _dart.gsc:401
‪stop_remote_weapon
‪function stop_remote_weapon(attacker, weapon)
Definition: _dart.gsc:378
‪HackedPostFunction
‪function HackedPostFunction(hacker)
Definition: _dart.gsc:217
‪DART_STAT_NAME
‪#define DART_STAT_NAME
Definition: _dart.gsc:39