‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_missile_drone.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\clientfield_shared;
4 #using scripts\shared\challenges_shared;
5 #using scripts\shared\killstreaks_shared;
6 #using scripts\shared\popups_shared;
7 #using scripts\shared\scoreevents_shared;
8 #using scripts\shared\util_shared;
9 
10 #insert scripts\shared\shared.gsh;
11 #insert scripts\shared\version.gsh;
12 
13 #using scripts\mp\_challenges;
14 #using scripts\mp\_util;
15 #using scripts\mp\killstreaks\_airsupport;
16 #using scripts\mp\killstreaks\_dogs;
17 #using scripts\mp\killstreaks\_killstreakrules;
18 #using scripts\mp\killstreaks\_killstreaks;
19 #using scripts\mp\killstreaks\_missile_swarm;
20 
21 #insert scripts\mp\killstreaks\_killstreaks.gsh;
22 
23 #precache( "string", "KILLSTREAK_EARNED_MISSILE_DRONE" );
24 #precache( "string", "KILLSTREAK_MISSILE_DRONE_NOT_AVAILABLE" );
25 #precache( "string", "KILLSTREAK_MISSILE_DRONE_INBOUND" );
26 #precache( "string", "KILLSTREAK_MISSILE_DRONE_HACKED" );
27 #precache( "eventstring", "mpl_killstreak_missile_drone" );
28 
29 #using_animtree ( "mp_missile_drone" );
30 
31 #namespace missile_drone;
32 
33 function ‪init()
34 {
35  ‪clientfield::register( "toplayer", "missile_drone_active", ‪VERSION_SHIP, 2, "int" );
36  ‪clientfield::register( "missile", "missile_drone_projectile_active", ‪VERSION_SHIP, 1, "int" );
37  ‪clientfield::register( "missile", "missile_drone_projectile_animate", ‪VERSION_SHIP, 1, "int" );
38 
39  level.missile_drone_flyheight = 2400;
40  level.missile_drone_anim = %o_drone_hunter_launch;
41 
42  //killstreaks::register( "missile_drone", "missile_drone", "killstreak_missile_drone", "missile_drone_used",&missile_drone_killstreak, true );
43  //killstreaks::register_alt_weapon( "missile_drone", "missile_drone_projectile" );
44  //killstreaks::register_alt_weapon( "inventory_missile_drone", "missile_drone_projectile" );
45  //killstreaks::register_strings( "missile_drone", &"KILLSTREAK_EARNED_MISSILE_DRONE", &"KILLSTREAK_MISSILE_DRONE_NOT_AVAILABLE", &"KILLSTREAK_MISSILE_DRONE_INBOUND", undefined, &"KILLSTREAK_MISSILE_DRONE_HACKED" );
46  //killstreaks::register_dialog( "missile_drone", "mpl_killstreak_missile_drone", "kls_hkdrone_used", "", "kls_hkdrone_enemy", "", "kls_hkdrone_ready" );
47  //killstreaks::set_team_kill_penalty_scale( "missile_drone", 0.0 );
48 }
49 
50 function ‪missile_drone_killstreak( killstreakType )
51 {
52  assert( killstreakType == "missile_drone" || killstreakType == "inventory_missile_drone" );
53 
54  level.missile_drone_origin = level.mapCenter + ( 0, 0, level.missile_drone_flyheight );
55 
56  hardpointType = "missile_drone";
57 
58  ‪result = ‪useMissileDrone( hardpointType );
59 
60  if ( !isdefined(‪result) || !‪result )
61  {
62  return false;
63  }
64 
65  return ‪result;
66 }
67 
68 function ‪useMissileDrone( hardpointType )
69 {
70  if ( !self ‪killstreakrules::isKillstreakAllowed( hardpointType, self.team ) )
71  return false;
72 
73  self thread ‪missileDroneWatcher( hardpointType );
74 
75  missileWeapon = undefined;
76  currentWeapon = self GetCurrentWeapon();
77  if ( currentWeapon.name == "missile_drone" || currentWeapon.name == "inventory_missile_drone" )
78  {
79  missileWeapon = currentWeapon;
80  }
81 
82  // we should always have the missile weapon
83  assert( isdefined ( missileWeapon ) );
84  // for some reason we never had the missileDroneWeapon
85  if ( !isdefined( missileWeapon ) )
86  return false;
87 
88  notifyString = self ‪util::waittill_any_return( "weapon_change", "grenade_fire", "death" );
89 
90  if ( notifyString == "weapon_change" || notifyString == "death" )
91  return false;
92 
93  notifyString = self ‪util::waittill_any_return( "weapon_change", "death" );
94 
95  if ( notifyString == "death" )
96  return true;
97 
98  self TakeWeapon( missileWeapon );
99 
100  // if we no longer have the missile weapon in our inventory then
101  // it must have been successful
102  if ( self HasWeapon( missileWeapon ) || self GetAmmoCount( missileWeapon ) )
103  return false;
104 
105  return true;
106 }
107 
108 
109 function ‪missileDroneWatcher( hardpointType )
110 {
111  self notify("missileDroneWatcher");
112 
113  self endon( "missileDroneWatcher" );
114  self endon( "spawned_player" );
115  self endon( "disconnect" );
116  self endon( "weapon_change" );
117  self endon( "death" );
118 
119  team = self.team;
120 
121  killstreak_id = ‪killstreakrules::killstreakStart( hardpointType, team, false, false );
122  if ( killstreak_id == -1 )
123  {
125  return;
126  }
127 
128  self thread ‪checkForEmp();
129 
130  self thread ‪checkWeaponChange( hardpointType, team, killstreak_id );
131  self thread ‪watchOwnerDeath( hardpointType, team, killstreak_id );
132  self thread ‪updateTargetting();
133 
134  self waittill( "grenade_fire", grenade, weapon );
135  origin = grenade.origin;
136  self notify( "missile_drone_active" );
137  level thread ‪popups::DisplayKillstreakTeamMessageToAll( hardpointType, self );
138  self ‪killstreaks::play_killstreak_start_dialog( hardpointType, self.team, killstreak_id);
139  self AddWeaponStat( GetWeapon( "missile_drone" ), "used", 1 );
140  self ‪clientfield::set_to_player( "missile_drone_active", ‪MISSILE_DRONE_TARGET_DISABLED );
141  grenade thread ‪waitThenDelete( 0.05 );
142  grenade.origin = grenade.origin + ( 0,0, 1000 );
143 
144  self thread ‪doMissileDrone( origin, weapon, killstreak_id, hardpointType, team );
146 }
147 
148 
149 function ‪doMissileDrone( origin, weapon, killstreak_id, hardpointType, team )
150 {
151  direction = self getPlayerAngles();
152  forward = AnglesToForward( direction );
153  target = origin + VectorScale( forward, 10000 );
154 
155  ‪airsupport::debug_line( origin, target, (0.9,0.1,0.1) );
156 
157  projectile = ‪missile_swarm::projectile_spawn_utility( self, target, origin, getweapon( "missile_drone_projectile" ), "drone_missile", false );
158  projectile Missile_DroneSetVisible( true );
159 
160  projectile.originalTarget = target;
161  projectile thread ‪missile_swarm::projectile_abort_think();
162 
163  projectile thread ‪drone_target_search( hardpointType );
164  projectile thread ‪projectile_death_think();
165 
166  projectile thread ‪watchDamage();
167  projectile.targetname = "remote_drone";
168 
169  projectile PlaySound("wpn_hunter_ignite");
170 
171  projectile thread ‪killstreak_stop_think( killstreak_id, hardpointType, team );
172 
173  projectile ‪clientfield::set("missile_drone_projectile_animate", 1);
174 }
175 
176 function ‪waitThenDelete( waitTime )
177 {
178  self endon( "delete" );
179  self endon( "death" );
180 
181  wait( waitTime );
182 
183  self delete();
184 }
185 
187 {
188  self waittill( "death" );
189  self.goal delete();
190 }
191 
192 function ‪drone_target_acquired( hardpointType, target )
193 {
194  self endon( "death" );
195  self notify( "drone_target_acquired" );
196  self ‪clientfield::set( "missile_drone_projectile_active", 1 );
197 
198  self ‪set_drone_target( hardpointType, target );
199 }
200 
201 function ‪drone_target_search( hardpointType )
202 {
203  self endon( "death" );
204 
205  if ( isdefined( self.droneTarget ) )
206  {
207  self ‪drone_target_acquired( hardpointType, self.droneTarget );
208  self Missile_SetTarget( self.goal );
209  }
210 
211  self ‪clientfield::set( "missile_drone_projectile_active", 0 );
212 
213  searchDotProdMinimums = [];
214  searchDotProdMinimums[0] = 0.9; // 45
215  searchDotProdMinimums[1] = 0.7071; // 60
216  searchDotProdMinimums[2] = 0.5;
217  searchDotProdMinimums[3] = 0;
218 
219  wait( 0.1 );
220 
221  searchCounter = 0;
222  for ( ;; )
223  {
224  if ( !isdefined( self ) )
225  {
226  self notify( "death" );
227  }
228 
229  target = self ‪projectile_find_target( self.owner, searchDotProdMinimums[searchCounter] );
230  if ( searchCounter < searchDotProdMinimums.size - 1 )
231  {
232  searchCounter++;
233  }
234  else
235  {
236  // could not find good target
237  // shoot upwards
238  if ( level.missile_drone_origin[2] != self.goal.origin[2] )
239  {
240  //searchCounter = 0;
241  currentAngles = self.angles;
242  direction = VectorNormalize( AnglesToForward( self.angles ) );
243 
244 
245  direction = ‪vecscale( direction, 1024 );
246  self.goal.origin = ( self.origin[0] + direction[0], self.origin[1] + direction[1], level.missile_drone_origin[2] );
247 /#
248  ‪airsupport::debug_line( self.origin, self.goal.origin, ( 1,1,0 ), 5000 );
249 #/
250  }
251  else // move to center of map
252  {
253  //searchCounter = 0;
254  currentAngles = self.angles;
255  direction = VectorNormalize( AnglesToForward( self.angles ) );
256 
257  direction = ‪vecscale( direction, 1024 );
258  self.goal.origin = ( level.missile_drone_origin[0] + direction[0], level.missile_drone_origin[1] + direction[1], level.missile_drone_origin[2] );
259 
260 /#
261  ‪airsupport::debug_line( self.origin, self.goal.origin, ( 0,1,1 ), 5000 );
262 #/
263  }
264 
265  }
266 
267  if ( isdefined( target ) )
268  {
269  self ‪set_drone_target( hardpointType, target );
270  self Missile_SetTarget( self.goal );
271  //searchCounter = 0;
272  }
273 
274  wait( 0.25 );
275  }
276 }
277 
278 function ‪vecscale( vec, scalar )
279 {
280  return (vec[0]*scalar, vec[1]*scalar, vec[2]*scalar);
281 }
282 
283 function ‪set_drone_target( hardpointType, target )
284 {
285  self endon( "target_lost" );
286  self thread ‪check_target_lost( target );
287  self.swarm_target = target[ "entity" ];
288  target[ "entity" ].swarm = self;
289  ‪airsupport::debug_line( self.origin, target[ "entity" ].origin, ( 0,0,0 ), 5000 );
290  self Missile_SetTarget( target[ "entity" ], target[ "offset" ] );
291 
292  self PlaySound( "veh_harpy_drone_swarm_incomming" );
293  if ( !isdefined(target[ "entity" ].swarmSound) || target[ "entity" ].swarmSound == false)
294  self thread ‪missile_swarm::target_sounds(target[ "entity" ]);
295 
296  target[ "entity" ] notify( "stinger_fired_at_me", self, hardpointType, self.owner );
297  self ‪clientfield::set( "missile_drone_projectile_active", 1 );
298 
299  target[ "entity" ] ‪util::waittill_any( "death", "disconnect", "joined_team" );
300 
301  self ‪clientfield::set( "missile_drone_projectile_active", 0 );
302  self Missile_SetTarget( self.goal );
303 }
304 
305 
306 function ‪check_target_lost( target )
307 {
308  self endon( "death" );
309  target["entity"] endon( "death" );
310  target["entity"] endon( "disconnect" );
311  target["entity"] endon( "joined_team" );
312 
313  failureLimit = 3;
314  failureCount = 0;
315  for ( ;; )
316  {
317 /#
318  ‪airsupport::debug_star( target["entity"].origin, ( 0,1,0 ), 1000 );
319  ‪airsupport::debug_star(self.origin,( 0,1,0 ), 1000 );
320 #/
321  if ( BulletTracePassed( self.origin, target["entity"].origin + target[ "offset" ], false, target["entity"] ) )
322  {
323 /#
324  ‪airsupport::debug_line(self.origin, target["entity"].origin, ( 0,1,0 ), 1000 );
325 #/
326  failureCount = 0;
327  }
328  else
329  {
330  failureCount++;
331  if ( failureCount >= failureLimit )
332  {
333  self notify( "target_lost" );
334  return;
335  }
336  }
337  wait( 0.25 );
338  }
339 }
340 
341 function ‪projectile_find_target( owner, minCos )
342 {
343  ks = self ‪projectile_find_target_killstreak( owner, minCos );
344  player = self ‪projectile_find_target_player( owner, minCos );
345 
346  if ( isdefined( ks ) && !isdefined( player ) )
347  {
348  return ks;
349  }
350  else if ( !isdefined( ks ) && isdefined( player ) )
351  {
352  return player;
353  }
354  else if ( isdefined( ks ) && isdefined( player ) )
355  {
356 
357  if ( player[ "dotprod" ] < ks[ "dotprod" ] )
358  {
359  return ks;
360  }
361 
362  return player;
363  }
364 
365  return undefined;
366 }
367 
368 function ‪projectile_find_target_killstreak( owner, minCos )
369 {
370  ks = [];
371  ks[ "offset" ] = ( 0, 0, -10 );
372 
373  targets = Target_GetArray();
374  rcbombs = GetEntArray( "rcbomb", "targetname" );
376 
377  targets = ArrayCombine( targets, rcbombs, true, false );
378  targets = ArrayCombine( targets, dogs, true, false );
379 
380  if ( targets.size <= 0 )
381  {
382  return undefined;
383  }
384 
385  targets = ‪get_array_sorted_dot_prod( targets, minCos );
386 
387  foreach( target in targets )
388  {
389  if ( isdefined( target.owner ) && target.owner == owner )
390  {
391  continue;
392  }
393 
394  if ( isdefined( target.script_owner ) && target.script_owner == owner )
395  {
396  continue;
397  }
398 
399  if ( level.teambased && isdefined( target.team ) )
400  {
401  if ( target.team == self.team )
402  {
403  continue;
404  }
405  }
406 
407  if ( isdefined( target.vehicletype ) && target.vehicletype == "heli_supplydrop_mp" )
408  {
409  continue;
410  }
411 
412  // can see the origin
413  if ( BulletTracePassed( self.origin, target.origin, false, target ) )
414  {
415  ks[ "entity" ] = target;
416  if ( isdefined( target.sortedDotProd ) )
417  {
418  ks[ "dotprod" ] = target.sortedDotProd;
419  }
420  else
421  {
422  ks[ "dotprod" ] = -1;
423  }
424  return ks;
425  }
426  }
427 
428  return undefined;
429 }
430 
431 
432 #define ORIGIN_SIGHT_CHECK_RATING 4
433 #define HEAD_SIGHT_CHECK_RATING 3
434 #define NOT_IN_BUILDING_RATING 2
435 #define MAX_TARGET_RATING ( ORIGIN_SIGHT_CHECK_RATING + NOT_IN_BUILDING_RATING + HEAD_SIGHT_CHECK_RATING )
436 #define MIN_TARGET_RATING 3
437 
438 function ‪projectile_find_target_player( owner, minCos )
439 {
440  target = [];
441  players = self ‪get_array_sorted_dot_prod( GetPlayers(), minCos );
442  if ( isplayer( self ) ) // this target check can be called with the projectile in your hand
443  {
444  startOffset = self GetPlayerViewHeight();
445  startOrigin = ( self.origin[0], self.origin[1], self.origin[2] + startOffset );
446  startAngles = self GetPlayerAngles();
447 /#
448  ‪airsupport::debug_star( startOrigin, ( 0,0,1 ), 1000 );
449 #/
450  }
451  else
452  {
453  startOrigin = self.origin;
454  startAngles = self.angles;
455  }
456 
457 
458  bestPlayerRating = -1;
459 
460  foreach( player in players )
461  {
462  if ( !‪missile_swarm::player_valid_target( player, owner.team, owner ) )
463  {
464  continue;
465  }
466 
467  currentPlayerOffset = undefined;
468  currentPlayerDotProd = undefined;
469  currentPlayerRating = 0;
470 /#
471  ‪airsupport::debug_star( player.origin, ( 1,1,1 ), 1000 );
472 #/
473  // can see the player's origin
474  if ( BulletTracePassed( startOrigin, player.origin, false, player ) )
475  {
476 /#
477  ‪airsupport::debug_line( startOrigin, player.origin, ( 1,1,1 ), 1000 );
478 #/
479  if ( !isdefined ( currentPlayerOffset ) )
480  {
481  currentPlayerOffset = ( 0, 0, 0 );
482  }
483  currentPlayerRating += ‪ORIGIN_SIGHT_CHECK_RATING;
484  }
485 
486 
487  verticalOffset = player GetPlayerViewHeight();
488  playerHeadOffset = ( 0, 0, verticalOffset );
489 /#
490  ‪airsupport::debug_star( player.origin + playerHeadOffset, ( 1,0,0 ), 1000 );
491 #/
492  // can see the player's head
493  if ( BulletTracePassed(startOrigin, player.origin + playerHeadOffset, false, player ) )
494  {
495 /#
496  ‪airsupport::debug_line( startOrigin, player.origin + playerHeadOffset, ( 1,0,0 ), 1000 );
497 #/
498 
499  if ( !isdefined ( currentPlayerOffset ) )
500  {
501  currentPlayerOffset = playerHeadOffset;
502  }
503 
504  currentPlayerRating += ‪HEAD_SIGHT_CHECK_RATING;
505  }
506 
507  // player in building
508  ‪end = player.origin + playerHeadOffset + ( 0, 0, 96 );
509 /#
510  ‪airsupport::debug_star( ‪end, ( 1,1,0 ), 1000 );
511 #/
512  if ( BulletTracePassed(player.origin + playerHeadOffset, ‪end, false, player ) )
513  {
514 /#
515  ‪airsupport::debug_line(player.origin + playerHeadOffset, ‪end, ( 1,1,0 ), 1000 );
516 #/
517  if ( !isdefined ( currentPlayerOffset ) )
518  {
519  currentPlayerOffset = ( 0, 0, 30 );
520  }
521  currentPlayerRating += ‪NOT_IN_BUILDING_RATING;
522  }
523 
524  if ( currentPlayerRating > bestPlayerRating )
525  {
526  bestPlayerRating = currentPlayerRating;
527  target[ "entity" ] = player;
528  target[ "offset" ] = currentPlayerOffset;
529  if ( isdefined( player.sortedDotProd ) )
530  {
531  target[ "dotprod" ] = player.sortedDotProd;
532  }
533  else
534  {
535  target[ "dotprod" ] = -1;
536  }
537  if ( bestPlayerRating >= ‪MAX_TARGET_RATING )
538  return target;
539  }
540  }
541 
542  if ( bestPlayerRating >= ‪MIN_TARGET_RATING )
543  {
544  return target;
545  }
546  return undefined;
547 }
548 
549 
550 
551 
552 function ‪killstreak_stop_think( killstreak_id, hardpointType, team )
553 {
554  self waittill( "death" );
555 
556  ‪killstreakrules::killstreakStop( hardpointType, team, killstreak_id );
557 }
558 
559 function ‪checkWeaponChange( hardpointType, team, killstreak_id )
560 {
561  self endon( "spawned_player" );
562  self endon( "death" );
563  self endon( "disconnect" );
564  self endon( "grenade_fire" );
565 
566  self waittill( "weapon_change" );
567 
568  self ‪clientfield::set_to_player( "missile_drone_active", ‪MISSILE_DRONE_TARGET_DISABLED );
569  ‪killstreakrules::killstreakStop( hardpointType, team, killstreak_id );
570 }
571 
572 function ‪watchOwnerDeath( hardpointType, team, killstreak_id )
573 {
574  self endon( "spawned_player" );
575  self endon( "disconnect" );
576  self endon( "weapon_change" );
577  self endon( "missile_drone_active" );
578 
579  self waittill( "death" );
580 
581  ‪killstreakrules::killstreakStop( hardpointType, team, killstreak_id );
582 }
583 
584 function ‪checkForEmp()
585 {
586  self endon( "spawned_player" );
587  self endon( "disconnect" );
588  self endon( "weapon_change" );
589  self endon( "death" );
590  self endon( "grenade_fire" );
591 
592  self waittill( "emp_jammed" );
593  self ‪clientfield::set_to_player( "missile_drone_active", ‪MISSILE_DRONE_TARGET_DISABLED );
595 }
596 
597 
598 function ‪watchDamage()
599 {
600  self endon( "death" );
601  self SetCanDamage( true );
602  self.maxhealth = 100000;
603  self.health = self.maxhealth;
604 
605  for( ;; )
606  {
607  self waittill( "damage", ‪damage, attacker, direction, point, type, tagName, modelName, partname, weapon );
608 
609  if( !isdefined( attacker ) || !isplayer( attacker ) )
610  continue;
611 
612  if( isPlayer( attacker ) && level.teambased && isdefined( attacker.team ) && self.team == attacker.team && level.friendlyfire == 0 )
613  continue;
614 
615  if ( self.owner ‪util::IsEnemyPlayer( attacker ) )
616  {
617  attacker ‪challenges::addFlySwatterStat( weapon, self );
618  }
619  else
620  {
621  //Destroyed Friendly Killstreak
622  }
623 
624  self ‪detonate();
625  }
626 }
627 
629 {
630  if ( isplayer( self ) )
631  {
632  org = self.origin;
633  angles = self GetPlayerAngles();
634  assert( isdefined ( angles ) );
635  }
636  else
637  {
638  org = self.origin;
639  assert( isdefined ( self.angles ) );
640  angles = self.angles;
641  }
642 
643  forwardVec = vectornormalize( AnglesToForward( angles ) );
644 
645  // return the array, reordered from closest to farthest
646  dotProd = [];
647  index = [];
648 
649  for( i = 0;i < ‪array.size;i ++ )
650  {
651  assert( isdefined( forwardVec ) );
652  assert( isdefined( ‪array[ i ] ) );
653  assert( isdefined( ‪array[ i ].origin ) );
654  assert( isdefined( org ) );
655 
656  cosA = vectorDot( forwardVec, vectornormalize( ‪array[ i ].origin - org ) );
657 
658  assert( isdefined( cosA ) );
659 
660  if ( isdefined( minCos ) && cosA < minCos )
661  {
662  continue;
663  }
664 
665  ‪array[ i ].sortedDotProd = cosA;
666  dotProd[ dotProd.size ] = cosA;
667 
668  index[ index.size ] = i;
669  }
670 
671  for( ;; )
672  {
673  ‪change = false;
674  for( i = 0;i < dotProd.size - 1;i ++ )
675  {
676  if( dotProd[ i ] >= dotProd[ i + 1 ] )
677  continue;
678  ‪change = true;
679  temp = dotProd[ i ];
680  dotProd[ i ] = dotProd[ i + 1 ];
681  dotProd[ i + 1 ] = temp;
682  temp = index[ i ];
683  index[ i ] = index[ i + 1 ];
684  index[ i + 1 ] = temp;
685  }
686  if( !‪change )
687  break;
688  }
689 
690  newArray = [];
691 
692  for( i = 0;i < dotProd.size;i ++ )
693  {
694  newArray[ i ] = ‪array[ index[ i ] ];
695  }
696  return newArray;
697 }
698 
700 {
701  self endon( "spawned_player" );
702  self endon( "disconnect" );
703  self endon( "weapon_change" );
704  self endon( "death" );
705  self endon( "grenade_fire" );
706 
707  minCos = GetDvarFloat( "scr_missile_drone_min_cos", 0.9 );
708  updateWait = GetDvarFloat( "scr_missile_drone_update_wait", 0.5 );
709 
710  for( ;; )
711  {
712  self.droneTarget = self ‪projectile_find_target( self, minCos );
713  if ( isdefined( self.droneTarget ) )
714  {
715 
716  self thread ‪clearInvalidDroneTarget();
717  self ‪clientfield::set_to_player("missile_drone_active", ‪MISSILE_DRONE_TARGET_ACTIVE );
718  }
719  else
720  {
721  self ‪clientfield::set_to_player( "missile_drone_active", ‪MISSILE_DRONE_TARGET_ENABLED );
722  }
723 
724 
725  wait( updateWait );
726  }
727 }
728 
729 
731 {
732  self endon( "death" );
733  self notify( "clearInvalidDroneTarget" );
734  self endon( "clearInvalidDroneTarget" );
735  self endon( "drone_target_acquired" );
736 
737  self.droneTarget[ "entity" ] ‪util::waittill_any( "death", "disconnect", "joined_team" );
738 
739  self.droneTarget = undefined;
740 }
‪projectile_find_target_player
‪function projectile_find_target_player(owner, minCos)
Definition: _missile_drone.gsc:438
‪target_sounds
‪function target_sounds(targetent)
Definition: _missile_swarm.gsc:479
‪projectile_spawn_utility
‪function projectile_spawn_utility(owner, target, origin, weapon, targetname, moveGoal)
Definition: _missile_swarm.gsc:560
‪projectile_find_target_killstreak
‪function projectile_find_target_killstreak(owner, minCos)
Definition: _missile_drone.gsc:368
‪MISSILE_DRONE_TARGET_ACTIVE
‪#define MISSILE_DRONE_TARGET_ACTIVE
Definition: _killstreaks.gsh:4
‪set_to_player
‪function set_to_player(str_field_name, n_value)
Definition: clientfield_shared.gsc:58
‪waitThenDelete
‪function waitThenDelete(waitTime)
Definition: _missile_drone.gsc:176
‪clearInvalidDroneTarget
‪function clearInvalidDroneTarget()
Definition: _missile_drone.gsc:730
‪detonate
‪function detonate(attacker)
Definition: vehicle_ai_shared.gsc:1650
‪killstreak_stop_think
‪function killstreak_stop_think(killstreak_id, hardpointType, team)
Definition: _missile_drone.gsc:552
‪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
‪missile_drone_killstreak
‪function missile_drone_killstreak(killstreakType)
Definition: _missile_drone.gsc:50
‪ORIGIN_SIGHT_CHECK_RATING
‪#define ORIGIN_SIGHT_CHECK_RATING
Definition: _missile_drone.gsc:432
‪addFlySwatterStat
‪function addFlySwatterStat(weapon, aircraft)
Definition: challenges_shared.gsc:86
‪check_target_lost
‪function check_target_lost(target)
Definition: _missile_drone.gsc:306
‪DisplayKillstreakTeamMessageToAll
‪function DisplayKillstreakTeamMessageToAll(killstreak, player)
Definition: popups_shared.gsc:91
‪MISSILE_DRONE_TARGET_DISABLED
‪#define MISSILE_DRONE_TARGET_DISABLED
Definition: _killstreaks.gsh:6
‪IsEnemyPlayer
‪function IsEnemyPlayer(player)
Definition: util_shared.csc:1220
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪HEAD_SIGHT_CHECK_RATING
‪#define HEAD_SIGHT_CHECK_RATING
Definition: _missile_drone.gsc:433
‪MAX_TARGET_RATING
‪#define MAX_TARGET_RATING
Definition: _missile_drone.gsc:435
‪switch_to_last_non_killstreak_weapon
‪function switch_to_last_non_killstreak_weapon(immediate, awayfromBall)
Definition: killstreaks_shared.gsc:36
‪checkWeaponChange
‪function checkWeaponChange(hardpointType, team, killstreak_id)
Definition: _missile_drone.gsc:559
‪dog_manager_get_dogs
‪function dog_manager_get_dogs()
Definition: _dogs.gsc:625
‪projectile_death_think
‪function projectile_death_think()
Definition: _missile_drone.gsc:186
‪isKillstreakAllowed
‪function isKillstreakAllowed(hardpointType, team)
Definition: _killstreakrules.gsc:352
‪doMissileDrone
‪function doMissileDrone(origin, weapon, killstreak_id, hardpointType, team)
Definition: _missile_drone.gsc:149
‪end
‪function end(final)
Definition: _killcam.gsc:511
‪checkForEmp
‪function checkForEmp()
Definition: _missile_drone.gsc:584
‪waittill_any
‪function waittill_any(str_notify1, str_notify2, str_notify3, str_notify4, str_notify5)
Definition: util_shared.csc:375
‪player_valid_target
‪function player_valid_target(player, team, owner)
Definition: _missile_swarm.gsc:785
‪get_array_sorted_dot_prod
‪function get_array_sorted_dot_prod(array, minCos)
Definition: _missile_drone.gsc:628
‪drone_target_acquired
‪function drone_target_acquired(hardpointType, target)
Definition: _missile_drone.gsc:192
‪NOT_IN_BUILDING_RATING
‪#define NOT_IN_BUILDING_RATING
Definition: _missile_drone.gsc:434
‪watchOwnerDeath
‪function watchOwnerDeath(hardpointType, team, killstreak_id)
Definition: _missile_drone.gsc:572
‪array
‪function filter array
Definition: array_shared.csc:16
‪set_drone_target
‪function set_drone_target(hardpointType, target)
Definition: _missile_drone.gsc:283
‪killstreakStop
‪function killstreakStop(hardpointType, team, id)
Definition: _killstreakrules.gsc:293
‪debug_star
‪function debug_star(origin, color, time)
Definition: _airsupport.gsc:1113
‪projectile_find_target
‪function projectile_find_target(owner, minCos)
Definition: _missile_drone.gsc:341
‪updateTargetting
‪function updateTargetting()
Definition: _missile_drone.gsc:699
‪killstreakStart
‪function killstreakStart(hardpointType, team, hacked, displayTeamMessage)
Definition: _killstreakrules.gsc:184
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪drone_target_search
‪function drone_target_search(hardpointType)
Definition: _missile_drone.gsc:201
‪init
‪function init()
Definition: _missile_drone.gsc:33
‪MIN_TARGET_RATING
‪#define MIN_TARGET_RATING
Definition: _missile_drone.gsc:436
‪watchDamage
‪function watchDamage()
Definition: _missile_drone.gsc:598
‪change
‪function change(team)
Definition: _teams.gsc:258
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪debug_line
‪function debug_line(from, to, color, time, depthTest)
Definition: _airsupport.gsc:1089
‪result
‪function result(death, attacker, mod, weapon)
Definition: _zm_aat_blast_furnace.gsc:46
‪missileDroneWatcher
‪function missileDroneWatcher(hardpointType)
Definition: _missile_drone.gsc:109
‪MISSILE_DRONE_TARGET_ENABLED
‪#define MISSILE_DRONE_TARGET_ENABLED
Definition: _killstreaks.gsh:5
‪vecscale
‪function vecscale(vec, scalar)
Definition: _missile_drone.gsc:278
‪projectile_abort_think
‪function projectile_abort_think()
Definition: _missile_swarm.gsc:588
‪useMissileDrone
‪function useMissileDrone(hardpointType)
Definition: _missile_drone.gsc:68