‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_remotemissile.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\hud_shared;
6 #using scripts\shared\math_shared;
7 #using scripts\shared\scoreevents_shared;
8 #using scripts\shared\util_shared;
9 
10 #using scripts\mp\_util;
11 #using scripts\mp\gametypes\_battlechatter;
12 #using scripts\mp\gametypes\_globallogic_audio;
13 #using scripts\mp\gametypes\_spawning;
14 #using scripts\mp\killstreaks\_killstreakrules;
15 #using scripts\mp\killstreaks\_killstreaks;
16 #using scripts\shared\visionset_mgr_shared;
17 
18 #insert scripts\mp\_hacker_tool.gsh;
19 #insert scripts\mp\killstreaks\_killstreaks.gsh;
20 #using scripts\mp\killstreaks\_killstreak_bundles;
21 #using scripts\mp\killstreaks\_killstreak_detect;
22 #using scripts\mp\killstreaks\_killstreak_hacking;
23 #insert scripts\shared\shared.gsh;
24 #insert scripts\shared\version.gsh;
25 #insert scripts\shared\clientfields.gsh;
26 
27 
28 #define REMOTE_MISSILE_MAX_OTHER_TARGETS_HUD 3
29 #define REMOTE_MISSILE_TARGETING_RADIUS 600
30 #define REMOTE_MISSILE_BOMBLETS_NUMBER 6
31 #define REMOTE_MISSILE_FRAMES_BETWEEN_TARGET_SCAN 5
32 #define REMOTE_MISSILE_MAP_ICON_DELAY 0.1
33 #define REMOTE_MISSILE_BRAKE_TIMEOUT 1.5
34 #define REMOTE_MISSILE_ICON_SIZE 175
35 
36 //#precache( "material","tow_filter_overlay_no_signal");
37 #precache( "material", "hud_remote_missile_target" );
38 #precache( "string", "KILLSTREAK_EARNED_REMOTE_MISSILE" );
39 #precache( "string", "KILLSTREAK_REMOTE_MISSILE_NOT_AVAILABLE" );
40 #precache( "string", "KILLSTREAK_REMOTE_MISSILE_INBOUND" );
41 #precache( "string", "KILLSTREAK_REMOTE_MISSILE_HACKED" );
42 #precache( "eventstring", "mpl_killstreak_cruisemissile" );
43 #precache( "fx", "killstreaks/fx_predator_trigger" );
44 
45 #namespace remotemissile;
46 
47 #define REMOTE_MISSILE_NAME "remote_missile"
48 
49 function ‪init()
50 {
51  level.rockets = [];
52 
53  ‪killstreaks::register( "remote_missile", "remote_missile", "killstreak_remote_missile", "remote_missle_used",&‪tryUsePredatorMissile, true );
54  ‪killstreaks::register_alt_weapon( "remote_missile", "remote_missile_missile" );
55  ‪killstreaks::register_alt_weapon( "remote_missile", "remote_missile_bomblet" );
56  ‪killstreaks::register_strings( "remote_missile", &"KILLSTREAK_EARNED_REMOTE_MISSILE", &"KILLSTREAK_REMOTE_MISSILE_NOT_AVAILABLE", &"KILLSTREAK_REMOTE_MISSILE_INBOUND", undefined, &"KILLSTREAK_REMOTE_MISSILE_HACKED" );
57  ‪killstreaks::register_dialog( "remote_missile", "mpl_killstreak_cruisemissile", "remoteMissileDialogBundle", "remoteMissilePilotDialogBundle", "friendlyRemoteMissile", "enemyRemoteMissile", "enemyRemoteMissileMultiple", "friendlyRemoteMissileHacked", "enemyRemoteMissileHacked", "requestRemoteMissile" );
58  ‪killstreaks::set_team_kill_penalty_scale( "remote_missile", level.teamKillReducedPenalty );
59  ‪killstreaks::override_entity_camera_in_demo("remote_missile", true);
60 
61  ‪clientfield::register( "missile", "remote_missile_bomblet_fired", ‪VERSION_SHIP, 1, "int" );
62  ‪clientfield::register( "missile", "remote_missile_fired", ‪VERSION_SHIP, 2, "int" );
63 
64  level.missilesForSightTraces = [];
65 
66  level.missileRemoteDeployFX = "killstreaks/fx_predator_trigger";
67  level.missileRemoteLaunchVert = 18000;
68  level.missileRemoteLaunchHorz = 7000;
69  level.missileRemoteLaunchTargetDist = 1500;
70 
72 }
73 
74 function ‪remote_missile_game_end_think( rocket, team, killstreak_id )
75 {
76  self endon( "Remotemissle_killstreak_done" );
77 
78  level waittill( "game_ended" );
79 
80  self thread ‪player_missile_end( rocket, true, true, team, killstreak_id );
81 
82  self notify( "Remotemissle_killstreak_done" );
83 }
84 
85 function ‪tryUsePredatorMissile( lifeId )
86 {
87  waterDepth = self depthofplayerinwater();
88 
89  if( !self IsOnGround() || self ‪util::isUsingRemote() || ( waterDepth > 2 ) || self ‪killstreaks::is_killstreak_start_blocked() )
90  {
91  self iPrintLnBold( &"KILLSTREAK_REMOTE_MISSILE_NOT_USABLE" );
92  return false;
93  }
94 
95  team = self.team;
96  killstreak_id = self ‪killstreakrules::killstreakStart( "remote_missile", team, false, true );
97  if ( killstreak_id == -1 )
98  {
99  return false;
100  }
101 
102  self.remoteMissilePilotIndex = ‪killstreaks::get_random_pilot_index( "remote_missile" );
103 
104  returnVar = ‪_fire( lifeId, self, team, killstreak_id );
105 
106  return returnVar;
107 }
108 
109 
110 function ‪getBestSpawnPoint( remoteMissileSpawnPoints )
111 {
112  validEnemies = [];
113 
114  foreach ( spawnPoint in remoteMissileSpawnPoints )
115  {
116  spawnPoint.validPlayers = [];
117  spawnPoint.spawnScore = 0;
118  }
119 
120  foreach ( player in level.players )
121  {
122  if ( !isAlive( player ) )
123  continue;
124 
125  if ( player.team == self.team )
126  continue;
127 
128  if ( player.team == "spectator" )
129  continue;
130 
131  bestDistance = 999999999;
132  bestSpawnPoint = undefined;
133 
134  foreach ( spawnPoint in remoteMissileSpawnPoints )
135  {
136  //could add a filtering component here but i dont know what it would be.
137  spawnPoint.validPlayers[spawnPoint.validPlayers.size] = player;
138 
139  potentialBestDistance = Distance2DSquared( spawnPoint.targetent.origin, player.origin );
140 
141  if ( potentialBestDistance <= bestDistance )
142  {
143  bestDistance = potentialBestDistance;
144  bestSpawnpoint = spawnPoint;
145  }
146  }
147 
148  bestSpawnPoint.spawnScore += 2;
149  }
150 
151  bestSpawn = remoteMissileSpawnPoints[0];
152  foreach ( spawnPoint in remoteMissileSpawnPoints )
153  {
154  foreach ( player in spawnPoint.validPlayers )
155  {
156  spawnPoint.spawnScore += 1;
157 
158  if ( bulletTracePassed( player.origin + (0,0,32), spawnPoint.origin, false, player ) )
159  spawnPoint.spawnScore += 3;
160 
161  if ( spawnPoint.spawnScore > bestSpawn.spawnScore )
162  {
163  bestSpawn = spawnPoint;
164  }
165  else if ( spawnPoint.spawnScore == bestSpawn.spawnScore ) // equal spawn weights so we toss a coin.
166  {
167  if ( ‪math::cointoss() )
168  bestSpawn = spawnPoint;
169  }
170  }
171  }
172 
173  return ( bestSpawn );
174 }
175 
176 function ‪drawLine( start, ‪end, timeSlice, color )
177 {
178  /#
179  drawTime = int(timeSlice * 20);
180  for( time = 0; time < drawTime; time++ )
181  {
182  line( start, ‪end, color,false, 1 );
184  }
185  #/
186 }
187 
188 function ‪_fire( lifeId, player, team, killstreak_id )
189 {
190  remoteMissileSpawnArray = getEntArray( "remoteMissileSpawn" , "targetname" );
191 
192  foreach ( ‪spawn in remoteMissileSpawnArray )
193  {
194  if ( isdefined( ‪spawn.target ) )
195  ‪spawn.targetEnt = getEnt( ‪spawn.target, "targetname" );
196  }
197 
198  if ( remoteMissileSpawnArray.size > 0 )
199  remoteMissileSpawn = player ‪getBestSpawnPoint( remoteMissileSpawnArray );
200  else
201  remoteMissileSpawn = undefined;
202 
203  if ( isdefined( remoteMissileSpawn ) )
204  {
205  startPos = remoteMissileSpawn.origin;
206  targetPos = remoteMissileSpawn.targetEnt.origin;
207 
208  vector = vectorNormalize( startPos - targetPos );
209  startPos = ( vector * level.missileRemoteLaunchVert ) + targetPos;
210  }
211  else
212  {
213  upVector = (0, 0, level.missileRemoteLaunchVert );
214  backDist = level.missileRemoteLaunchHorz;
215  targetDist = level.missileRemoteLaunchTargetDist;
216 
217  forward = AnglesToForward( player.angles );
218  startpos = player.origin + upVector + forward * backDist * -1;
219  targetPos = player.origin + forward * targetDist;
220  }
221 
222  self ‪util::setUsingRemote( "remote_missile" );
223  self ‪util::freeze_player_controls( true );
224  player DisableWeaponCycling();
225 
226  ‪result = self ‪killstreaks::init_ride_killstreak( "qrdrone" );
227 
228  if ( ‪result != "success" || level.gameended )
229  {
230  if ( ‪result != "disconnect" )
231  {
232  player ‪util::freeze_player_controls( false );
234  player EnableWeaponCycling();
235  ‪killstreakrules::killstreakStop( "remote_missile", team, killstreak_id );
236  }
237 
238  return false;
239  }
240 
241  rocket = MagicBullet( GetWeapon( "remote_missile_missile" ), startpos, targetPos, player );
242  rocket.forceOneMissile = true;
243  forceAngleVector = vectorNormalize( targetPos - startPos );
244  rocket.angles = VectorToAngles( forceAngleVector );
245  rocket.targetname = "remote_missile";
246 
247  rocket ‪killstreaks::configure_team( ‪REMOTE_MISSILE_NAME, killstreak_id, self, undefined, undefined, undefined );
250  rocket.hackedHealthUpdateCallback = &‪hackedHealthUpdate;
251  rocket ‪clientfield::set( "enemyvehicle", ‪ENEMY_VEHICLE_ACTIVE );
252 
253  rocket thread ‪handleDamage();
254 
255  player LinkToMissile( rocket, true, true );
256  rocket.owner = player;
257  rocket.killcament = player;
258  player thread ‪cleanupWaiter( rocket, player.team, killstreak_id );
259 
260  ‪visionset_mgr::activate( "visionset", ‪REMOTE_MISSILE_VISIONSET_ALIAS, player, 0, 90000, 0 );
261  player SetModelLodBias( ‪VAL( level.remotemissile_lod_bias, 12 ) );
262  self ‪clientfield::set_to_player( "fog_bank_2", 1 );
264  self ‪killstreaks::play_killstreak_start_dialog( "remote_missile", self.pers["team"], killstreak_id );
265 
266  self AddWeaponStat( GetWeapon( "remote_missile" ), "used", 1 );
267 
268  rocket thread ‪setup_rockect_map_icon();
269  rocket thread ‪watch_missile_kill_z();
270  rocket ‪missile_sound_play( player );
271  rocket thread ‪missile_brake_timeout_watch();
272  rocket thread ‪missile_sound_impact( player, 3750 );
273  player thread ‪missile_sound_boost( rocket );
274  player thread ‪missile_deploy_watch( rocket );
275  player thread ‪remote_missile_game_end_think( rocket, player.team, killstreak_id );
276  player thread ‪watch_missile_death( rocket, player.team, killstreak_id );
277  player thread ‪sndWatchExplo();
278 
279  rocket ‪spawning::create_entity_enemy_influencer( "small_vehicle", rocket.team );
280 
281  player ‪util::freeze_player_controls( false );
282 
283  player waittill( "Remotemissle_killstreak_done" );
284 
285  return true;
286 }
287 
288 function ‪hackedHealthUpdate( hacker )
289 {
290  // no need for health update
291 }
292 
293 function ‪HackedPostFunction( hacker )
294 {
295  rocket = self;
296  hacker ‪missile_deploy( rocket, true );
297 }
298 
300 {
301  self endon("death");
303  self ‪clientfield::set( "remote_missile_fired", ‪REMOTE_MISSILE_FIRED );
304 }
305 
307 {
308  if ( !isdefined( level.remotemissile_kill_z ) )
309  return;
310 
311  rocket = self;
312  kill_z = level.remotemissile_kill_z;
313 
314  rocket endon( "Remotemissle_killstreak_done" );
315  rocket endon( "death" );
316 
317  while ( rocket.origin[2] > kill_z )
318  {
319  wait 0.1; // need to see explosion, so don't wait too long
320  }
321 
322  rocket Detonate();
323 }
324 
325 function ‪watch_missile_death( rocket, team, killstreak_id )
326 {
327  self endon( "Remotemissle_killstreak_done" );
328 
329  rocket waittill( "death" );
330 
331  self thread ‪player_missile_end( rocket, true, true, team, killstreak_id );
332 
333  self thread ‪remotemissile_bda_dialog();
334 
335  self notify( "Remotemissle_killstreak_done" );
336 
337 }
338 
339 function ‪player_missile_end( rocket, performPlayerKillstreakEnd, unlink, team, killstreak_id )
340 {
341  self notify( "player_missile_end_singleton" );
342  self endon ( "player_missile_end_singleton" );
343 
344  if( isalive( rocket ) )
345  {
347  rocket ‪clientfield::set( "remote_missile_fired", 0 );
348  rocket Delete();
349  }
350 
351  self notify( "snd1stPersonExplo" );
352 
353  if( isdefined( self ) )
354  {
355  self thread ‪destroy_missile_hud();
356 
357  //Only do this if the killstreak is ending normally
358  if( ‪IS_TRUE( performPlayerKillstreakEnd ) )
359  {
360  self PlayRumbleOnEntity( "grenade_rumble" );
361 
362  if ( level.gameended == false )
363  {
364  self SendKillstreakDamageEvent( 600 );
365  //self thread hud::fade_to_black_for_x_sec( 0, 0.25, 0.1, 0.25 );
366  }
367 
368  if( isdefined ( rocket ) )
369  {
370  rocket hide();
371  }
372  }
373 
375  self ‪clientfield::set_to_player( "fog_bank_2", 0 );
377  self SetModelLodBias( 0 );
378 
379  if( unlink )
380  self UnlinkFromMissile();
381 
382  self notify( "remotemissile_done" );
383  self ‪util::freeze_player_controls( false );
385  self EnableWeaponCycling();
386 
387  ‪killstreakrules::killstreakStop( "remote_missile", team, killstreak_id );
388  }
389 }
390 
392 {
393  rocket = self;
394  player = rocket.owner;
395 
396  self endon( "death" );
397 
398  self waittill( "missile_brake" );
399 
400  rocket PlaySound( "wpn_remote_missile_brake_npc" );
401  player playlocalsound( "wpn_remote_missile_brake_plr" );
402 
404 
405  if( isdefined( self ) )
406  {
407  self SetMissileBrake( false );
408  }
409 }
410 
411 function ‪stopOndeath( snd )
412 {
413  self waittill( "death" );
414  if( isdefined( snd ) )
415  snd delete();
416 }
417 
418 function ‪cleanupWaiter( rocket, team, killstreak_id )
419 {
420  self endon( "Remotemissle_killstreak_done" );
421 
422  self ‪util::waittill_any( "joined_team", "joined_spectators", "disconnect" );
423 
424  self thread ‪player_missile_end( rocket, false, false, team, killstreak_id );
425 
426  self notify( "Remotemissle_killstreak_done" );
427 }
428 
429 function ‪handleDamage()
430 {
431  self endon ( "death" );
432  self endon ( "deleted" );
433 
434  self setCanDamage( true );
435  self.health = 99999;
436  for ( ;; )
437  {
438  self waittill( "damage", ‪damage, attacker, direction_vec, point, meansOfDeath, tagName, modelName, partName, weapon );
439 
440  if ( isdefined ( attacker ) && isdefined( self.owner ) )
441  {
442  if ( self.owner ‪util::IsEnemyPlayer( attacker ) )
443  {
444  ‪challenges::destroyedAircraft( attacker, weapon, true );
445  attacker ‪challenges::addFlySwatterStat( weapon, self );
446  ‪scoreevents::processScoreEvent( "destroyed_remote_missile", attacker, self.owner, weapon );
447  attacker AddWeaponStat( weapon, "destroyed_controlled_killstreak", 1 );
448  }
449  else
450  {
451  //Destroyed Friendly Killstreak
452  }
453  self.owner SendKillstreakDamageEvent( int(‪damage) );
454  }
456  self Detonate();
457  }
458 }
459 
460 function ‪staticEffect( duration )
461 {
462  self endon ( "disconnect" );
463 
464  staticBG = newClientHudElem( self );
465  staticBG.horzAlign = "fullscreen";
466  staticBG.vertAlign = "fullscreen";
467  staticBG setShader( "white", 640, 480 );
468  staticBG.archive = true;
469  staticBG.sort = 10;
470  staticBG.immunetodemogamehudsettings = true;
471 
472  static = newClientHudElem( self );
473  static.horzAlign = "fullscreen";
474  static.vertAlign = "fullscreen";
475  //static setShader( "tow_filter_overlay_no_signal", 640, 480 );
476  static.archive = true;
477  static.sort = 20;
478  static.immunetodemogamehudsettings = true;
479 
481 
482  wait ( duration );
483 
485  static ‪destroy();
486  staticBG ‪destroy();
487 }
488 
490 {
491  entityNumber = self getEntityNumber();
492  level.rockets[ entityNumber ] = self;
493  self waittill( "death" );
494 
495  level.rockets[ entityNumber ] = undefined;
496 }
497 
498 function ‪missile_sound_play( player )
499 {
500  self.snd_first = ‪spawn( "script_model", self.origin );
501  self.snd_first SetModel( "tag_origin" );
502  self.snd_first LinkTo( self );
503  self.snd_first SetInvisibleToAll();
504  self.snd_first SetVisibleToPlayer( player );
505  self.snd_first PlayLoopSound( "wpn_remote_missile_loop_plr", .5 );
506 
507  self thread ‪stopOndeath( self.snd_first );
508 
509  self.snd_third = ‪spawn( "script_model", self.origin );
510  self.snd_third SetModel( "tag_origin" );
511  self.snd_third LinkTo( self );
512  self.snd_third SetVisibleToAll();
513  self.snd_third SetInvisibleToPlayer( player );
514  self.snd_third PlayLoopSound( "wpn_remote_missile_loop_npc", .2 );
515 
516  self thread ‪stopOndeath( self.snd_third );
517 }
518 
519 function ‪missile_sound_boost( rocket )
520 {
521  self endon( "remotemissile_done" );
522  self endon( "joined_team" );
523  self endon( "joined_spectators" );
524  self endon( "disconnect" );
525 
526  self waittill( "missile_boost" );
527  rocket PlaySound( "wpn_remote_missile_fire_boost_npc" );
528  rocket.snd_third PlayLoopSound( "wpn_remote_missile_boost_npc" );
529 
530  self playlocalsound( "wpn_remote_missile_fire_boost_plr" );
531  rocket.snd_first PlayLoopSound( "wpn_remote_missile_boost_plr" );
532  self PlayRumbleOnEntity( "sniper_fire" );
533 
534  if ( rocket.origin[2] - self.origin[2] > 4000 )
535  {
536  rocket notify( "stop_impact_sound" );
537  rocket thread ‪missile_sound_impact( self, 6250 );
538  }
539 }
540 
541 function ‪missile_sound_impact( player, distance )
542 {
543  self endon( "death" );
544  self endon( "stop_impact_sound" );
545  player endon( "disconnect" );
546  player endon( "remotemissile_done" );
547  player endon( "joined_team" );
548  player endon( "joined_spectators" );
549 
550  for ( ;; )
551  {
552  if ( self.origin[2] - player.origin[2] < distance )
553  {
554  self PlaySound( "wpn_remote_missile_inc" );
555  return;
556  }
558  }
559 }
560 
562 {
563  self endon( "Remotemissle_killstreak_done" );
564  self endon( "remotemissile_done" );
565  self endon( "joined_team" );
566  self endon( "joined_spectators" );
567  self endon( "disconnect" );
568  self endon( "bomblets_deployed" );
569 
570  self waittill( "snd1stPersonExplo" );
571  self playlocalsound( "wpn_remote_missile_explode_plr" );
572 }
573 
575 {
576  self.snd_first PlayLoopSound( "wpn_remote_missile_loop_plr", .5 );
577 }
578 
579 function ‪getValidTargets( rocket, ‪trace, max_targets )
580 {
581  pixbeginevent("remotemissile_getVTs_header");
582 
583  targets = [];
584 
585  forward = AnglesToForward ( rocket.angles );
586 
587  rocketZ = rocket.origin[2];
588  mapCenterZ = level.mapCenter[2];
589  diff = mapCenterZ - rocketZ;
590 
591  ratio = diff / forward[2];
592 
593  aimTarget = rocket.origin + forward * ratio;
594  rocket.aimTarget = aimTarget;
595 
596 // /#
597 // circle( rocket.aimTarget, REMOTE_MISSILE_TARGETING_RADIUS, (0,1,0), true, true, 2000 );
598 // #/
599 
600  pixendevent();
601 
602  pixbeginevent("remotemissile_getVTs_enemies");
603 
604  enemies = self GetEnemies();
605 
606  foreach( player in enemies )
607  {
608  if( !IsPlayer( player ) )
609  {
610  continue;
611  }
612 
613  if ( player.ignoreme === true )
614  {
615  continue;
616  }
617 
618  if ( Distance2DSquared( player.origin, aimTarget) < ‪REMOTE_MISSILE_TARGETING_RADIUS * ‪REMOTE_MISSILE_TARGETING_RADIUS && !player HasPerk( "specialty_nokillstreakreticle" ) )
619  {
620  if ( ‪trace )
621  {
622  if ( BulletTracePassed( player.origin + (0,0,60), player.origin + (0,0,180), false, player) )
623  {
624  targets[targets.size] = player;
625  }
626  }
627  else
628  {
629  targets[targets.size] = player;
630  }
631  if( targets.size >= max_targets )
632  return targets;
633  }
634  }
635 
636  dogs = GetEntArray( "attack_dog", "targetname" );
637 
638  foreach( dog in dogs )
639  {
640  if ( dog.team != self.team && Distance2DSquared( dog.origin, aimTarget) < ‪REMOTE_MISSILE_TARGETING_RADIUS * ‪REMOTE_MISSILE_TARGETING_RADIUS )
641  {
642  if ( ‪trace )
643  {
644  if ( BulletTracePassed( dog.origin + (0,0,60), dog.origin + (0,0,180), false, dog) )
645  {
646  targets[targets.size] = dog;
647  }
648  }
649  else
650  {
651  targets[targets.size] = dog;
652  }
653  if( targets.size >= max_targets )
654  return targets;
655  }
656  }
657 
658  tanks = GetEntArray( "talon", "targetname" );
659 
660  foreach( tank in tanks )
661  {
662  if ( tank.team != self.team && Distance2DSquared( tank.origin, aimTarget) < ‪REMOTE_MISSILE_TARGETING_RADIUS * ‪REMOTE_MISSILE_TARGETING_RADIUS )
663  {
664  if ( ‪trace )
665  {
666  if ( BulletTracePassed( tank.origin + (0,0,60), tank.origin + (0,0,180), false, tank) )
667  {
668  targets[targets.size] = tank;
669  }
670  }
671  else
672  {
673  targets[targets.size] = tank;
674  }
675  if( targets.size >= max_targets )
676  return targets;
677  }
678  }
679 
680  turrets = GetEntArray( "auto_turret", "classname" );
681  foreach( turret in turrets )
682  {
683  if ( turret.team != self.team && Distance2DSquared( turret.origin, aimTarget) < ‪REMOTE_MISSILE_TARGETING_RADIUS * ‪REMOTE_MISSILE_TARGETING_RADIUS )
684  {
685  if ( ‪trace )
686  {
687  if ( BulletTracePassed( turret.origin + (0,0,60), turret.origin + (0,0,180), false, turret) )
688  {
689  targets[targets.size] = turret;
690  }
691  }
692  else
693  {
694  targets[targets.size] = turret;
695  }
696  if( targets.size >= max_targets )
697  return targets;
698  }
699  }
700 
701  pixendevent();
702 
703  return targets;
704 }
705 
706 function ‪create_missile_hud( rocket )
707 {
708  self.missile_target_icons = [];
709 
710  foreach (player in level.players)
711  {
712  if( player == self )
713  continue;
714 
715  if (level.teamBased && player.team == self.team)
716  continue;
717 
718  index = player.clientId;
719  self.missile_target_icons[index] = newClientHudElem( self );
720  self.missile_target_icons[index].x = 0;
721  self.missile_target_icons[index].y = 0;
722  self.missile_target_icons[index].z = 0;
723  self.missile_target_icons[index].alpha = 0;
724  self.missile_target_icons[index].archived = true;
725  self.missile_target_icons[index] setShader( "hud_remote_missile_target", ‪REMOTE_MISSILE_ICON_SIZE, ‪REMOTE_MISSILE_ICON_SIZE );
726  self.missile_target_icons[index] setWaypoint( false );
727  self.missile_target_icons[index].hidewheninmenu = true;
728  self.missile_target_icons[index].immunetodemogamehudsettings = true;
729  }
730 
732  {
733  self.missile_target_other[i] = newClientHudElem( self );
734  self.missile_target_other[i].x = 0;
735  self.missile_target_other[i].y = 0;
736  self.missile_target_other[i].z = 0;
737  self.missile_target_other[i].alpha = 0;
738  self.missile_target_other[i].archived = true;
739  self.missile_target_other[i] setShader( "hud_remote_missile_target", ‪REMOTE_MISSILE_ICON_SIZE, ‪REMOTE_MISSILE_ICON_SIZE );
740  self.missile_target_other[i] setWaypoint( false );
741  self.missile_target_other[i].hidewheninmenu = true;
742  self.missile_target_other[i].immunetodemogamehudsettings = true;
743  }
744  rocket.iconIndexOther = 0;
745 
746  self thread ‪targeting_hud_think( rocket );
747 }
748 
750 {
751  if (isdefined( self.missile_target_icons) )
752  {
753  foreach (player in level.players)
754  {
755  if( player == self )
756  {
757  continue;
758  }
759 
760  index = player.clientId;
761  if (isdefined(self.missile_target_icons[index]))
762  {
763  self.missile_target_icons[index] Destroy();
764  }
765  }
766  }
767  if (isdefined( self.missile_target_other) )
768  {
770  {
771  if( isdefined( self.missile_target_other[i] ) )
772  self.missile_target_other[i] Destroy();
773  }
774  }
775 }
776 
777 function ‪targeting_hud_think( rocket )
778 {
779  self endon( "disconnect" );
780  self endon("remotemissile_done");
781  rocket endon("death");
782  level endon ( "game_ended" );
783 
784  targets = self ‪getValidTargets( rocket, true, ‪REMOTE_MISSILE_BOMBLETS_NUMBER );
785  framesSinceTargetScan = 0;
786 
787  while( true )
788  {
789  foreach (icon in self.missile_target_icons)
790  {
791  icon.alpha = 0;
792  }
793 
794  framesSinceTargetScan++;
795 
796  if ( framesSinceTargetScan > ‪REMOTE_MISSILE_FRAMES_BETWEEN_TARGET_SCAN )
797  {
798  targets = self ‪getValidTargets( rocket, true, ‪REMOTE_MISSILE_BOMBLETS_NUMBER );
799  framesSinceTargetScan = 0;
800  }
801 
802  if (targets.size > 0)
803  {
804  foreach (target in targets)
805  {
806  if ( isdefined( target ) == false )
807  continue;
808 
809  if ( IsPlayer( target ) )
810  {
811  if ( isalive( target ) )
812  {
813  index = target.clientId;
814  assert( isdefined( index ) );
815 
816  self.missile_target_icons[index].x = target.origin[0];
817  self.missile_target_icons[index].y = target.origin[1];
818  self.missile_target_icons[index].z = target.origin[2] + 47;
819  self.missile_target_icons[index].alpha = 1;
820  }
821  }
822  else
823  {
824  if( !isdefined(target.missileIconIndex))
825  {
826  target.missileIconIndex = rocket.iconIndexOther;
827  rocket.iconIndexOther = (rocket.iconIndexOther + 1) % ‪REMOTE_MISSILE_MAX_OTHER_TARGETS_HUD;
828  }
829  index = target.missileIconIndex;
830  self.missile_target_other[index].x = target.origin[0];
831  self.missile_target_other[index].y = target.origin[1];
832  self.missile_target_other[index].z = target.origin[2];
833  self.missile_target_other[index].alpha = 1;
834  }
835  }
836  }
837 
838  wait (0.1);
839  }
840 }
841 
842 function ‪missile_deploy_watch( rocket )
843 {
844  self endon( "disconnect" );
845  self endon("remotemissile_done");
846  rocket endon("remotemissile_bomblets_launched");
847  rocket endon("death");
848  level endon ( "game_ended" );
849 
850  wait ( 0.25 );
851 
852  self thread ‪create_missile_hud( rocket );
853 
854  while( true )
855  {
856  if ( self attackbuttonpressed() )
857  {
858  self thread ‪missile_deploy( rocket, false );
859  }
860  else
861  {
863  }
864  }
865 }
866 
867 function ‪missile_deploy( rocket, hacked )
868 {
869  rocket notify ("remotemissile_bomblets_launched");
870  waitFrames = 2;
871  explosionRadius = 0;
872  targets = self ‪getValidTargets( rocket, false, ‪REMOTE_MISSILE_BOMBLETS_NUMBER );
873  if( targets.size > 0 )
874  {
875  foreach( target in targets )
876  {
877  self thread ‪fire_bomblet( rocket, explosionRadius, target, waitFrames );
878  waitFrames++;
879  }
880  }
881 
882  //bomblet = MagicBullet( GetWeapon( "remote_missile_bomblet" ), rocket.origin, rocket.origin + AnglesToForward ( rocket.angles ) * 1000, self);
883  //setup_bomblet( bomblet );
884 
885  if( rocket.origin[2] - self.origin[2] > 4000 )
886  {
887  //bomblet thread missile_sound_impact( self, 8000 );
888  rocket notify( "stop_impact_sound" );
889  }
890  if( hacked == true )
891  {
892  rocket.originalOwner thread ‪hud::fade_to_black_for_x_sec( 0, 0.15, 0, 0, "white" );
893  self notify("remotemissile_done");
894  }
895 
896  rocket ‪clientfield::set( "remote_missile_fired", ‪REMOTE_MISSILE_PLAYER_DETONATED );
897  for( i = targets.size; i < ‪REMOTE_MISSILE_BOMBLETS_NUMBER; i++ )
898  {
899  self thread ‪fire_random_bomblet( rocket, explosionRadius, i % 6, waitFrames );
900  waitFrames++;
901  }
902 
903  playfx( level.missileRemoteDeployFX, rocket.origin, anglestoForward( rocket.angles ) );
904  self playLocalSound("mpl_rc_exp");
905  self PlayRumbleOnEntity( "sniper_fire" );
906  Earthquake( 0.2, 0.2, rocket.origin, 200 );
907 
908  //still rocket for viewing the bomblets
909  rocket Hide();
910  rocket setMissileCoasting( true );
911  if ( hacked == false )
912  {
913  self thread ‪hud::fade_to_black_for_x_sec( 0, 0.15, 0, 0, "white" );
914  }
915 
917  self thread ‪bomblet_camera_waiter( rocket );
918  self notify( "bomblets_deployed" );
919 
920  if ( hacked == true )
921  {
922  rocket notify( "death" );
923  }
924 
925  return;
926 }
927 
928 function ‪bomblet_camera_waiter( rocket )
929 {
930  self endon( "disconnect" );
931  self endon("remotemissile_done");
932  rocket endon("death");
933  level endon ( "game_ended" );
934 
935  ‪delay = GetDvarFloat( "scr_rmbomblet_camera_delaytime", 1.0 );
936 
937  self waittill( "bomblet_exploded" );
938 
939  wait( ‪delay );
940 
941  rocket notify( "death" );
942  self notify("remotemissile_done");
943 }
944 
946 {
947  self endon("death");
949  self ‪clientfield::set( "remote_missile_bomblet_fired", ‪REMOTE_MISSILE_BOMBLET_FIRED );
950  self ‪clientfield::set( "enemyvehicle", ‪ENEMY_VEHICLE_ACTIVE );
951 }
952 
953 function ‪setup_bomblet( bomb )
954 {
955  bomb.team = self.team;
956 
957  bomb setTeam( self.team );
958 
959  //Send over for the compass icon
960  bomb thread ‪setup_bomblet_map_icon();
961 
962  bomb.killcamEnt = self;
963 
964  bomb thread ‪bomblet_explostion_waiter( self );
965 }
966 
967 function ‪fire_bomblet( rocket, explosionRadius, target, waitFrames )
968 {
969  origin = rocket.origin;
970 
971  targetOrigin = target.origin + (0,0,50);
972 
973  wait( waitFrames * 0.05 );
974 
975  if( isdefined( rocket ) )
976  origin = rocket.origin;
977 
978  bomb = MagicBullet( GetWeapon( "remote_missile_bomblet" ), origin, targetOrigin, self, target, (0,0,30) );
979 
980  ‪setup_bomblet( bomb );
981 }
982 
983 function ‪fire_random_bomblet( rocket, explosionRadius, quadrant, waitFrames )
984 {
985  origin = rocket.origin;
986  angles = rocket.angles;
987  owner = rocket.owner;
988  aimTarget = rocket.aimtarget;
989 
990  wait ( waitFrames * 0.05 );
991 
992  angle = randomIntRange( 10 + ( 60 * quadrant), 50 + ( 60 * quadrant ) );
993  radius = randomIntRange( 200, ‪REMOTE_MISSILE_TARGETING_RADIUS + 100 );
994  x = min( radius, ‪REMOTE_MISSILE_TARGETING_RADIUS - 50 ) * Cos( angle );
995  y = min( radius, ‪REMOTE_MISSILE_TARGETING_RADIUS - 50 ) * Sin( angle );
996 
997  bomb = MagicBullet( GetWeapon( "remote_missile_bomblet" ), origin, aimtarget + ( x, y, 0 ), self);
998 
999  ‪setup_bomblet( bomb );
1000 }
1001 
1002 function ‪cleanup_bombs( bomb )
1003 {
1004  player = self;
1005  bomb endon( "death" );
1006 
1007  player ‪util::waittill_any( "joined_team", "joined_spectators", "disconnect" );
1008 
1009  if( isdefined( bomb ) )
1010  {
1011  bomb ‪clientfield::set( "remote_missile_bomblet_fired", 0 );
1012  bomb delete();
1013  }
1014 }
1015 
1017 {
1018  player thread ‪cleanup_bombs( self );
1019 
1020  player endon( "disconnect" );
1021  player endon( "remotemissile_done" );
1022  player endon( "death" );
1023  level endon ( "game_ended" );
1024 
1025  self waittill( "death" );
1026 
1027  player notify( "bomblet_exploded" );
1028 }
1029 
1031 {
1032  if ( isdefined( self.remotemissileBda ) )
1033  {
1034  if (self.remotemissileBda === 1)
1035  {
1036  bdaDialog = "kill1";
1037  }
1038  else if (self.remotemissileBda === 2)
1039  {
1040  bdaDialog = "kill2";
1041  }
1042  else if (self.remotemissileBda === 3)
1043  {
1044  bdaDialog = "kill3";
1045  }
1046  else if (isdefined( self.remotemissileBda ) && self.remotemissileBda > 3)
1047  {
1048  bdaDialog = "killMultiple";
1049  }
1050 
1051  self ‪killstreaks::play_pilot_dialog( bdaDialog, "remote_missile", undefined, self.remoteMissilePilotIndex );
1052 
1053  self ‪globallogic_audio::play_taacom_dialog( "confirmHit" );
1054 
1055  }
1056  else
1057  {
1058  ‪killstreaks::play_pilot_dialog( "killNone", "remote_missile", undefined, self.remoteMissilePilotIndex );
1060  }
1061 
1062  self.remotemissileBda = undefined;
1063 }
‪init_ride_killstreak
‪function init_ride_killstreak(streak, always_allow=false)
Definition: _killstreaks.gsc:2237
‪CLIENT_FIELD_REMOTE_KILLSTREAK_STATIC
‪#define CLIENT_FIELD_REMOTE_KILLSTREAK_STATIC
Definition: clientfields.gsh:8
‪processScoreEvent
‪function processScoreEvent(event, player, victim, weapon)
Definition: scoreevents_shared.gsc:19
‪watch_missile_kill_z
‪function watch_missile_kill_z()
Definition: _remotemissile.gsc:306
‪setup_rockect_map_icon
‪function setup_rockect_map_icon()
Definition: _remotemissile.gsc:299
‪getBestSpawnPoint
‪function getBestSpawnPoint(remoteMissileSpawnPoints)
Definition: _remotemissile.gsc:110
‪activate
‪function activate()
Definition: traps_shared.gsc:655
‪REMOTE_MISSILE_BOMBLETS_NUMBER
‪#define REMOTE_MISSILE_BOMBLETS_NUMBER
Definition: _remotemissile.gsc:30
‪REMOTE_MISSILE_FRAMES_BETWEEN_TARGET_SCAN
‪#define REMOTE_MISSILE_FRAMES_BETWEEN_TARGET_SCAN
Definition: _remotemissile.gsc:31
‪fire_bomblet
‪function fire_bomblet(rocket, explosionRadius, target, waitFrames)
Definition: _remotemissile.gsc:967
‪REMOTE_MISSILE_ICON_SIZE
‪#define REMOTE_MISSILE_ICON_SIZE
Definition: _remotemissile.gsc:34
‪create_missile_hud
‪function create_missile_hud(rocket)
Definition: _remotemissile.gsc:706
‪missile_deploy_watch
‪function missile_deploy_watch(rocket)
Definition: _remotemissile.gsc:842
‪set_to_player
‪function set_to_player(str_field_name, n_value)
Definition: clientfield_shared.gsc:58
‪Rocket_CleanupOnDeath
‪function Rocket_CleanupOnDeath()
Definition: _remotemissile.gsc:489
‪remotemissile_bda_dialog
‪function remotemissile_bda_dialog()
Definition: _remotemissile.gsc:1030
‪REMOTE_MISSILE_FIRED
‪#define REMOTE_MISSILE_FIRED
Definition: _killstreaks.gsh:9
‪missile_deploy
‪function missile_deploy(rocket, hacked)
Definition: _remotemissile.gsc:867
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪staticEffect
‪function staticEffect(duration)
Definition: _remotemissile.gsc:460
‪play_killstreak_start_dialog
‪function play_killstreak_start_dialog(killstreakType, team, killstreakId)
Definition: _killstreaks.gsc:1905
‪cointoss
‪function cointoss()
Definition: math_shared.csc:171
‪VAL
‪#define VAL(__var, __default)
Definition: shared.gsh:272
‪missile_brake_timeout_watch
‪function missile_brake_timeout_watch()
Definition: _remotemissile.gsc:391
‪getValidTargets
‪function getValidTargets(rocket, trace, max_targets)
Definition: _remotemissile.gsc:579
‪REMOTE_MISSILE_NAME
‪#define REMOTE_MISSILE_NAME
Definition: _remotemissile.gsc:47
‪trace
‪function trace(from, to, target)
Definition: grapple.gsc:369
‪REMOTE_MISSILE_PLAYER_DETONATED
‪#define REMOTE_MISSILE_PLAYER_DETONATED
Definition: _killstreaks.gsh:10
‪addFlySwatterStat
‪function addFlySwatterStat(weapon, aircraft)
Definition: challenges_shared.gsc:86
‪ENEMY_VEHICLE_ACTIVE
‪#define ENEMY_VEHICLE_ACTIVE
Definition: _hacker_tool.gsh:2
‪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
‪_fire
‪function _fire(lifeId, player, team, killstreak_id)
Definition: _remotemissile.gsc:188
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪delay
‪function delay(time_or_notify, str_endon, func, arg1, arg2, arg3, arg4, arg5, arg6)
Definition: util_shared.csc:784
‪REMOTE_MISSILE_BRAKE_TIMEOUT
‪#define REMOTE_MISSILE_BRAKE_TIMEOUT
Definition: _remotemissile.gsc:33
‪remote_missile_game_end_think
‪function remote_missile_game_end_think(rocket, team, killstreak_id)
Definition: _remotemissile.gsc:74
‪cleanup_bombs
‪function cleanup_bombs(bomb)
Definition: _remotemissile.gsc:1002
‪REMOTE_MISSILE_BOMBLET_FIRED
‪#define REMOTE_MISSILE_BOMBLET_FIRED
Definition: _killstreaks.gsh:12
‪REMOTE_MISSILE_VISIONSET_ALIAS
‪#define REMOTE_MISSILE_VISIONSET_ALIAS
Definition: _killstreaks.gsh:340
‪drawLine
‪function drawLine(start, end, timeSlice, color)
Definition: _remotemissile.gsc:176
‪REMOTE_MISSILE_TARGETING_RADIUS
‪#define REMOTE_MISSILE_TARGETING_RADIUS
Definition: _remotemissile.gsc:29
‪setup_bomblet_map_icon
‪function setup_bomblet_map_icon()
Definition: _remotemissile.gsc:945
‪play_pilot_dialog
‪function play_pilot_dialog(dialogKey, killstreakType, killstreakId, pilotIndex)
Definition: _killstreaks.gsc:2024
‪isUsingRemote
‪function isUsingRemote()
Definition: util_shared.gsc:2705
‪IsEnemyPlayer
‪function IsEnemyPlayer(player)
Definition: util_shared.csc:1220
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪player_missile_end
‪function player_missile_end(rocket, performPlayerKillstreakEnd, unlink, team, killstreak_id)
Definition: _remotemissile.gsc:339
‪CLIENT_FIELD_OPERATING_PREDATOR
‪#define CLIENT_FIELD_OPERATING_PREDATOR
Definition: clientfields.gsh:6
‪destroyedAircraft
‪function destroyedAircraft(attacker, weapon, playerControlled)
Definition: challenges_shared.gsc:1405
‪set_team_kill_penalty_scale
‪function set_team_kill_penalty_scale(killstreakType, scale, isInventory)
Definition: _killstreaks.gsc:404
‪setup_bomblet
‪function setup_bomblet(bomb)
Definition: _remotemissile.gsc:953
‪end
‪function end(final)
Definition: _killcam.gsc:511
‪get_random_pilot_index
‪function get_random_pilot_index(killstreakType)
Definition: _killstreaks.gsc:2067
‪setUsingRemote
‪function setUsingRemote(remoteName, set_killstreak_delay_killcam=true)
Definition: _util.gsc:569
‪create_entity_enemy_influencer
‪function create_entity_enemy_influencer(name, team)
Definition: _spawning.gsc:310
‪is_killstreak_start_blocked
‪function is_killstreak_start_blocked()
Definition: _killstreaks.gsc:3205
‪fade_to_black_for_x_sec
‪function fade_to_black_for_x_sec(startwait, blackscreenwait, fadeintime, fadeouttime, shaderName)
Definition: hud_shared.gsc:250
‪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
‪killstreakTargetSet
‪function killstreakTargetSet(killstreakEntity, offset)
Definition: _killstreak_detect.gsc:29
‪missile_sound_impact
‪function missile_sound_impact(player, distance)
Definition: _remotemissile.gsc:541
‪tryUsePredatorMissile
‪function tryUsePredatorMissile(lifeId)
Definition: _remotemissile.gsc:85
‪remove_influencers
‪function remove_influencers()
Definition: _spawning.gsc:405
‪register_dialog
‪function register_dialog(killstreakType, informDialog, taacomDialogBundleKey, pilotDialogArrayKey, startDialogKey, enemyStartDialogKey, enemyStartMultipleDialogKey, hackedDialogKey, hackedStartDialogKey, requestDialogKey, threatDialogKey, isInventory)
Definition: _killstreaks.gsc:239
‪targeting_hud_think
‪function targeting_hud_think(rocket)
Definition: _remotemissile.gsc:777
‪init
‪function init()
Definition: _remotemissile.gsc:49
‪REMOTE_MISSILE_MAX_OTHER_TARGETS_HUD
‪#define REMOTE_MISSILE_MAX_OTHER_TARGETS_HUD
Definition: _remotemissile.gsc:28
‪fire_random_bomblet
‪function fire_random_bomblet(rocket, explosionRadius, quadrant, waitFrames)
Definition: _remotemissile.gsc:983
‪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
‪missile_sound_play
‪function missile_sound_play(player)
Definition: _remotemissile.gsc:498
‪register_info
‪function register_info(type, name, version, lerp_step_count)
Definition: visionset_mgr_shared.csc:334
‪sndWatchExplo
‪function sndWatchExplo()
Definition: _remotemissile.gsc:561
‪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
‪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
‪destroy
‪function destroy(watcher, owner)
Definition: _decoy.gsc:108
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪play_taacom_dialog
‪function play_taacom_dialog(dialogKey, killstreakType, killstreakId)
Definition: _globallogic_audio.gsc:274
‪bomblet_camera_waiter
‪function bomblet_camera_waiter(rocket)
Definition: _remotemissile.gsc:928
‪missile_sound_deploy_bomblets
‪function missile_sound_deploy_bomblets()
Definition: _remotemissile.gsc:574
‪enable_hacking
‪function enable_hacking(killstreakName, preHackFunction, postHackFunction)
Definition: _killstreak_hacking.gsc:22
‪bomblet_explostion_waiter
‪function bomblet_explostion_waiter(player)
Definition: _remotemissile.gsc:1016
‪destroy_missile_hud
‪function destroy_missile_hud()
Definition: _remotemissile.gsc:749
‪result
‪function result(death, attacker, mod, weapon)
Definition: _zm_aat_blast_furnace.gsc:46
‪ramp_in_out_thread_per_player
‪function ramp_in_out_thread_per_player(player, ramp_in, full_period, ramp_out)
Definition: visionset_mgr_shared.gsc:392
‪hackedHealthUpdate
‪function hackedHealthUpdate(hacker)
Definition: _remotemissile.gsc:288
‪missile_sound_boost
‪function missile_sound_boost(rocket)
Definition: _remotemissile.gsc:519
‪stopOndeath
‪function stopOndeath(snd)
Definition: _remotemissile.gsc:411
‪watch_missile_death
‪function watch_missile_death(rocket, team, killstreak_id)
Definition: _remotemissile.gsc:325
‪REMOTE_MISSILE_MAP_ICON_DELAY
‪#define REMOTE_MISSILE_MAP_ICON_DELAY
Definition: _remotemissile.gsc:32
‪HackedPostFunction
‪function HackedPostFunction(hacker)
Definition: _remotemissile.gsc:293
‪cleanupWaiter
‪function cleanupWaiter(rocket, team, killstreak_id)
Definition: _remotemissile.gsc:418
‪handleDamage
‪function handleDamage()
Definition: _remotemissile.gsc:429
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265