‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_remotemortar.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\damagefeedback_shared;
6 #using scripts\shared\gameobjects_shared;
7 #using scripts\shared\hostmigration_shared;
8 #using scripts\shared\hud_shared;
9 #using scripts\shared\math_shared;
10 #using scripts\shared\popups_shared;
11 #using scripts\shared\scoreevents_shared;
12 #using scripts\shared\util_shared;
13 #using scripts\shared\weapons\_heatseekingmissile;
14 #using scripts\shared\weapons\_weapon_utils;
15 #using scripts\shared\weapons\_weaponobjects;
16 
17 #using scripts\mp\_challenges;
18 #using scripts\mp\_util;
19 #using scripts\mp\gametypes\_hostmigration;
20 #using scripts\mp\gametypes\_spawning;
21 #using scripts\mp\killstreaks\_airsupport;
22 #using scripts\mp\killstreaks\_helicopter;
23 #using scripts\mp\killstreaks\_killstreakrules;
24 #using scripts\mp\killstreaks\_killstreaks;
25 #using scripts\mp\killstreaks\_uav;
26 
27 #insert scripts\mp\_hacker_tool.gsh;
28 #insert scripts\shared\clientfields.gsh;
29 #insert scripts\shared\shared.gsh;
30 
31 #precache( "material", "compass_lodestar" );
32 #precache( "string", "KILLSTREAK_EARNED_REMOTE_MORTAR" );
33 #precache( "string", "KILLSTREAK_REMOTE_MORTAR_NOT_AVAILABLE" );
34 #precache( "string", "KILLSTREAK_REMOTE_MORTAR_NOT_USABLE" );
35 #precache( "string", "KILLSTREAK_REMOTE_MORTAR_INBOUND" );
36 #precache( "string", "KILLSTREAK_REMOTE_MORTAR_HACKED" );
37 #precache( "eventstring", "remotemortar" );
38 #precache( "eventstring", "mpl_killstreak_planemortar" );
39 #precache( "fx", "killstreaks/fx_lstar_laser_loop" );
40 #precache( "fx", "killstreaks/fx_lstar_exp" );
41 
42 #namespace remotemortar;
43 
44 function ‪init()
45 {
46  level.remote_mortar_fx["laserTarget"] = "killstreaks/fx_lstar_laser_loop";
47  level.remote_mortar_fx["missileExplode"] = "killstreaks/fx_lstar_exp" ;
48 
49  ‪killstreaks::register( "remote_mortar", "remote_mortar", "killstreak_remote_mortar", "remote_mortar_used",&‪remote_mortar_killstreak, true );
50  ‪killstreaks::register_alt_weapon( "remote_mortar", "remote_mortar_missile" );
51  ‪killstreaks::register_strings( "remote_mortar", &"KILLSTREAK_EARNED_REMOTE_MORTAR", &"KILLSTREAK_REMOTE_MORTAR_NOT_AVAILABLE", &"KILLSTREAK_REMOTE_MORTAR_INBOUND", &"KILLSTREAK_REMOTE_MORTAR_HACKED" );
52  ‪killstreaks::register_dialog( "remote_mortar", "mpl_killstreak_planemortar", "kls_reaper_used", "", "kls_reaper_enemy", "", "kls_reaper_ready" );
53  ‪killstreaks::set_team_kill_penalty_scale( "remote_mortar", level.teamKillReducedPenalty );
55 
56  ‪util::set_dvar_float_if_unset( "scr_remote_mortar_lifetime", 45.0 );
57 
58  level.remore_mortar_infrared_vision = "remote_mortar_infrared";
59  level.remore_mortar_enhanced_vision = "remote_mortar_enhanced";
60 
61  minimapOrigins = getEntArray( "minimap_corner", "targetname" );
62  if ( miniMapOrigins.size )
63  uavOrigin = ‪math::find_box_center( miniMapOrigins[0].origin, miniMapOrigins[1].origin );
64  else
65  uavOrigin = (0,0,0);
66 
67  if( level.script == "mp_la" )
68  uavOrigin = uavOrigin + ( 1200, 0, 0 );
69  if( level.script == "mp_hydro" )
70  uavOrigin = uavOrigin + ( 0, 2000, 0 );
71  if( level.script == "mp_concert" )
72  uavOrigin = uavOrigin + ( 0, -750, 0 );
73  if( level.script == "mp_vertigo" )
74  uavOrigin = uavOrigin + ( -500, 0, 0 );
75 
76  level.remoteMortarRig = ‪spawn( "script_model", uavOrigin );
77  level.remoteMortarRig setModel( "tag_origin" );
78  level.remoteMortarRig.angles = (0,115,0);
79  level.remoteMortarRig hide();
80 
81  level.remoteMortarRig thread ‪rotateRig(true);
82 
83  level.remote_zOffset = 8000;
84  level.remote_radiusOffset = 9000;
85  remote_mortar_height = ‪struct::get( "remote_mortar_height", "targetname");
86  if ( isdefined(remote_mortar_height) )
87  {
88  level.remote_radiusOffset = (remote_mortar_height.origin[2]/level.remote_zOffset) * level.remote_radiusOffset;
89  level.remote_zOffset = remote_mortar_height.origin[2];
90  }
91 }
92 
93 function ‪remote_mortar_killstreak( hardpointType )
94 {
95  if ( self ‪killstreakrules::isKillstreakAllowed( hardpointType, self.team ) == false )
96  return false;
97 
98  if (!self IsOnGround() || self ‪util::isUsingRemote() )
99  {
100  self iPrintLnBold( &"KILLSTREAK_REMOTE_MORTAR_NOT_USABLE" );
101  return false;
102  }
103 
104  self ‪util::setUsingRemote( hardpointType );
105  self ‪util::freeze_player_controls( true );
106  self DisableWeaponCycling();
107 
108  ‪result = self ‪killstreaks::init_ride_killstreak( "qrdrone" );
109 
110  if ( ‪result != "success" )
111  {
112  if ( ‪result != "disconnect" )
113  {
114  self notify( "remote_mortar_unlock" );
116  self EnableWeaponCycling();
117  }
118 
119  return false;
120  }
121 
122  killstreak_id = self ‪killstreakrules::killstreakStart (hardpointType, self.team, false, true );
123  if ( killstreak_id == -1 )
124  {
126  self EnableWeaponCycling();
127  self notify( "remote_mortar_unlock" );
128  return false;
129  }
130 
131  self ‪killstreaks::set_killstreak_delay_killcam( hardpointType );
132 
133  remote = self ‪remote_mortar_spawn();
134  remote SetDrawInfrared( true );
135  remote thread ‪remote_killstreak_abort();
136  remote thread ‪remote_killstreak_game_end();
137  remote thread ‪remote_owner_exit();
138  remote thread ‪remote_owner_teamKillKicked();
139  remote thread ‪remote_damage_think();
140  remote thread ‪play_lockon_sounds( self );
141  //remote thread heatseekingmissile::MissileTarget_LockOnMonitor( self, "remote_end" ); // monitors missle lock-ons
143  remote.killstreak_id = killstreak_id;
144 
145  remote thread ‪play_remote_fx();
146 
147  remote playloopsound( "mpl_ks_reaper_exterior_loop", 1 );
148 
149  self.pilotTalking = false;
150  remote.copilotVoiceNumber = self.bcVoiceNumber;
151  remote.pilotVoiceNumber = self.bcVoiceNumber + 1;
152  if (remote.pilotVoiceNumber > 3)
153  {
154  remote.pilotVoiceNumber = 0;
155  }
156 
157  self ‪util::clientNotify( "krms" );
158 
159  self ‪player_linkto_remote( remote );
160 
161  self ‪util::freeze_player_controls( false );
162 
163  self thread ‪player_aim_think( remote );
164  self thread ‪player_fire_think( remote );
165  //self thread create_remote_mortar_hud( remote );
166  self ‪killstreaks::play_killstreak_start_dialog( "remote_mortar", self.pers["team"], killstreak_id );
167  remote thread ‪remote_killstreak_copilot(remote.copilotVoiceNumber);
168 
169  self AddWeaponStat( GetWeapon( "remote_mortar" ), "used", 1 );
170 
171 
172  self thread ‪visionSwitch();
173 
174  level waittill( "remote_unlinked" );
175 
176  if ( isdefined( remote ) )
177  remote stoploopsound( 4 );
178 
179  if ( !isdefined( self ) )
180  return true;
181 
182  self ‪util::clientNotify( "krme" );
183 
185  self ‪util::clientNotify( "nofutz" );
187 
188  return true;
189 }
191 {
192  level endon( "remote_end" );
193 
194  wait 2.5;
195 
196  while (1)
197  {
198  self thread ‪helicopter::PlayPilotDialog( "reaper_used", 0, voice );
199  wait RandomFloatRange (4.5, 15);
200  }
201 }
203 {
204  level endon( "remote_end" );
205  assert( isdefined( self.owner ) );
206  assert( IsPlayer( self.owner ) );
207 
208  self.owner ‪util::waittill_any( "disconnect", "joined_team", "joined_spectators" );
209 
210  self thread ‪remote_killstreak_end( false, true );
211 }
212 
213 function ‪remote_owner_teamKillKicked( hardpointtype )
214 {
215  level endon( "remote_end" );
216 
217  self.owner waittill( "teamKillKicked" );
218  self thread ‪remote_killstreak_end();
219 }
220 
222 {
223  level endon( "remote_end" );
224 
225  wait( 1 );
226 
227  while( true )
228  {
229  timeUsed = 0;
230  while( self.owner UseButtonPressed() )
231  {
232  timeUsed += 0.05;
233  if ( timeUsed > 0.25 )
234  {
235  self thread ‪remote_killstreak_end();
236  return;
237  }
239  }
241  }
242 }
243 
245 {
246  level endon( "remote_end" );
247  assert( isdefined( self.owner ) );
248  assert( IsPlayer( self.owner ) );
249 
250  level waittill( "game_ended" );
251  self thread ‪remote_killstreak_end();
252 }
253 
255 {
257  self ‪util::clientNotify( "reapfutz" );
258 
259  remote = SpawnPlane( self, "script_model", level.remoteMortarRig GetTagOrigin( "tag_origin" ) );
260  assert( isdefined( remote ) );
261 
262  remote SetModel( "veh_t6_drone_pegasus_mp" );
263  remote.targetname = "remote_mortar";
264 
265  remote SetOwner( self );
266  remote SetTeam( self.team );
267  remote.team = self.team;
268  remote.owner = self;
269  remote.numFlares = 2;
270  remote.flareOffset = (0,0,-256);
271  remote ‪clientfield::set( "enemyvehicle", ‪ENEMY_VEHICLE_ACTIVE );
272  remote.attackers = [];
273  remote.attackerData = [];
274  remote.attackerDamage = [];
275  remote.flareAttackerDamage = [];
276 
277  remote.pilotVoiceNumber = self.bcVoiceNumber + 1;
278  if (remote.pilotVoiceNumber > 3)
279  {
280  remote.pilotVoiceNumber = 0;
281  }
282 
283  // same height and radius as the AC130 with random angle and counter rotation
284  angle = randomInt( 360 );
285  xOffset = cos( angle ) * level.remote_radiusOffset;
286  yOffset = sin( angle ) * level.remote_radiusOffset;
287  angleVector = vectorNormalize( (xOffset,yOffset,level.remote_zOffset) );
288  angleVector = ( angleVector * 6100 );
289  remote LinkTo( level.remoteMortarRig, "tag_origin", angleVector, (0,angle-90,0) );
290 
291  remoteObjIDFriendly = ‪gameobjects::get_next_obj_id();
292  objective_add( remoteObjIDFriendly, "invisible", remote.origin, &"remotemortar", self );
293  objective_state( remoteObjIDFriendly, "active" );
294  Objective_OnEntity( remoteObjIDFriendly, remote );
295  objective_team( remoteObjIDFriendly, self.team );
296  self.remoteObjIDFriendly = remoteObjIDFriendly;
297 
298  // laser fx
299 // remote.fx = spawnFx( level.remote_mortar_fx["laserTarget"], (0,0,0) );
300  remote.fx = ‪spawn( "script_model", (0,0,0) );
301  remote.fx SetModel( "tag_origin" );
302 
303  // the owner is going to have this fx created and updated
304  remote.fx SetInvisibleToPlayer( remote.owner, true );
305 
306  // visibility
308 
309  Target_SetTurretAquire( remote, true );
310 
311  return remote;
312 }
313 
314 function ‪rotateRig( clockwise )
315 {
316  turn = 360;
317  if ( clockwise )
318  turn = -360;
319 
320  for (;;)
321  {
322  if ( !clockwise )
323  {
324  self rotateyaw( turn, 30 );
325  wait ( 30 );
326  }
327  else
328  {
329  self rotateyaw( turn, 45 );
330  wait ( 45 );
331  }
332  }
333 }
334 
336 {
337  players = GetPlayers();
338 
339  foreach( player in players )
340  {
341  if ( player == self.owner )
342  {
343  self SetInvisibleToPlayer( player );
344  continue;
345  }
346 
347  self SetVisibleToPlayer( player );
348  }
349 }
350 
351 function ‪play_lockon_sounds( player )
352 {
353  player endon("disconnect");
354  self endon( "death" );
355  self endon("remote_end");
356 
357  self.lockSounds = ‪spawn( "script_model", self.origin);
358  wait ( 0.1 );
359  self.lockSounds LinkTo( self, "tag_player" );
360 
361  while ( true )
362  {
363  self waittill( "locking on" );
364 
365  while ( true )
366  {
367  if ( ‪enemy_locking() )
368  {
369  //self PlaySoundToPlayer( "uin_alert_lockon_start", player );
370  //wait ( 0.3 );
371 
372  self PlaySoundToPlayer( "uin_alert_lockon", player );
373  wait ( 0.125 );
374  }
375 
376  if ( ‪enemy_locked() )
377  {
378  self PlaySoundToPlayer( "uin_alert_lockon", player );
379  wait ( 0.125 );
380  }
381 
382  if ( !‪enemy_locking() && !‪enemy_locked() )
383  {
384  break;
385  }
386  }
387  }
388 }
389 
391 {
392  if ( isdefined(self.locking_on) && self.locking_on )
393  return true;
394 
395  return false;
396 }
397 
398 function ‪enemy_locked()
399 {
400  if ( isdefined(self.locked_on) && self.locked_on )
401  return true;
402 
403  return false;
404 }
405 
406 function ‪create_remote_mortar_hud( remote )
407 {
408  self.missile_hud = newclienthudelem( self );
409  self.missile_hud.alignX = "left";
410  self.missile_hud.alignY = "bottom";
411  self.missile_hud.horzAlign = "user_left";
412  self.missile_hud.vertAlign = "user_bottom";
413  self.missile_hud.font = "small";
414  self.missile_hud SetText("[{+attack}]" + "Fire Missile");
415  self.missile_hud.hidewheninmenu = true;
416  self.missile_hud.hideWhenInDemo = true;
417  self.missile_hud.x = 5;
418  self.missile_hud.y = -40;
419  self.missile_hud.fontscale = 1.25;
420 
421  self.zoom_hud = newclienthudelem( self );
422  self.zoom_hud.alignX = "left";
423  self.zoom_hud.alignY = "bottom";
424  self.zoom_hud.horzAlign = "user_left";
425  self.zoom_hud.vertAlign = "user_bottom";
426  self.zoom_hud.font = "small";
427  self.zoom_hud SetText(&"KILLSTREAK_INCREASE_ZOOM");
428  self.zoom_hud.hidewheninmenu = true;
429  self.zoom_hud.hideWhenInDemo = true;
430  self.zoom_hud.x = 5;
431  self.zoom_hud.y = -25;
432  self.zoom_hud.fontscale = 1.25;
433 
434  self.hud_prompt_exit = newclienthudelem( self );
435  self.hud_prompt_exit.alignX = "left";
436  self.hud_prompt_exit.alignY = "bottom";
437  self.hud_prompt_exit.horzAlign = "user_left";
438  self.hud_prompt_exit.vertAlign = "user_bottom";
439  self.hud_prompt_exit.font = "small";
440  self.hud_prompt_exit.fontScale = 1.25;
441  self.hud_prompt_exit.hidewheninmenu = true;
442  self.hud_prompt_exit.hideWhenInDemo = true;
443  self.hud_prompt_exit.archived = false;
444  self.hud_prompt_exit.x = 5;
445  self.hud_prompt_exit.y = -10;
446  self.hud_prompt_exit SetText(level.remoteExitHint);
447 
448  self thread ‪fade_out_hint_hud( remote );
449 }
450 
451 function ‪fade_out_hint_hud( remote )
452 {
453  self endon( "disconnect" );
454  remote endon( "death" );
455 
456  wait( 8 );
457  time = 0;
458  while (time < 2)
459  {
460  if ( !isdefined(self.missile_hud))
461  {
462  return;
463  }
464  self.missile_hud.alpha -= 0.025;
465  self.zoom_hud.alpha -= 0.025;
466  time += 0.05;
468  }
469 
470  self.missile_hud.alpha = 0;
471  self.zoom_hud.alpha = 0;
472 }
473 
474 function ‪remove_hud()
475 {
476  if ( isdefined(self.missile_hud) )
477  self.missile_hud ‪destroy();
478  if ( isdefined(self.zoom_hud) )
479  self.zoom_hud ‪destroy();
480  if ( isdefined(self.hud_prompt_exit) )
481  self.hud_prompt_exit ‪destroy();
482 }
483 
484 
485 function ‪remote_killstreak_end( ‪explode, disconnected )
486 {
487  level notify( "remote_end" );
488 
489  if ( !isdefined( ‪explode ) )
490  ‪explode = false;
491 
492  if ( !isdefined( disconnected ) )
493  disconnected = false;
494 
495  if ( isdefined( self.owner ) )
496  {
497  if ( disconnected == false )
498  {
499  if ( ‪explode )
500  {
501  self.owner SendKillstreakDamageEvent( 600 );
502  self.owner thread ‪hud::fade_to_black_for_x_sec( 0.5, 0.5, 0.1, 0.25 );
503  wait 1;
504  }
505  else
506  {
507  self.owner SendKillstreakDamageEvent( 600 );
508  self.owner thread ‪hud::fade_to_black_for_x_sec( 0, 0.25, 0.1, 0.25 );
509  wait 0.25;
510  }
511  }
512  self.owner Unlink();
514 
515  self.owner EnableWeaponCycling();
516  self.owner ‪remove_hud();
517 
518  if ( isdefined(level.gameEnded) && level.gameEnded )
519  {
520  self.owner ‪util::freeze_player_controls( true );
521  }
522  }
523 
524  if ( isdefined( self.influencers ) )
525  {
527  }
528  Objective_Delete( self.owner.remoteObjIDFriendly );
529  ‪gameobjects::release_obj_id( self.owner.remoteObjIDFriendly );
530 
531  Target_SetTurretAquire( self, false );
532 
533  level notify( "remote_unlinked" );
534 
535  ‪killstreakrules::killstreakStop( "remote_mortar", self.team, self.killstreak_id );
536 
537  if ( isdefined( self.owner ) )
538  {
539  self.owner SetInfraredVision( false );
540  self.owner UseServerVisionset( false );
541  }
542 
543  if ( isdefined(self.fx) )
544  self.fx delete();
545 
546  if ( ‪explode )
547  self ‪remote_explode();
548  else
549  self ‪remote_leave();
550 }
551 
552 function ‪player_linkto_remote( remote )
553 {
554  leftArc = 40;
555  rightArc = 40;
556  upArc = 25;
557  downArc = 65;
558 
559  if ( isdefined( level.remoteMotarViewLeft ) )
560  {
561  leftArc = level.remoteMotarViewLeft;
562  }
563 
564  if ( isdefined( level.remoteMotarViewRight ) )
565  {
566  rightArc = level.remoteMotarViewRight;
567  }
568 
569  if ( isdefined( level.remoteMotarViewUp ) )
570  {
571  upArc = level.remoteMotarViewUp;
572  }
573 
574  if ( isdefined( level.remoteMotarViewDown ) )
575  {
576  downArc = level.remoteMotarViewDown;
577  }
578 
579 /#
580  leftArc = GetDvarInt( "scr_remotemortar_right", leftArc );
581  rightArc = GetDvarInt( "scr_remotemortar_left", rightArc );
582  upArc = GetDvarInt( "scr_remotemortar_up", upArc );
583  downArc = GetDvarInt( "scr_remotemortar_down", downArc );
584 #/
585  self PlayerLinkWeaponViewToDelta( remote, "tag_player", 1.0, leftArc, rightArc, upArc, downArc );
586  self ‪player_center_view();
587 }
588 
589 function ‪player_center_view( org )
590 {
592 
593  lookVec = VectorToAngles( level.UAVRig.origin - self GetEye() );
594  self SetPlayerAngles( lookVec );
595 }
596 
597 function ‪player_aim_think( remote )
598 {
599  level endon( "remote_end" );
600 
601  wait( 0.25 );
602 
603  PlayFxOnTag( level.remote_mortar_fx[ "laserTarget" ], remote.fx, "tag_origin" );
604  remote.fx playloopsound( "mpl_ks_reaper_laser" );
605 
606  while ( true )
607  {
608  origin = self GetEye();
609  forward = AnglesToForward( self GetPlayerAngles() );
610  endpoint = origin + forward * 15000;
611 
612  ‪trace = BulletTrace( origin, endpoint, false, remote );
613  remote.fx.origin = ‪trace[ "position" ];
614  remote.fx.angles = VectortoAngles(‪trace[ "normal" ]);
615 
617 
618  if ( isdefined( self.active_pegasus ) )
619  {
620  self ‪spawning::create_enemy_influencer( "pegasus", ‪trace[ "position" ], self.team );
621  }
622 
624  }
625 }
626 
627 function ‪player_fire_think( remote )
628 {
629  level endon( "remote_end" );
630 
631  end_time = GetTime() + ( GetDvarFloat( "scr_remote_mortar_lifetime" ) * 1000 );
632 
633  shot = 0;
634 
635  while( GetTime() < end_time )
636  {
637  self.active_pegasus = undefined;
638 
639  if ( !self AttackButtonPressed() )
640  {
642  continue;
643  }
644 
645  self playLocalSound( "mpl_ks_reaper_fire" );
646  self PlayRumbleOnEntity( "sniper_fire" );
647 
648  if (shot % 3 == 1)
649  {
650  if ( isdefined(remote.owner) && isdefined(remote.owner.pilotTalking) && remote.owner.pilotTalking )
651  shot = 0;
652  remote thread ‪helicopter::PlayPilotDialog( "reaper_fire", 0.25, undefined, false );
653  }
654  shot = ( shot + 1 ) % 3;
655 
656  origin = self GetEye();
657  Earthquake( 0.3, 0.5, origin, 256 );
658 
659  angles = self GetPlayerAngles();
660  forward = AnglesToForward( angles );
661  right = AnglesToRight( angles );
662  up = AnglesToUp( angles );
663 
664  offset = origin + ( forward * 100 ) + ( right * -40 ) + ( up * -100 );
665 
666  missile = MagicBullet( GetWeapon( "remote_mortar_missile" ), offset, origin + ( forward * 1000 ) + ( up * -100 ), self, remote.fx );
667 
668  self.active_pegasus = missile;
669 
670  missile thread ‪remote_missile_life(remote);
671 
672  missile waittill( "death" );
673 
674  self playlocalsound( "mpl_ks_reaper_explosion" );
675  }
676 
678 
679  remote thread ‪remote_killstreak_end();
680 }
681 
682 function ‪remote_missile_life( remote )
683 {
684  self endon( "death" );
685 
687 
688  playFX( level.remote_mortar_fx["missileExplode"], self.origin );
689  self delete();
690 }
691 
693 {
694  level endon( "remote_end" );
695 
696  self.health = 999999; // keep it from dying anywhere in code
697  maxHealth = level.heli_amored_maxhealth;
698  damageTaken = 0;
699  self.lowHealth = false;
700 
701  self SetCanDamage( true );
702  Target_Set( self, ( 0, 0, 30 ) );
703 
704  while( true )
705  {
706  self waittill( "damage", ‪damage, attacker, direction_vec, point, meansOfDeath, tagName, modelName, partname, weapon );
707  self.health = 999999;
708 
709  heli_friendlyfire = ‪weaponobjects::friendlyFireCheck( self.owner, attacker );
710 
711  // skip damage if friendlyfire is disabled
712  if( !heli_friendlyfire )
713  continue;
714 
715  if( IsPlayer( attacker ) )
716  {
717  attacker ‪damagefeedback::update( meansOfDeath, undefined, undefined, weapon );
718 
719  if ( attacker HasPerk( "specialty_armorpiercing" ) )
720  {
721  if( meansOfDeath == "MOD_RIFLE_BULLET" || meansOfDeath == "MOD_PISTOL_BULLET" )
722  {
723  ‪damage += int( ‪damage * level.cac_armorpiercing_data );
724  }
725  }
726  }
727 
728  if( meansOfDeath == "MOD_RIFLE_BULLET" || meansOfDeath == "MOD_PISTOL_BULLET" )
729  {
730  ‪damage *= level.heli_armor_bulletdamage;
731  }
732 
733  if( weapon == level.weaponNone )
734  {
735  continue;
736  }
737 
738  if ( isdefined( weapon.isLauncherWeapon ) && weapon.isLauncherWeapon )
739  {
740  ‪damage = maxHealth + 1;
741  }
742 
743  if ( ‪damage <= 0 )
744  {
745  continue;
746  }
747 
748  self.owner PlayLocalSound( "reaper_damaged" );
749 
750  self.owner SendKillstreakDamageEvent( int(‪damage) );
751 
752  damageTaken += ‪damage;
753  if ( damageTaken >= maxHealth )
754  {
755 
756  if ( self.owner ‪util::IsEnemyPlayer( attacker ) )
757  {
758  attacker ‪challenges::addFlySwatterStat( weapon, self );
759  attacker AddWeaponStat( weapon, "destroyed_controlled_killstreak", 1 );
761  }
762  else
763  {
764  //Destroyed Friendly Killstreak
765  }
766 
767  level thread ‪popups::DisplayTeamMessageToAll( &"KILLSTREAK_DESTROYED_REMOTE_MORTAR", attacker );
768 
769  self thread ‪remote_killstreak_end(true);
770  return;
771  }
772  else if(!self.lowHealth && damageTaken >= maxHealth / 2)
773  {
774  PlayFXOnTag( level.fx_u2_damage_trail, self, "tag_origin" );
775  self.lowHealth = true;
776  }
777  }
778 }
779 
780 function ‪remote_leave()
781 {
782  level endon( "game_ended" );
783  self endon( "death" );
784 
785 // self notify( "remote_done" );
786 
787  self unlink();
788 
789  tries = 10;
790  yaw = 0;
791  while (tries > 0)
792  {
793  exitVector = ( anglestoforward( self.angles + (0, yaw, 0)) * 20000 );
794 
795  exitPoint = ( self.origin[0] + exitVector[0], self.origin[1] + exitVector[1], self.origin[2] - 2500);
796  exitPoint = self.origin + exitVector;
797 
798  nfz = ‪airsupport::crossesNoFlyZone (self.origin, exitPoint);
799  if( isdefined(nfz) )
800  {
801  if ( tries % 2 == 1 && tries != 1)
802  {
803  yaw = yaw * -1;
804  }
805  else if ( tries != 1 )
806  {
807  yaw = yaw + 10;
808  yaw = yaw * -1;
809  }
810  tries--;
811  }
812  else
813  {
814  tries = 0;
815  }
816  }
817 
818  self thread airsupport::flattenYaw( self.angles[1] + yaw );
819 
820  self moveTo( exitPoint, 8, 4 );
821  if (self.lowHealth)
822  {
823  PlayFXOnTag( level.chopper_fx["damage"]["heavy_smoke"], self, "tag_origin" );
824  }
825  self thread ‪play_afterburner_fx();
827 
828  self delete();
829 }
830 
832 {
833  self.exhaustFX = ‪spawn( "script_model", self.origin );
834  self.exhaustFX SetModel( "tag_origin" );
835  self.exhaustFX LinkTo( self, "tag_turret", (0,0,25) );
836  wait( 0.1 );
837  PlayFXOnTag( level.fx_cuav_burner, self.exhaustFX, "tag_origin" );
838 }
839 
841 {
842  if ( !isdefined( self.exhaustFX ) )
843  {
844  self.exhaustFX = ‪spawn( "script_model", self.origin );
845  self.exhaustFX SetModel( "tag_origin" );
846  self.exhaustFX LinkTo( self, "tag_turret", (0,0,25) );
847  }
848  self endon( "death" );
849  wait( 0.1 );
850  PlayFXOnTag( level.fx_cuav_afterburner, self.exhaustFX, "tag_origin" );
851 }
852 
854 {
855  self notify( "death" );
856  self Hide();
857  forward = ( AnglesToForward( self.angles ) * 200 );
858  playFx ( level.fx_u2_explode, self.origin, forward );
859  self playsound ( "evt_helicopter_midair_exp" );
860  wait(0.2);
861  self notify( "delete" );
862  self delete();
863 }
864 
865 function ‪visionSwitch()
866 {
867  self endon( "disconnect" );
868  level endon( "remote_end" );
869 
870  inverted = true;
871 
872  self SetInfraredVision( true );
873  self UseServerVisionset( true );
874  self SetVisionSetForPlayer( level.remore_mortar_infrared_vision, 1 );
875 
876  for (;;)
877  {
878  if ( self ChangeSeatButtonPressed() )
879  {
880  if ( !inverted )
881  {
882  self SetInfraredVision( true );
883  self SetVisionSetForPlayer( level.remore_mortar_infrared_vision, 0.5 );
884  self PlayLocalSound ("mpl_ks_reaper_view_select");
885  }
886  else
887  {
888  self SetInfraredVision( false );
889  self SetVisionSetForPlayer( level.remore_mortar_enhanced_vision, 0.5 );
890  self PlayLocalSound ("mpl_ks_reaper_view_select");
891  }
892 
893  inverted = !inverted;
894 
895  // wait for the button to release:
896  while ( self ChangeSeatButtonPressed() )
898  }
900  }
901 }
‪init_ride_killstreak
‪function init_ride_killstreak(streak, always_allow=false)
Definition: _killstreaks.gsc:2237
‪remote_killstreak_game_end
‪function remote_killstreak_game_end()
Definition: _remotemortar.gsc:244
‪create_enemy_influencer
‪function create_enemy_influencer(name, origin, team)
Definition: _spawning.gsc:285
‪remote_explode
‪function remote_explode()
Definition: _remotemortar.gsc:853
‪find_box_center
‪function find_box_center(mins, maxs)
Definition: math_shared.gsc:86
‪MissileTarget_ProximityDetonateIncomingMissile
‪function MissileTarget_ProximityDetonateIncomingMissile(endon1, endon2, allowDirectDamage)
Definition: _heatseekingmissile.gsc:1085
‪play_killstreak_start_dialog
‪function play_killstreak_start_dialog(killstreakType, team, killstreakId)
Definition: _killstreaks.gsc:1905
‪trace
‪function trace(from, to, target)
Definition: grapple.gsc:369
‪player_aim_think
‪function player_aim_think(remote)
Definition: _remotemortar.gsc:597
‪waitLongDurationWithHostMigrationPause
‪function waitLongDurationWithHostMigrationPause(duration)
Definition: hostmigration_shared.gsc:216
‪addFlySwatterStat
‪function addFlySwatterStat(weapon, aircraft)
Definition: challenges_shared.gsc:86
‪ENEMY_VEHICLE_ACTIVE
‪#define ENEMY_VEHICLE_ACTIVE
Definition: _hacker_tool.gsh:2
‪destroyedPlayerControlledAircraft
‪function destroyedPlayerControlledAircraft()
Definition: challenges_shared.gsc:1397
‪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
‪remote_killstreak_copilot
‪function remote_killstreak_copilot(voice)
Definition: _remotemortar.gsc:190
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪play_remote_fx
‪function play_remote_fx()
Definition: _remotemortar.gsc:831
‪PlayPilotDialog
‪function PlayPilotDialog(dialog, time, voice, shouldWait)
Definition: _helicopter.gsc:3012
‪reset_killstreak_delay_killcam
‪function reset_killstreak_delay_killcam()
Definition: _killstreaks.gsc:2451
‪CLIENT_FIELD_OPERATING_REAPER
‪#define CLIENT_FIELD_OPERATING_REAPER
Definition: clientfields.gsh:5
‪fade_out_hint_hud
‪function fade_out_hint_hud(remote)
Definition: _remotemortar.gsc:451
‪remote_mortar_killstreak
‪function remote_mortar_killstreak(hardpointType)
Definition: _remotemortar.gsc:93
‪get_next_obj_id
‪function get_next_obj_id()
Definition: gameobjects_shared.gsc:4132
‪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
‪set_killstreak_delay_killcam
‪function set_killstreak_delay_killcam(killstreak_name)
Definition: _killstreaks.gsc:2446
‪release_obj_id
‪function release_obj_id(objID)
Definition: gameobjects_shared.gsc:4166
‪enemy_locking
‪function enemy_locking()
Definition: _remotemortar.gsc:390
‪player_center_view
‪function player_center_view(org)
Definition: _remotemortar.gsc:589
‪visionSwitch
‪function visionSwitch()
Definition: _remotemortar.gsc:865
‪explode
‪function explode()
Definition: _straferun.gsc:705
‪isKillstreakAllowed
‪function isKillstreakAllowed(hardpointType, team)
Definition: _killstreakrules.gsc:352
‪set_team_kill_penalty_scale
‪function set_team_kill_penalty_scale(killstreakType, scale, isInventory)
Definition: _killstreaks.gsc:404
‪setUsingRemote
‪function setUsingRemote(remoteName, set_killstreak_delay_killcam=true)
Definition: _util.gsc:569
‪remote_killstreak_abort
‪function remote_killstreak_abort()
Definition: _remotemortar.gsc:202
‪DisplayTeamMessageToAll
‪function DisplayTeamMessageToAll(message, player)
Definition: popups_shared.gsc:122
‪remote_leave
‪function remote_leave()
Definition: _remotemortar.gsc:780
‪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
‪rotateRig
‪function rotateRig(clockwise)
Definition: _remotemortar.gsc:314
‪set_dvar_float_if_unset
‪function set_dvar_float_if_unset(dvar, value, reset)
Definition: _util.gsc:437
‪remote_killstreak_end
‪function remote_killstreak_end(explode, disconnected)
Definition: _remotemortar.gsc:485
‪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
‪create_remote_mortar_hud
‪function create_remote_mortar_hud(remote)
Definition: _remotemortar.gsc:406
‪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
‪init
‪function init()
Definition: _remotemortar.gsc:44
‪play_lockon_sounds
‪function play_lockon_sounds(player)
Definition: _remotemortar.gsc:351
‪remote_mortar_visibility
‪function remote_mortar_visibility()
Definition: _remotemortar.gsc:335
‪remote_mortar_spawn
‪function remote_mortar_spawn()
Definition: _remotemortar.gsc:254
‪killstreakStart
‪function killstreakStart(hardpointType, team, hacked, displayTeamMessage)
Definition: _killstreakrules.gsc:184
‪clientNotify
‪function clientNotify(event)
Definition: util_shared.gsc:1416
‪crossesNoFlyZone
‪function crossesNoFlyZone(start, end)
Definition: _airsupport.gsc:391
‪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
‪remote_missile_life
‪function remote_missile_life(remote)
Definition: _remotemortar.gsc:682
‪player_linkto_remote
‪function player_linkto_remote(remote)
Definition: _remotemortar.gsc:552
‪register_alt_weapon
‪function register_alt_weapon(killstreakType, weaponName, isInventory)
Definition: _killstreaks.gsc:318
‪update
‪function update()
Definition: _serversettings.gsc:71
‪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
‪remote_owner_teamKillKicked
‪function remote_owner_teamKillKicked(hardpointtype)
Definition: _remotemortar.gsc:213
‪result
‪function result(death, attacker, mod, weapon)
Definition: _zm_aat_blast_furnace.gsc:46
‪play_afterburner_fx
‪function play_afterburner_fx()
Definition: _remotemortar.gsc:840
‪remote_damage_think
‪function remote_damage_think()
Definition: _remotemortar.gsc:692
‪friendlyFireCheck
‪function friendlyFireCheck(owner, attacker, forcedFriendlyFireRule)
Definition: _weaponobjects.gsc:2733
‪enemy_locked
‪function enemy_locked()
Definition: _remotemortar.gsc:398
‪remote_owner_exit
‪function remote_owner_exit()
Definition: _remotemortar.gsc:221
‪player_fire_think
‪function player_fire_think(remote)
Definition: _remotemortar.gsc:627
‪remove_hud
‪function remove_hud()
Definition: _remotemortar.gsc:474
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265