‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_missile_swarm.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\challenges_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\math_shared;
6 #using scripts\shared\scoreevents_shared;
7 #using scripts\shared\util_shared;
8 
9 #using scripts\mp\_challenges;
10 #using scripts\mp\_util;
11 #using scripts\mp\killstreaks\_airsupport;
12 #using scripts\mp\killstreaks\_dogs;
13 #using scripts\mp\killstreaks\_killstreakrules;
14 #using scripts\mp\killstreaks\_killstreaks;
15 #using scripts\mp\killstreaks\_missile_swarm;
16 
17 #insert scripts\mp\_hacker_tool.gsh;
18 #insert scripts\shared\shared.gsh;
19 #insert scripts\shared\version.gsh;
20 
21 #precache( "string", "KILLSTREAK_EARNED_MISSILE_SWARM" );
22 #precache( "string", "KILLSTREAK_MISSILE_SWARM_NOT_AVAILABLE" );
23 #precache( "string", "KILLSTREAK_MISSILE_SWARM_INBOUND" );
24 #precache( "string", "KILLSTREAK_MISSILE_SWARM_HACKED" );
25 #precache( "eventstring", "mpl_killstreak_missile_swarm" );
26 #precache( "fx", "killstreaks/fx_hrpy_swrm_os_circle" );
27 #precache( "fx", "killstreaks/fx_hrpy_swrm_exhaust_trail_close" );
28 
29 #namespace missile_swarm;
30 
31 function ‪init()
32 {
33  level.missile_swarm_max = 6;
34  level.missile_swarm_flyheight = 3000;
35  level.missile_swarm_flydist = 5000;
36 
37  ‪util::set_dvar_float_if_unset( "scr_missile_swarm_lifetime", 40.0 );
38 
39  level.swarm_fx[ "swarm" ] = "killstreaks/fx_hrpy_swrm_os_circle";
40  level.swarm_fx["swarm_tail"] = "killstreaks/fx_hrpy_swrm_exhaust_trail_close";
41  level.missileDroneSoundStart = "mpl_hk_scan";
42 
43  //killstreaks::register( "missile_swarm", "missile_swarm", "killstreak_missile_swarm", "missile_swarm_used",&swarm_killstreak, true );
44  //killstreaks::register_alt_weapon( "missile_swarm", "missile_swarm_projectile" );
45  //killstreaks::register_strings( "missile_swarm", &"KILLSTREAK_EARNED_MISSILE_SWARM", &"KILLSTREAK_MISSILE_SWARM_NOT_AVAILABLE", &"KILLSTREAK_MISSILE_SWARM_INBOUND", undefined, &"KILLSTREAK_MISSILE_SWARM_HACKED" );
46  //killstreaks::register_dialog( "missile_swarm", "mpl_killstreak_missile_swarm", "kls_swarm_used", "", "kls_swarm_enemy", "", "kls_swarm_ready" );
47  //killstreaks::set_team_kill_penalty_scale( "missile_swarm", 0.0 );
48 
49  ‪clientfield::register( "world", "missile_swarm", ‪VERSION_SHIP, 2, "int" );
50 
51 /#
52  ‪util::set_dvar_int_if_unset( "scr_missile_swarm_cam", 0 );
53 #/
54 }
55 
56 function ‪swarm_killstreak( hardpointType )
57 {
58  assert( hardpointType == "missile_swarm" );
59 
60  level.missile_swarm_origin = level.mapCenter + ( 0, 0, level.missile_swarm_flyheight );
61 
62  if ( level.script == "mp_drone" )
63  {
64  level.missile_swarm_origin = level.missile_swarm_origin + ( -5000, 0, 2000 );
65  }
66  if ( level.script == "mp_la" )
67  {
68  level.missile_swarm_origin = level.missile_swarm_origin + ( 0, 0, 2000 );
69  }
70  if ( level.script == "mp_turbine" )
71  {
72  level.missile_swarm_origin = level.missile_swarm_origin + ( 0, 0, 1500 );
73  }
74  if ( level.script == "mp_downhill" )
75  {
76  level.missile_swarm_origin = level.missile_swarm_origin + ( 4000, 0, 1000 );
77  }
78  if ( level.script == "mp_hydro" )
79  {
80  level.missile_swarm_origin = level.missile_swarm_origin + ( 0, 0, 5000 );
81  }
82  if ( level.script == "mp_magma" )
83  {
84  level.missile_swarm_origin = level.missile_swarm_origin + ( 0, -6000, 3000 );
85  }
86  if ( level.script == "mp_uplink" )
87  {
88  level.missile_swarm_origin = level.missile_swarm_origin + ( -6000, 0, 2000 );
89  }
90  if ( level.script == "mp_bridge" )
91  {
92  level.missile_swarm_origin = level.missile_swarm_origin + ( 0, 0, 2000 );
93  }
94  if ( level.script == "mp_paintball" )
95  {
96  level.missile_swarm_origin = level.missile_swarm_origin + ( 0, 0, 1000 );
97  }
98 
99  killstreak_id = self ‪killstreakrules::killstreakStart( "missile_swarm", self.team, false, true );
100  if ( killstreak_id == -1 )
101  {
102  return false;
103  }
104 
105  level thread ‪swarm_killstreak_start( self, killstreak_id );
106 
107  return true;
108 }
109 
110 function ‪swarm_killstreak_start( owner, killstreak_id )
111 {
112  level endon( "swarm_end" );
113 
114  missiles = GetEntArray( "swarm_missile", "targetname" );
115 
116  foreach( missile in missiles )
117  {
118  if ( isdefined( missile ) )
119  {
120  missile Detonate();
121  wait( 0.10 );
122  }
123  }
124 
125  if ( isdefined( level.missile_swarm_fx ) )
126  {
127  for ( i = 0; i < level.missile_swarm_fx.size; i++ )
128  {
129  if ( isdefined ( level.missile_swarm_fx[i] ) )
130  {
131  level.missile_swarm_fx[i] delete();
132  }
133  }
134  }
135 
136  level.missile_swarm_fx = undefined;
137  level.missile_swarm_team = owner.team;
138  level.missile_swarm_owner = owner;
139  owner ‪killstreaks::play_killstreak_start_dialog( "missile_swarm", owner.pers["team"], killstreak_id );
140  level ‪create_player_targeting_array( owner, owner.team );
141  owner AddWeaponStat( GetWeapon( "missile_swarm" ), "used", 1 );
142 
143  level thread ‪swarm_killstreak_abort( owner, killstreak_id );
144  level thread ‪swarm_killstreak_watch_for_emp( owner, killstreak_id );
145  level thread ‪swarm_killstreak_fx();
146  wait ( 2 );
147  level thread ‪swarm_think( owner, killstreak_id );
148 }
149 
150 function ‪swarm_killstreak_end( owner, ‪detonate, killstreak_id )
151 {
152  level notify( "swarm_end" );
153  if ( isdefined(‪detonate) && ‪detonate )
154  {
155  level ‪clientfield::set( "missile_swarm", 2 );
156  }
157  else
158  {
159  level ‪clientfield::set( "missile_swarm", 0 );
160  }
161 
162  missiles = GetEntArray( "swarm_missile", "targetname" );
163 
164  if ( ‪IS_TRUE( ‪detonate ) )
165  {
166  for ( i=0; i<level.missile_swarm_fx.size; i++ )
167  {
168  if ( isdefined ( level.missile_swarm_fx[i] ) )
169  {
170  level.missile_swarm_fx[i] delete();
171  }
172  }
173  foreach( missile in missiles )
174  {
175  if ( isdefined( missile ) )
176  {
177  missile Detonate();
178  wait( 0.10 );
179  }
180  }
181  }
182  else
183  {
184  foreach( missile in missiles )
185  {
186  if ( isdefined( missile ) )
187  {
188  yaw = RandomIntRange( 0, 360 );
189  angles = ( 0, yaw, 0 );
190 
191  forward = AnglesToForward( angles );
192 
193  if ( isdefined( missile.goal ) )
194  missile.goal.origin = missile.origin + forward * level.missile_swarm_flydist;
195  }
196  }
197  }
198 
199  wait( 1 );
200  level.missile_swarm_sound StopLoopSound( 2 );
201 
202  wait( 2 );
203  level.missile_swarm_sound delete();
204 
205  recordStreakIndex = level.killstreakindices[level.killstreaks["missile_swarm"].menuname];
206  if ( isdefined( recordStreakIndex ) && isdefined( owner ) )
207  {
208  // owner RecordKillstreakEndEvent( recordStreakIndex );
209  }
210  ‪killstreakrules::killstreakStop( "missile_swarm", level.missile_swarm_team, killstreak_id );
211  level.missile_swarm_owner = undefined;
212 
213  wait ( 4 );
214 
215  missiles = GetEntArray( "swarm_missile", "targetname" );
216 
217  foreach( missile in missiles )
218  {
219  if ( isdefined( missile ) )
220  {
221  missile Delete();
222  wait( 0.10 );
223  }
224  }
225 
226  wait ( 6 );
227 
228  for ( i=0; i<level.missile_swarm_fx.size; i++ )
229  {
230  if( isdefined( level.missile_swarm_fx[i] ) )
231  {
232  level.missile_swarm_fx[i] delete();
233  }
234  }
235 }
236 
237 function ‪swarm_killstreak_abort( owner, killstreak_id )
238 {
239  level endon( "swarm_end" );
240 
241  owner ‪util::waittill_any( "disconnect", "joined_team", "joined_spectators", "emp_jammed" );
242  level thread ‪swarm_killstreak_end( owner, true, killstreak_id );
243 }
244 
245 function ‪swarm_killstreak_watch_for_emp( owner, killstreak_id )
246 {
247  level endon( "swarm_end" );
248 
249  owner waittill( "emp_destroyed_missile_swarm", attacker );
250 
251  attacker ‪challenges::addFlySwatterStat( GetWeapon( "emp" ) );
252 
253  level thread ‪swarm_killstreak_end( owner, true, killstreak_id );
254 }
255 
257 {
258  level endon( "swarm_end" );
259 
260  // fx
261  level.missile_swarm_fx = [];
262 
263  yaw = RandomInt( 360 );
264  level.missile_swarm_fx[0] = ‪spawn( "script_model", level.missile_swarm_origin );
265  level.missile_swarm_fx[0] SetModel( "tag_origin" );
266  level.missile_swarm_fx[0].angles = ( -90, yaw, 0 );
267 
268  level.missile_swarm_fx[1] = ‪spawn( "script_model", level.missile_swarm_origin );
269  level.missile_swarm_fx[1] SetModel( "tag_origin" );
270  level.missile_swarm_fx[1].angles = ( -90, yaw, 0 );
271 
272  level.missile_swarm_fx[2] = ‪spawn( "script_model", level.missile_swarm_origin );
273  level.missile_swarm_fx[2] SetModel( "tag_origin" );
274  level.missile_swarm_fx[2].angles = ( -90, yaw, 0 );
275 
276  level.missile_swarm_fx[3] = ‪spawn( "script_model", level.missile_swarm_origin );
277  level.missile_swarm_fx[3] SetModel( "tag_origin" );
278  level.missile_swarm_fx[3].angles = ( -90, yaw, 0 );
279 
280  level.missile_swarm_fx[4] = ‪spawn( "script_model", level.missile_swarm_origin );
281  level.missile_swarm_fx[4] SetModel( "tag_origin" );
282  level.missile_swarm_fx[4].angles = ( -90, yaw, 0 );
283 
284  level.missile_swarm_fx[5] = ‪spawn( "script_model", level.missile_swarm_origin );
285  level.missile_swarm_fx[5] SetModel( "tag_origin" );
286  level.missile_swarm_fx[5].angles = ( -90, yaw, 0 );
287 
288  level.missile_swarm_fx[6] = ‪spawn( "script_model", level.missile_swarm_origin );
289  level.missile_swarm_fx[6] SetModel( "tag_origin" );
290  level.missile_swarm_fx[6].angles = ( -90, yaw, 0 );
291 
292  level.missile_swarm_sound = ‪spawn( "script_model", level.missile_swarm_origin );
293  level.missile_swarm_sound SetModel( "tag_origin" );
294  level.missile_swarm_sound.angles = ( 0, 0, 0 );
295 
296  wait( 0.1 );
297 
298  PlayFXOnTag( level.swarm_fx[ "swarm" ], level.missile_swarm_fx[0], "tag_origin" );
299 
300  wait( 2 );
301 
302  level.missile_swarm_sound PlayLoopSound( "veh_harpy_drone_swarm_lp", 3 );
303  level ‪clientfield::set( "missile_swarm", 1 );
304 
305  current = 1;
306  while ( 1 )
307  {
308  if( !isdefined( level.missile_swarm_fx[current] ) )
309  {
310  level.missile_swarm_fx[current] = ‪spawn( "script_model", level.missile_swarm_origin );
311  level.missile_swarm_fx[current] SetModel( "tag_origin" );
312  }
313  yaw = RandomInt( 360 );
314 
315  if ( isdefined( level.missile_swarm_fx[current] ) )
316  {
317  level.missile_swarm_fx[current].angles = ( -90, yaw, 0 );
318  }
319 
320  wait ( 0.1 );
321 
322  if ( isdefined( level.missile_swarm_fx[current] ) )
323  {
324  PlayFXOnTag( level.swarm_fx[ "swarm" ], level.missile_swarm_fx[current], "tag_origin" );
325  }
326 
327  current = (current+1) % 7;
328  wait( 1.9 );
329  }
330 }
331 
332 function ‪swarm_think( owner, killstreak_id )
333 {
334  level endon( "swarm_end" );
335 
336  lifetime = GetDvarFloat( "scr_missile_swarm_lifetime" );
337  end_time = GetTime() + ( lifetime * 1000 );
338  level.missile_swarm_count = 0;
339 
340  while ( GetTime() < end_time )
341  {
342  assert( level.missile_swarm_count >= 0 );
343 
344  if ( level.missile_swarm_count >= level.missile_swarm_max )
345  {
346  wait( 0.5 );
347  continue;
348  }
349 
350  count = 1;//RandomIntRange( 1, level.missile_swarm_max );
351  level.missile_swarm_count += count;
352 
353  for ( i = 0; i < count; i++ )
354  {
355  self thread ‪projectile_spawn( owner );
356  }
357 
358  wait( ( level.missile_swarm_count / level.missile_swarm_max ) + 0.4 );
359  }
360 
361  level thread ‪swarm_killstreak_end( owner, undefined, killstreak_id );
362 }
363 
364 /#
365 function ‪projectile_cam( player )
366 {
367  player.swarm_cam = true;
369 
370  forward = AnglesToForward( self.angles );
371  cam = ‪spawn( "script_model", self.origin + ( 0, 0, 300 ) + forward * -200 );
372  cam SetModel( "tag_origin" );
373  cam LinkTo( self );
374 
375  player CameraSetPosition( cam );
376  player CameraSetLookAt( self );
377  player CameraActivate( true );
378 
379  self waittill( "death" );
380  wait( 1 );
381 
382  player CameraActivate( false );
383  cam delete();
384  player.swarm_cam = false;
385 }
386 #/
387 
389 {
390  self endon( "death" );
391 
392  for ( ;; )
393  {
394  wait( 0.25 );
395 
396  if ( DistanceSquared( self.origin, self.goal.origin ) < 256 * 256 )
397  {
398  if ( DistanceSquared( self.origin, level.missile_swarm_origin ) > level.missile_swarm_flydist * level.missile_swarm_flydist )
399  {
400  self.goal.origin = level.missile_swarm_origin;
401  continue;
402  }
403 
404  enemy = ‪projectile_find_random_player( self.owner, self.team );
405 
406  if ( isdefined( enemy ) )
407  {
408  self.goal.origin = enemy.origin + ( 0, 0, self.origin[2] );
409  }
410  else
411  {
412  pitch = RandomIntRange( -45, 45 );
413  yaw = RandomIntRange( 0, 360 );
414  angles = ( 0, yaw, 0 );
415 
416  forward = AnglesToForward( angles );
417 
418  self.goal.origin = self.origin + forward * level.missile_swarm_flydist;
419  }
420  nfz = ‪airsupport::crossesNoFlyZone(self.origin, self.goal.origin );
421  tries = 20;
422  while ( isdefined(nfz) && tries > 0 )
423  {
424  tries--;
425  pitch = RandomIntRange( -45, 45 );
426  yaw = RandomIntRange( 0, 360 );
427  angles = ( 0, yaw, 0 );
428 
429  forward = AnglesToForward( angles );
430 
431  self.goal.origin = self.origin + forward * level.missile_swarm_flydist;
432  nfz = ‪airsupport::crossesNoFlyZone(self.origin, self.goal.origin );
433  }
434  }
435  }
436 }
437 
438 function ‪projectile_target_search( acceptSkyExposure, acquireTime, allowPlayerOffset )
439 {
440  self endon( "death" );
441 
442  wait( acquireTime );
443 
444  for ( ;; )
445  {
446  wait( RandomFloatRange( 0.5, 1.0 ) );
447  //wait( RandomFloatRange( acquireTime/2, acquireTime ) );
448 
449  target = self ‪projectile_find_target( acceptSkyExposure );
450 
451  if ( isdefined( target ) )
452  {
453  self.swarm_target = target[ "entity" ];
454  target[ "entity" ].swarm = self;
455  if ( allowPlayerOffset )
456  {
457  self Missile_SetTarget( target[ "entity" ], target[ "offset" ] );
458  self Missile_DroneSetVisible( true );
459  }
460  else
461  {
462  self Missile_SetTarget( target[ "entity" ] );
463  self Missile_DroneSetVisible( true );
464  }
465 
466  self PlaySound( "veh_harpy_drone_swarm_incomming" );
467  if ( !isdefined(target[ "entity" ].swarmSound) || target[ "entity" ].swarmSound == false)
468  self thread ‪target_sounds(target[ "entity" ]);
469 
470  target[ "entity" ] ‪util::waittill_any( "death", "disconnect", "joined_team" );
471  self Missile_SetTarget( self.goal );
472  self Missile_DroneSetVisible( false );
473 
474  continue;
475  }
476  }
477 }
478 
479 function ‪target_sounds( targetent )
480 {
481  targetent endon("death");
482  targetent endon("disconnect");
483  targetent endon("joined_team");
484  self endon( "death" );
485 
486  //wait until we are close to start the beeping
487  dist = 3000;
488  if ( isdefined( self.warningSoundDist ) )
489  dist = self.warningSoundDist;
490  while( DistanceSquared( self.origin, targetent.origin ) > dist * dist )
491  {
493  }
494  if (isdefined(targetent.swarmSound) && targetent.swarmSound == true)
495  return;
496 
497  targetent.swarmSound = true;
498  self thread ‪reset_sound_blocker( targetent );
499  self thread ‪target_stop_sounds( targetent );
500 
501  if ( isPlayer( targetent ) )
502  {
503  targetent PlayLocalSound( level.missileDroneSoundStart );
504  }
505  self PlaySound( level.missileDroneSoundStart );
506 
507 }
508 
509 function ‪target_stop_sounds( targetent )
510 {
511  targetent ‪util::waittill_any( "disconnect", "death", "joined_team" );
512 
513  if ( isdefined( targetent ) && isPlayer( targetent ) )
514  {
515  targetent StopLocalSound( level.missileDroneSoundStart );
516  }
517 }
518 
519 function ‪reset_sound_blocker( target )
520 {
521  wait( 2 );
522  if (isdefined(target))
523  target.swarmSound = false;
524 }
525 
526 function ‪projectile_spawn( owner )
527 {
528  level endon( "swarm_end" );
529 
530  upVector = ( 0, 0, RandomIntRange( level.missile_swarm_flyheight - 1500, level.missile_swarm_flyheight - 1000 ) );
531 
532  yaw = RandomIntRange( 0, 360 );
533  angles = ( 0, yaw, 0 );
534  forward = AnglesToForward( angles );
535 
536  origin = level.mapCenter + upVector + forward * level.missile_swarm_flydist * -1;
537  target = level.mapCenter + upVector + forward * level.missile_swarm_flydist;
538 
539  enemy = ‪projectile_find_random_player( owner, owner.team );
540 
541  if ( isdefined( enemy ) )
542  {
543  target = enemy.origin + upVector;
544  }
545  projectile = ‪projectile_spawn_utility( owner, target, origin, getweapon( "missile_swarm_projectile" ), "swarm_missile", true );
546  projectile thread ‪projectile_abort_think();
547  projectile thread ‪projectile_target_search( ‪math::cointoss(), 1.0, true );
548  projectile thread ‪projectile_death_think();
549  projectile thread ‪projectile_goal_move();
550 
551  wait( 0.1 );
552 
553  if ( isdefined( projectile ) )
554  {
555  projectile ‪clientfield::set("missile_drone_projectile_animate", 1);
556  }
557 }
558 
559 
560 function ‪projectile_spawn_utility( owner, target, origin, weapon, targetname, moveGoal )
561 {
562  goal = ‪spawn( "script_model", target );
563  goal SetModel( "tag_origin" );
564 
565  p = MagicBullet( weapon, origin, target, owner, goal );
566 
567  p.owner = owner;
568  p.team = owner.team;
569  p.goal = goal;
570  p.targetname = "swarm_missile";
571  p ‪clientfield::set( "enemyvehicle", ‪ENEMY_VEHICLE_ACTIVE );
572 /#
573  if ( !‪IS_TRUE( owner.swarm_cam ) && GetDvarInt( "scr_swarm_cam" ) == 1 )
574  {
575  p thread ‪projectile_cam( owner );
576  }
577 #/
578  return p;
579 }
580 
582 {
583  self waittill( "death" );
584  level.missile_swarm_count--;
585  self.goal delete();
586 }
587 
589 {
590  self endon( "death" );
591 
592  self.owner ‪util::waittill_any( "disconnect", "joined_team" );
593  self Detonate();
594 }
595 
596 function ‪projectile_find_target( acceptSkyExposure )
597 {
598  ks = ‪projectile_find_target_killstreak( acceptSkyExposure );
599  player = ‪projectile_find_target_player( acceptSkyExposure );
600 
601  if ( isdefined( ks ) && !isdefined( player ) )
602  {
603  return ks;
604  }
605  else if ( !isdefined( ks ) && isdefined( player ) )
606  {
607  return player;
608  }
609  else if ( isdefined( ks ) && isdefined( player ) )
610  {
611  if ( ‪math::cointoss() )
612  {
613  return ks;
614  }
615 
616  return player;
617  }
618 
619  return undefined;
620 }
621 
622 function ‪projectile_find_target_killstreak( acceptSkyExposure )
623 {
624  ks = [];
625  ks[ "offset" ] = ( 0, 0, -10 );
626 
627  targets = Target_GetArray();
628  rcbombs = GetEntArray( "rcbomb", "targetname" );
629  satellites = GetEntArray( "satellite", "targetname" );
631 
632  targets = ArrayCombine( targets, rcbombs, true, false );
633  targets = ArrayCombine( targets, satellites, true, false );
634  targets = ArrayCombine( targets, dogs, true, false );
635 
636  if ( targets.size <= 0 )
637  {
638  return undefined;
639  }
640 
641  targets = ArraySort( targets, self.origin );
642 
643  foreach( target in targets )
644  {
645  if ( isdefined( target.owner ) && target.owner == self.owner )
646  {
647  continue;
648  }
649 
650  if ( isdefined( target.script_owner ) && target.script_owner == self.owner )
651  {
652  continue;
653  }
654 
655  if ( level.teambased && isdefined( target.team ) )
656  {
657  if ( target.team == self.team )
658  {
659  continue;
660  }
661  }
662 
663  // can see the origin
664  if ( BulletTracePassed( self.origin, target.origin, false, target ) )
665  {
666  ks[ "entity" ] = target;
667  return ks;
668  }
669 
670  if ( acceptSkyExposure && ‪math::cointoss() )
671  {
672  // exposed to sky
673  ‪end = target.origin + ( 0, 0, 2048 );
674  if ( BulletTracePassed( target.origin, ‪end, false, target ) )
675  {
676  ks[ "entity" ] = target;
677  return ks;
678  }
679  }
680  }
681 
682  return undefined;
683 }
684 
685 
686 function ‪projectile_find_target_player( acceptExposedToSky )
687 {
688  target = [];
689 
690  players = GetPlayers();
691  players = ArraySort( players, self.origin );
692 
693  foreach( player in players )
694  {
695  if ( !‪player_valid_target( player, self.team, self.owner ) )
696  {
697  continue;
698  }
699 
700  // can see the player's origin
701  if ( BulletTracePassed( self.origin, player.origin, false, player ) )
702  {
703  target[ "entity" ] = player;
704  target[ "offset" ] = ( 0, 0, 0 );
705 
706  return target;
707  }
708 
709  // can see the player's head
710  if ( BulletTracePassed( self.origin, player GetEye(), false, player ) )
711  {
712  target[ "entity" ] = player;
713  target[ "offset" ] = ( 0, 0, 50 );
714 
715  return target;
716  }
717 
718  if ( acceptExposedToSky && ‪math::cointoss() )
719  {
720  // player exposed to sky
721  ‪end = player.origin + ( 0, 0, 2048 );
722  if ( BulletTracePassed( player.origin, ‪end, false, player ) )
723  {
724  target[ "entity" ] = player;
725  target[ "offset" ] = ( 0, 0, 30 );
726 
727  return target;
728  }
729  }
730  }
731 
732  return undefined;
733 }
734 
735 function ‪create_player_targeting_array( owner, team )
736 {
737  level.playerTargetedTimes = [];
738  players = GetPlayers();
739 
740  foreach( player in players )
741  {
742  if ( !‪player_valid_target( player, team, owner ) )
743  {
744  continue;
745  }
746 
747  level.playerTargetedTimes[ player.clientid ] = 0;
748  }
749 }
750 
751 //Added some logic here to favor not already targeted players
752 function ‪projectile_find_random_player( owner, team )
753 {
754  players = GetPlayers();
755 
756  lowest = 10000;
757 
758  foreach( player in players )
759  {
760  if ( !‪player_valid_target( player, team, owner ) )
761  {
762  continue;
763  }
764 
765  if ( !isdefined(level.playerTargetedTimes[ player.clientID ]) )
766  {
767  level.playerTargetedTimes[ player.clientID ] = 0;
768  }
769  if ( level.playerTargetedTimes[ player.clientID ] < lowest || ( level.playerTargetedTimes[ player.clientID ] == lowest && RandomInt(100) > 50 ) )
770  {
771  target = player;
772  lowest = level.playerTargetedTimes[ player.clientID ];
773  }
774  }
775 
776  if ( isdefined( target ) )
777  {
778  level.playerTargetedTimes[ target.clientID ] = level.playerTargetedTimes[ target.clientID ] + 1;
779  return target;
780  }
781 
782  return undefined;
783 }
784 
785 function ‪player_valid_target( player, team, owner )
786 {
787  if ( player.sessionstate != "playing" )
788  {
789  return false;
790  }
791 
792  if ( !IsAlive( player ) )
793  {
794  return false;
795  }
796 
797  if ( player == owner )
798  {
799  return false;
800  }
801 
802  if ( level.teambased )
803  {
804  if ( team == player.team )
805  {
806  return false;
807  }
808  }
809 
810  if ( player ‪airsupport::canTargetPlayerWithSpecialty() == false )
811  {
812  return false;
813  }
814 
815  if ( isdefined( player.lastspawntime ) && GetTime() - player.lastspawntime < 3000 )
816  {
817  return false;
818  }
819 
820 /#
821  if ( player IsInMoveMode( "ufo", "noclip" ) )
822  {
823  return false;
824  }
825 #/
826 
827  return true;
828 }
‪projectile_find_random_player
‪function projectile_find_random_player(owner, team)
Definition: _missile_swarm.gsc:752
‪target_sounds
‪function target_sounds(targetent)
Definition: _missile_swarm.gsc:479
‪target_stop_sounds
‪function target_stop_sounds(targetent)
Definition: _missile_swarm.gsc:509
‪swarm_killstreak_fx
‪function swarm_killstreak_fx()
Definition: _missile_swarm.gsc:256
‪projectile_spawn_utility
‪function projectile_spawn_utility(owner, target, origin, weapon, targetname, moveGoal)
Definition: _missile_swarm.gsc:560
‪create_player_targeting_array
‪function create_player_targeting_array(owner, team)
Definition: _missile_swarm.gsc:735
‪projectile_find_target
‪function projectile_find_target(acceptSkyExposure)
Definition: _missile_swarm.gsc:596
‪detonate
‪function detonate(attacker)
Definition: vehicle_ai_shared.gsc:1650
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪reset_sound_blocker
‪function reset_sound_blocker(target)
Definition: _missile_swarm.gsc:519
‪projectile_find_target_player
‪function projectile_find_target_player(acceptExposedToSky)
Definition: _missile_swarm.gsc:686
‪swarm_killstreak_start
‪function swarm_killstreak_start(owner, killstreak_id)
Definition: _missile_swarm.gsc:110
‪play_killstreak_start_dialog
‪function play_killstreak_start_dialog(killstreakType, team, killstreakId)
Definition: _killstreaks.gsc:1905
‪cointoss
‪function cointoss()
Definition: math_shared.csc:171
‪set_dvar_int_if_unset
‪function set_dvar_int_if_unset(dvar, value, reset)
Definition: _util.gsc:453
‪projectile_cam
‪function projectile_cam(player)
Definition: _missile_swarm.gsc:365
‪addFlySwatterStat
‪function addFlySwatterStat(weapon, aircraft)
Definition: challenges_shared.gsc:86
‪ENEMY_VEHICLE_ACTIVE
‪#define ENEMY_VEHICLE_ACTIVE
Definition: _hacker_tool.gsh:2
‪projectile_find_target_killstreak
‪function projectile_find_target_killstreak(acceptSkyExposure)
Definition: _missile_swarm.gsc:622
‪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
‪canTargetPlayerWithSpecialty
‪function canTargetPlayerWithSpecialty()
Definition: _airsupport.gsc:1228
‪dog_manager_get_dogs
‪function dog_manager_get_dogs()
Definition: _dogs.gsc:625
‪end
‪function end(final)
Definition: _killcam.gsc:511
‪waittill_any
‪function waittill_any(str_notify1, str_notify2, str_notify3, str_notify4, str_notify5)
Definition: util_shared.csc:375
‪init
‪function init()
Definition: _missile_swarm.gsc:31
‪set_dvar_float_if_unset
‪function set_dvar_float_if_unset(dvar, value, reset)
Definition: _util.gsc:437
‪player_valid_target
‪function player_valid_target(player, team, owner)
Definition: _missile_swarm.gsc:785
‪projectile_spawn
‪function projectile_spawn(owner)
Definition: _missile_swarm.gsc:526
‪projectile_target_search
‪function projectile_target_search(acceptSkyExposure, acquireTime, allowPlayerOffset)
Definition: _missile_swarm.gsc:438
‪killstreakStop
‪function killstreakStop(hardpointType, team, id)
Definition: _killstreakrules.gsc:293
‪swarm_killstreak
‪function swarm_killstreak(hardpointType)
Definition: _missile_swarm.gsc:56
‪killstreakStart
‪function killstreakStart(hardpointType, team, hacked, displayTeamMessage)
Definition: _killstreakrules.gsc:184
‪swarm_killstreak_end
‪function swarm_killstreak_end(owner, detonate, killstreak_id)
Definition: _missile_swarm.gsc:150
‪crossesNoFlyZone
‪function crossesNoFlyZone(start, end)
Definition: _airsupport.gsc:391
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪projectile_goal_move
‪function projectile_goal_move()
Definition: _missile_swarm.gsc:388
‪projectile_abort_think
‪function projectile_abort_think()
Definition: _missile_swarm.gsc:588
‪projectile_death_think
‪function projectile_death_think()
Definition: _missile_swarm.gsc:581
‪swarm_think
‪function swarm_think(owner, killstreak_id)
Definition: _missile_swarm.gsc:332
‪swarm_killstreak_abort
‪function swarm_killstreak_abort(owner, killstreak_id)
Definition: _missile_swarm.gsc:237
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265
‪swarm_killstreak_watch_for_emp
‪function swarm_killstreak_watch_for_emp(owner, killstreak_id)
Definition: _missile_swarm.gsc:245