‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_rcbomb.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\_oob;
4 #using scripts\shared\array_shared;
5 #using scripts\shared\audio_shared;
6 #using scripts\shared\challenges_shared;
7 #using scripts\shared\clientfield_shared;
8 #using scripts\shared\hostmigration_shared;
9 #using scripts\shared\hud_shared;
10 #using scripts\shared\killstreaks_shared;
11 #using scripts\shared\popups_shared;
12 #using scripts\shared\scoreevents_shared;
13 #using scripts\shared\tweakables_shared;
14 #using scripts\shared\util_shared;
15 #using scripts\shared\weapons\_flashgrenades;
16 #using scripts\shared\weapons\_weaponobjects;
17 #using scripts\shared\vehicle_shared;
18 #using scripts\shared\vehicle_death_shared;
19 
20 #using scripts\mp\_challenges;
21 #using scripts\mp\_util;
22 #using scripts\mp\gametypes\_globallogic_audio;
23 #using scripts\mp\gametypes\_globallogic_utils;
24 #using scripts\mp\gametypes\_hostmigration;
25 #using scripts\mp\gametypes\_shellshock;
26 #using scripts\mp\gametypes\_spawning;
27 #using scripts\mp\killstreaks\_emp;
28 #using scripts\mp\killstreaks\_killstreak_bundles;
29 #using scripts\mp\killstreaks\_killstreak_detect;
30 #using scripts\mp\killstreaks\_killstreak_hacking;
31 #using scripts\mp\killstreaks\_killstreakrules;
32 #using scripts\mp\killstreaks\_killstreaks;
33 #using scripts\mp\killstreaks\_remote_weapons;
34 
35 #insert scripts\mp\_hacker_tool.gsh;
36 #insert scripts\mp\killstreaks\_killstreaks.gsh;
37 #insert scripts\shared\shared.gsh;
38 #insert scripts\shared\version.gsh;
39 
40 #precache( "string", "KILLSTREAK_EARNED_RCBOMB" );
41 #precache( "string", "KILLSTREAK_RCBOMB_NOT_AVAILABLE" );
42 #precache( "string", "KILLSTREAK_RCBOMB_INBOUND" );
43 #precache( "string", "KILLSTREAK_RCBOMB_HACKED" );
44 #precache( "string", "KILLSTREAK_DESTROYED_RCBOMB" );
45 #precache( "string", "mpl_killstreak_rcbomb" );
46 #precache( "fx", "_t6/weapon/grenade/fx_spark_disabled_rc_car" );
47 #precache( "fx", "killstreaks/fx_rcxd_lights_grn" );
48 #precache( "fx", "killstreaks/fx_rcxd_lights_red" );
49 #precache( "fx", "killstreaks/fx_rcxd_exp" );
50 
51 #namespace rcbomb;
52 
53 #define RCBOMB_NAME "rcbomb"
54 #define RCBOMB_EMP_DEATH_HIDE_DELAY ( 0.2 )
55 #define RCBOMB_WATCH_DEATH_DURATION ( 0.3 )
56 
57 function ‪init()
58 {
59  level._effect["rcbombexplosion"] = "killstreaks/fx_rcxd_exp";
60 
61  ‪killstreaks::register( ‪RCBOMB_NAME, ‪RCBOMB_NAME, "killstreak_rcbomb", "rcbomb_used",&‪ActivateRCBomb );
62  ‪killstreaks::register_strings( ‪RCBOMB_NAME, &"KILLSTREAK_EARNED_RCBOMB", &"KILLSTREAK_RCBOMB_NOT_AVAILABLE", &"KILLSTREAK_RCBOMB_INBOUND", undefined, &"KILLSTREAK_RCBOMB_HACKED", false );
63  ‪killstreaks::register_dialog( ‪RCBOMB_NAME, "mpl_killstreak_rcbomb", "rcBombDialogBundle", undefined, "friendlyRcBomb", "enemyRcBomb", "enemyRcBombMultiple", "friendlyRcBombHacked", "enemyRcBombHacked", "requestRcBomb" );
68 
69  vehicle::add_main_callback( ‪RCBOMB_VEHICLE, &‪InitRCBomb );
70 
71  ‪clientfield::register( "vehicle", "rcbomb_stunned", ‪VERSION_SHIP, 1, "int" );
72 }
73 
74 function ‪InitRCBomb()
75 {
76  rcbomb = self;
77 
78  rcbomb ‪clientfield::set( "enemyvehicle", ‪ENEMY_VEHICLE_ACTIVE );
79  rcbomb.allowFriendlyFireDamageOverride = &‪RCCarAllowFriendlyFireDamage;
80  rcbomb EnableAimAssist();
81  rcbomb SetDrawInfrared( true );
82  rcbomb.delete_on_death = true;
83  rcbomb.death_enter_cb = &‪waitRemoteControl;
84  rcbomb.disableRemoteWeaponSwitch = true;
85  rcbomb.overrideVehicleDamage = &‪OnDamage;
86  rcbomb.overrideVehicleDeath = &‪OnDeath;
87  //rcbomb.remoteWeaponShutdownDelay = RCBOMB_SHUTDOWN_DELAY;
88  rcbomb.watch_remote_weapon_death = true;
89  rcbomb.watch_remote_weapon_death_duration = ‪RCBOMB_WATCH_DEATH_DURATION;
90 
91  if ( IsSentient( rcbomb ) == false )
92  rcbomb MakeSentient(); // so other sentients will consider this as a potential enemy
93 }
94 
95 
97 {
98  remote_controlled = ‪IS_TRUE( self.control_initiated ) || ‪IS_TRUE( self.controlled );
99 
100  if( remote_controlled )
101  {
102  notifyString = self ‪util::waittill_any_return( "remote_weapon_end", "rcbomb_shutdown" );
103  if( notifyString == "remote_weapon_end" )
104  self waittill( "rcbomb_shutdown" );
105  else
106  self waittill( "remote_weapon_end" );
107  }
108  else
109  self waittill( "rcbomb_shutdown" );
110 }
111 
113 {
114  self notify("toggleLightsOnAfterTime_singleton");
115  self endon ("toggleLightsOnAfterTime_singleton");
116 
117  rcbomb = self;
118  rcbomb endon( "death" );
119  wait( time );
120  rcbomb ‪clientfield::set( "toggle_lights", ‪CF_TOGGLE_LIGHTS_ON );
121 }
122 
123 function ‪HackedPreFunction( hacker )
124 {
125  rcbomb = self;
126  rcbomb ‪clientfield::set( "toggle_lights", ‪CF_TOGGLE_LIGHTS_OFF );
127  rcbomb.owner unlink();
128  rcbomb ‪clientfield::set( "vehicletransition", 0 );
129  rcbomb.owner ‪killstreaks::clear_using_remote();
130  rcbomb MakeVehicleUnusable();
131 }
132 
133 function ‪HackedPostFunction( hacker )
134 {
135  rcbomb = self;
136  hacker ‪remote_weapons::UseRemoteWeapon( rcbomb, ‪RCBOMB_NAME, true, false );
137  rcbomb MakeVehicleUnusable();
140 }
141 
143 {
144  rcbomb = self;
145  rcbomb thread ‪WatchOwnerGameEvents();
146 }
147 
148 
149 function ‪ActivateRCBomb( hardpointType )
150 {
151  assert( IsPlayer( self ) );
152  player = self;
153 
154  if( !player ‪killstreakrules::isKillstreakAllowed( hardpointType, player.team ) )
155  {
156  return false;
157  }
158 
159  if ( player UseButtonPressed() )
160  {
161  return false;
162  }
163 
164  placement = ‪CalculateSpawnOrigin( self.origin, self.angles );
165  if( !isdefined( placement ) || !self IsOnGround() || self ‪util::isUsingRemote() || ‪killstreaks::is_interacting_with_object() || self ‪oob::IsTouchingAnyOOBTrigger() || self ‪killstreaks::is_killstreak_start_blocked() )
166  {
167  self iPrintLnBold( &"KILLSTREAK_RCBOMB_NOT_PLACEABLE" );
168  return false;
169  }
170 
171  killstreak_id = player ‪killstreakrules::killstreakStart( ‪RCBOMB_NAME, player.team, false, true );
172  if( killstreak_id == ‪INVALID_KILLSTREAK_ID )
173  {
174  return false;
175  }
176 
177  rcbomb = SpawnVehicle( ‪RCBOMB_VEHICLE, placement.origin, placement.angles, "rcbomb" );
178 
179  rcbomb ‪killstreaks::configure_team( ‪RCBOMB_NAME, killstreak_id, player, "small_vehicle", undefined, &‪ConfigureTeamPost );
181  rcbomb.damageTaken = 0;
182  rcbomb.abandoned = false;
183  rcbomb.killstreak_id = killstreak_id;
184  rcbomb.activatingKillstreak = true;
185  rcbomb SetInvisibleToAll();
186 
187  rcbomb thread ‪WatchShutdown();
188  rcbomb.health = ‪killstreak_bundles::get_max_health( hardpointType );
189  rcbomb.maxhealth = ‪killstreak_bundles::get_max_health( hardpointType );
190  rcbomb.hackedhealth = ‪killstreak_bundles::get_hacked_health( hardpointType );
191  rcbomb.hackedHealthUpdateCallback = &‪rcbomb_hacked_health_update;
192  rcbomb.ignore_vehicle_underneath_splash_scalar = true;
193 
194  self thread ‪killstreaks::play_killstreak_start_dialog( ‪RCBOMB_NAME, self.team, killstreak_id );
195  self AddWeaponStat( GetWeapon( "rcbomb" ) , "used", 1 );
196 
197  ‪remote_weapons::UseRemoteWeapon( rcbomb, ‪RCBOMB_NAME, true, false );
198 
199  if ( !isdefined( player ) || !isAlive( player ) || ‪IS_TRUE( player.laststand ) || player IsEMPJammed() )
200  {
201  if ( isdefined( rcbomb ) )
202  {
203  rcbomb notify( "remote_weapon_shutdown" );
204  rcbomb notify( "rcbomb_shutdown" );
205  }
206  return false;
207  }
208 
209  rcbomb SetVisibleToAll();
210  rcbomb.activatingKillstreak = false;
211  Target_Set( rcbomb );
212 
213  rcbomb thread ‪WatchGameEnded();
214 
215  return true;
216 }
217 
219 {
220  rcbomb = self;
221  if ( rcbomb.health > rcbomb.hackedhealth )
222  {
223  rcbomb.health = rcbomb.hackedhealth;
224  }
225 }
226 
227 
228 function ‪StartRemoteControl( rcbomb )
229 {
230  player = self;
231 
232  rcbomb UseVehicle( player, 0 );
233  rcbomb ‪clientfield::set( "vehicletransition", 1 );
234 
235  rcbomb thread ‪audio::sndUpdateVehicleContext(true);
236 
237  rcbomb thread ‪WatchTimeout();
238  rcbomb thread ‪WatchDetonation();
239  rcbomb thread ‪WatchHurtTriggers();
240  rcbomb thread ‪WatchWater();
241 
243 }
244 
245 function ‪EndRemoteControl( rcbomb, exitRequestedByOwner )
246 {
247  if ( exitrequestedbyowner == false )
248  {
249  rcbomb notify( "rcbomb_shutdown" );
250  rcbomb thread ‪audio::sndUpdateVehicleContext(false);
251  }
252  rcbomb ‪clientfield::set( "vehicletransition", 0 );
253 }
254 
256 {
257  rcbomb = self;
258  rcbomb endon( "rcbomb_shutdown" );
259  rcbomb endon( "death" );
260 
261  while( !rcbomb.owner attackbuttonpressed() )
262  {
264  }
265 
266  rcbomb notify( "rcbomb_shutdown" );
267 }
268 
269 #define RCBOMB_IN_WATER_TRACE_MINS ( -2, -2, -2 )
270 #define RCBOMB_IN_WATER_TRACE_MAXS ( 2, 2, 2 )
271 #define RCBOMB_IN_WATER_TRACE_MASK ( PHYSICS_TRACE_MASK_WATER )
272 #define RCBOMB_IN_WATER_TRACE_WAIT ( 0.5 )
273 
274 function ‪WatchWater()
275 {
276  self endon( "rcbomb_shutdown" );
277 
278  inWater = false;
279  while( !inWater )
280  {
282  ‪trace = physicstrace( self.origin + ( 0, 0, 10 ), self.origin + ( 0, 0, 6 ), ‪RCBOMB_IN_WATER_TRACE_MINS, ‪RCBOMB_IN_WATER_TRACE_MAXS, self, ‪RCBOMB_IN_WATER_TRACE_MASK);
283  inWater = ‪trace["fraction"] < 1.0;
284  }
285 
286  self.abandoned = true;
287  self notify( "rcbomb_shutdown" );
288 }
289 
291 {
292  self notify("WatchOwnerGameEvents_singleton");
293  self endon ("WatchOwnerGameEvents_singleton");
294 
295  rcbomb = self;
296  rcbomb endon( "rcbomb_shutdown" );
297 
298  rcbomb.owner ‪util::waittill_any( "joined_team", "disconnect", "joined_spectators" );
299 
300  rcbomb.abandoned = true;
301  rcbomb notify( "rcbomb_shutdown" );
302 }
303 
304 function ‪WatchTimeout()
305 {
306  rcbomb = self;
308 }
309 
310 function ‪rc_shutdown()
311 {
312  rcbomb = self;
313  rcbomb notify( "rcbomb_shutdown" );
314 }
315 
317 {
318  rcbomb = self;
319  rcbomb endon( "death" );
320 
321  rcbomb waittill( "rcbomb_shutdown" );
322 
323  if ( isdefined( rcbomb.activatingKillstreak ) && rcbomb.activatingKillstreak )
324  {
325  // we can delete since it should not have been made visible yet
326  ‪killstreakrules::killstreakStop( ‪RCBOMB_NAME, rcbomb.originalteam, rcbomb.killstreak_id );
327  rcbomb notify( "rcbomb_shutdown" );
328  rcbomb delete(); // still need to delete here
329  }
330  else
331  {
332  attacker = ( isdefined( rcbomb.owner ) ? rcbomb.owner : undefined );
333  rcbomb DoDamage( rcbomb.health + 1, rcbomb.origin + (0, 0, 10), attacker, attacker, "none", "MOD_EXPLOSIVE", 0 );
334  }
335 }
336 
338 {
339  rcbomb = self;
340  rcbomb endon( "rcbomb_shutdown" );
341 
342  while( true )
343  {
344  rcbomb waittill ( "touch", ent );
345  if( isdefined( ent.classname ) && ( ent.classname == "trigger_hurt" || ent.classname == "trigger_out_of_bounds" ) )
346  {
347  rcbomb notify( "rcbomb_shutdown" );
348  }
349  }
350 }
351 
352 function ‪OnDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal )
353 {
354  if ( self.activatingKillstreak )
355  {
356  return 0.0;
357  }
358 
359  if ( !isdefined( eAttacker ) || eAttacker != self.owner )
360  {
361  iDamage = ‪killstreaks::OnDamagePerWeapon( ‪RCBOMB_NAME, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, self.maxhealth, undefined, self.maxhealth*0.4, undefined, 0, undefined, true, 1.0 );
362  }
363 
364  if( isdefined( eAttacker ) && isdefined( eAttacker.team ) && eAttacker.team != self.team )
365  {
366  if( weapon.isEmp )
367  {
368  self.damage_on_death = false;
369  self.died_by_emp = true;
370  iDamage = self.health + 1; // destroy if hit by emp
371  //thread remote_weapons::do_static_fx();
372  }
373  }
374 
375  // C4 destroys the HC-XD with any damage (TODO: consider creating a more robust solution if need be)
376  if ( weapon.name == "satchel_charge" && sMeansOfDeath == "MOD_EXPLOSIVE" )
377  {
378  iDamage = self.health + 1;
379  }
380 
381  return iDamage;
382 }
383 
384 
385 
386 function ‪OnDeath( eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime )
387 {
388  rcbomb = self;
389  player = rcbomb.owner;
390 
391  player endon( "disconnect" );
392  player endon( "joined_team" );
393  player endon( "joined_spectators" );
394 
395  ‪killstreakrules::killstreakStop( ‪RCBOMB_NAME, rcbomb.originalTeam, rcbomb.killstreak_id );
396 
397  rcbomb ‪clientfield::set( "enemyvehicle", ‪ENEMY_VEHICLE_INACTIVE );
398 
399  //if( isdefined( player ) && ( !isdefined( eAttacker ) || ( eAttacker.team != rcbomb.team ) ) && !level.gameEnded )
400  //rcbomb remote_weapons::do_static_fx();
401 
402  rcbomb ‪Explode( eAttacker, weapon );
403 
404  hide_after_wait_time = ( ( rcbomb.died_by_emp === true ) ? ‪RCBOMB_EMP_DEATH_HIDE_DELAY : ‪RCBOMB_DEATH_HIDE_DELAY );
405  if( isdefined( player ) )
406  {
407  player ‪util::freeze_player_controls( true );
408  rcbomb thread ‪HideAfterWait( hide_after_wait_time );
409  //rcbomb util::DeleteAfterTime( RCBOMB_SHUTDOWN_DELAY );
410  wait( ‪RCBOMB_SHUTDOWN_DELAY );
411  player ‪util::freeze_player_controls( false );
412  }
413  else
414  {
415  rcbomb thread ‪HideAfterWait( hide_after_wait_time );
416  //rcbomb util::DeleteAfterTime( RCBOMB_SHUTDOWN_DELAY_ABANDONED );
417  }
418 
419  if ( isdefined( rcbomb ) )
420  rcbomb notify( "rcbomb_shutdown" );
421 }
422 
424 {
425  rcbomb = self;
426  rcbomb endon( "death" );
427 
428  level waittill("game_ended");
429 
430  rcbomb.abandoned = true;
431  rcbomb.selfDestruct = true;
432  rcbomb notify( "rcbomb_shutdown" );
433 }
434 
435 function ‪HideAfterWait( waitTime )
436 {
437  self endon( "death" );
438 
439  wait waitTime;
440  self SetInvisibleToAll();
441 }
442 
443 function ‪Explode( attacker, weapon )
444 {
445  self endon ("death");
446  owner = self.owner;
447 
448  if ( !isdefined( attacker ) && isdefined( self.owner ) )
449  {
450  attacker = self.owner;
451  }
452 
455  self thread ‪vehicle_death::set_death_model( self.deathmodel, self.modelswapdelay );
456 
457  self ‪vehicle::toggle_tread_fx( false );
458  self ‪vehicle::toggle_exhaust_fx( false );
459  self ‪vehicle::toggle_sounds( false );
460  self ‪vehicle::lights_off();
461 
462  self PlayRumbleOnEntity( "rcbomb_explosion" );
463 
464  if ( !self.abandoned && attacker != self.owner && isPlayer( attacker ) )
465  {
466  attacker ‪challenges::destroyRCBomb( weapon );
467  if ( self.owner ‪util::IsEnemyPlayer( attacker ) )
468  {
469  ‪scoreevents::processScoreEvent( "destroyed_hover_rcxd", attacker, self.owner, weapon );
470  LUINotifyEvent( &"player_callout", 2, &"KILLSTREAK_DESTROYED_RCBOMB", attacker.entnum );
471  if ( isdefined( weapon ) && weapon.isValid )
472  {
473  weaponStatName = "destroyed";
474  level.globalKillstreaksDestroyed++;
475  // increment the destroyed stat for this, we aren't using the weaponStatName variable from above because it could be "kills" and we don't want that
476  weapon_rcbomb = GetWeapon( "rcbomb" );
477  attacker AddWeaponStat( weapon_rcbomb, "destroyed", 1 );
478  attacker AddWeaponStat( weapon, "destroyed_controlled_killstreak", 1 );
479  }
480 
482  }
483  }
484 }
485 
486 function ‪RCCarAllowFriendlyFireDamage( eInflictor, eAttacker, sMeansOfDeath, weapon )
487 {
488  if ( isdefined( eAttacker ) && eAttacker == self.owner )
489  return true;
490 
491  if ( isdefined( eInflictor ) && eInflictor islinkedto( self ) )
492  return true;
493 
494  return false;
495 }
496 
498 {
499  startheight = ‪RCBOMB_PLACEMENT_STAND_HEIGHT;
500 
501  switch( self GetStance() )
502  {
503  case "crouch":
504  startheight = ‪RCBOMB_PLACEMENT_CROUCH_HEIGHT;
505  break;
506  case "prone":
507  startheight = ‪RCBOMB_PLACEMENT_PRONE_HEIGHT;
508  break;
509  }
510  return startheight;
511 }
512 
513 function ‪CalculateSpawnOrigin( origin, angles )
514 {
515  startheight = ‪GetPlacementStartHeight();
516 
517  mins = (-5,-5,0); // keep the min z 0 so the return point is the exact height of the collision
518  maxs = (5,5,10);
519 
520  startPoints = [];
521  startAngles = [];
522  wheelCounts = [];
523  testCheck = [];
524  largestCount = 0;
525  largestCountIndex = 0;
526 
527  testangles = [];
528  testangles[0] = (0,0,0);
529  testangles[1] = (0,20,0);
530  testangles[2] = (0,-20,0);
531  testangles[3] = (0,45,0);
532  testangles[4] = (0,-45,0);
533 
534  heightoffset = 5;
535 
536  for (i = 0; i < testangles.size; i++ )
537  {
538  testCheck[i] = false;
539 
540  startAngles[i] = ( 0, angles[1], 0 );
541  startPoint = origin + VectorScale( anglestoforward( startAngles[i] + testangles[i]), ‪RCBOMB_PLACMENT_FROM_PLAYER );
542  endPoint = startPoint - (0,0,100);
543  startPoint = startPoint + (0,0,startheight);
544 
545  // ignore water on this one
547 
548  // using physicstrace so we dont slip through small cracks
549  ‪trace = physicstrace( startPoint, endPoint, mins, maxs, self, mask);
550 
551  // if any player intersection then skip
552  if ( isdefined(‪trace["entity"]) && IsPlayer(‪trace["entity"]))
553  {
554  wheelCounts[i] = 0;
555  continue;
556  }
557 
558  startPoints[i] = ‪trace["position"] + (0,0,heightoffset);
559  wheelCounts[i] = ‪TestWheelLocations(startPoints[i],startAngles[i],heightoffset);
560 
561  if ( positionWouldTelefrag( startPoints[i] ) )
562  continue;
563 
564  if ( largestCount < wheelCounts[i] )
565  {
566  largestCount = wheelCounts[i];
567  largestCountIndex = i;
568  }
569 
570  // going to early out on the first I find with valid tire positions
571  if ( wheelCounts[i] >= 3 )
572  {
573  testCheck[i] = true;
574 
575  if ( ‪TestSpawnOrigin( startPoints[i], startAngles[i] ) )
576  {
577  placement = SpawnStruct();
578  placement.origin = startPoints[i];
579  placement.angles = startAngles[i];
580  return placement;
581  }
582  }
583  }
584 
585  for (i = 0; i < testangles.size; i++ )
586  {
587  if ( !testCheck[i] )
588  {
589  if ( wheelCounts[i] >= 2 )
590  {
591  if ( ‪TestSpawnOrigin( startPoints[i], startAngles[i] ) )
592  {
593  placement = SpawnStruct();
594  placement.origin = startPoints[i];
595  placement.angles = startAngles[i];
596  return placement;
597  }
598  }
599  }
600  }
601 
602  return undefined;
603 }
604 
605 function ‪TestWheelLocations( origin, angles, heightoffset )
606 {
607  forward = 13;
608  side = 10;
609 
610  wheels = [];
611  wheels[0] = ( forward, side, 0 );
612  wheels[1] = ( forward, -1 * side, 0 );
613  wheels[2] = ( -1 * forward, -1 * side, 0 );
614  wheels[3] = ( -1 * forward, side, 0 );
615 
616  height = 5;
617  touchCount = 0;
618 
619  yawangles = (0,angles[1],0);
620 
621  for (i = 0; i < 4; i++ )
622  {
623  wheel = RotatePoint( wheels[i], yawangles );
624  startPoint = origin + wheel;
625  endPoint = startPoint + (0,0,(-1 * height) - heightoffset);
626  startPoint = startPoint + (0,0,height - heightoffset) ;
627 
628  ‪trace = bulletTrace( startPoint, endPoint, false, self );
629  if ( ‪trace["fraction"] < 1 )
630  {
631  touchCount++;
632  }
633  }
634 
635  return touchCount;
636 }
637 
638 function ‪TestSpawnOrigin( origin, angles )
639 {
640  liftedorigin = origin + (0,0,5);
641  size = 12;
642  height = 15;
643  mins = (-1 * size,-1 * size,0 );
644  maxs = ( size,size,height );
645  absmins = liftedorigin + mins;
646  absmaxs = liftedorigin + maxs;
647 
648  if( BoundsWouldTelefrag( absmins, absmaxs ) )
649  {
650  return false;
651  }
652 
653  startheight = getPlacementStartHeight();
654 
656 
657  // test the volume where we are going to place the car
658  // note that this physics trace is not an oriented box.
659  ‪trace = physicstrace( liftedorigin, (origin +(0,0,1)), mins, maxs, self, mask);
660 
661  if ( ‪trace["fraction"] < 1 )
662  {
663  return false;
664  }
665 
666  // swept trace of a small bounding box from head height to where we are placing the car
667  // to make sure there is no wall between us and the car
668  size = 2.5;
669  height = size * 2;
670  mins = (-1 * size,-1 * size,0 );
671  maxs = ( size,size,height );
672 
673  sweeptrace = physicstrace( (self.origin + (0,0,startheight)), liftedorigin, mins, maxs, self, mask);
674 
675  if ( sweeptrace["fraction"] < 1 )
676  {
677  return false;
678  }
679 
680  return true;
681 }
‪WatchTimeout
‪function WatchTimeout()
Definition: _rcbomb.gsc:304
‪processScoreEvent
‪function processScoreEvent(event, player, victim, weapon)
Definition: scoreevents_shared.gsc:19
‪set_death_model
‪function set_death_model(sModel, fDelay)
Definition: vehicle_death_shared.gsc:258
‪UseRemoteWeapon
‪function UseRemoteWeapon(weapon, weaponName, immediate, allowManualDeactivation=true, always_allow_ride=false)
Definition: _remote_weapons.gsc:74
‪ActivateRCBomb
‪function ActivateRCBomb(hardpointType)
Definition: _rcbomb.gsc:149
‪lights_off
‪function lights_off(localClientNum)
Definition: vehicle_shared.csc:652
‪HackedPostFunction
‪function HackedPostFunction(hacker)
Definition: _rcbomb.gsc:133
‪is_interacting_with_object
‪function is_interacting_with_object()
Definition: _killstreaks.gsc:2384
‪WatchDetonation
‪function WatchDetonation()
Definition: _rcbomb.gsc:255
‪destroyRCBomb
‪function destroyRCBomb(weapon)
Definition: challenges_shared.gsc:755
‪IsTouchingAnyOOBTrigger
‪function IsTouchingAnyOOBTrigger()
Definition: _oob.gsc:84
‪RCBOMB_IN_WATER_TRACE_MASK
‪#define RCBOMB_IN_WATER_TRACE_MASK
Definition: _rcbomb.gsc:271
‪WaitForTimeout
‪function WaitForTimeout(killstreak, duration, callback, endCondition1, endCondition2, endCondition3)
Definition: _killstreaks.gsc:2913
‪allow_assists
‪function allow_assists(killstreakType, allow)
Definition: _killstreaks.gsc:399
‪ENEMY_VEHICLE_INACTIVE
‪#define ENEMY_VEHICLE_INACTIVE
Definition: _hacker_tool.gsh:1
‪StartRemoteControl
‪function StartRemoteControl(rcbomb)
Definition: _rcbomb.gsc:228
‪RCBOMB_IN_WATER_TRACE_WAIT
‪#define RCBOMB_IN_WATER_TRACE_WAIT
Definition: _rcbomb.gsc:272
‪WatchOwnerGameEvents
‪function WatchOwnerGameEvents()
Definition: _rcbomb.gsc:290
‪toggle_tread_fx
‪function toggle_tread_fx(on)
Definition: vehicle_shared.gsc:3357
‪RCBOMB_WATCH_DEATH_DURATION
‪#define RCBOMB_WATCH_DEATH_DURATION
Definition: _rcbomb.gsc:55
‪EndRemoteControl
‪function EndRemoteControl(rcbomb, exitRequestedByOwner)
Definition: _rcbomb.gsc:245
‪RCBOMB_HIDE_COMPASS_ON_REMOTE_CONTROL
‪#define RCBOMB_HIDE_COMPASS_ON_REMOTE_CONTROL
Definition: _killstreaks.gsh:329
‪WatchWater
‪function WatchWater()
Definition: _rcbomb.gsc:274
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪waittill_any_return
‪function waittill_any_return(string1, string2, string3, string4, string5, string6, string7)
Definition: util_shared.csc:212
‪play_killstreak_start_dialog
‪function play_killstreak_start_dialog(killstreakType, team, killstreakId)
Definition: _killstreaks.gsc:1905
‪OnDeath
‪function OnDeath(eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime)
Definition: _rcbomb.gsc:386
‪toggle_exhaust_fx
‪function toggle_exhaust_fx(on)
Definition: vehicle_shared.gsc:3335
‪PHYSICS_TRACE_MASK_WATER
‪#define PHYSICS_TRACE_MASK_WATER
Definition: shared.gsh:132
‪OnDamagePerWeapon
‪function OnDamagePerWeapon(killstreak_ref, attacker, damage, flags, type, weapon, max_health, destroyed_callback, low_health, low_health_callback, emp_damage, emp_callback, allow_bullet_damage, chargeLevel)
Definition: _killstreaks.gsc:2667
‪RCBOMB_PLACMENT_FROM_PLAYER
‪#define RCBOMB_PLACMENT_FROM_PLAYER
Definition: _killstreaks.gsh:311
‪RCBOMB_IN_WATER_TRACE_MAXS
‪#define RCBOMB_IN_WATER_TRACE_MAXS
Definition: _rcbomb.gsc:270
‪trace
‪function trace(from, to, target)
Definition: grapple.gsc:369
‪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
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪RegisterRemoteWeapon
‪function RegisterRemoteWeapon(weaponName, hintString, useCallback, endUseCallback, hideCompassOnUse=true)
Definition: _remote_weapons.gsc:63
‪RCBOMB_PLACEMENT_STAND_HEIGHT
‪#define RCBOMB_PLACEMENT_STAND_HEIGHT
Definition: _killstreaks.gsh:312
‪sndUpdateVehicleContext
‪function sndUpdateVehicleContext(added)
Definition: audio_shared.gsc:74
‪rc_shutdown
‪function rc_shutdown()
Definition: _rcbomb.gsc:310
‪toggleLightsOnAfterTime
‪function toggleLightsOnAfterTime(time)
Definition: _rcbomb.gsc:112
‪isUsingRemote
‪function isUsingRemote()
Definition: util_shared.gsc:2705
‪TestSpawnOrigin
‪function TestSpawnOrigin(origin, angles)
Definition: _rcbomb.gsc:638
‪IsEnemyPlayer
‪function IsEnemyPlayer(player)
Definition: util_shared.csc:1220
‪death_radius_damage
‪function death_radius_damage(meansOfDamage="MOD_EXPLOSIVE")
Definition: vehicle_death_shared.gsc:1196
‪RCBOMB_DURATION
‪#define RCBOMB_DURATION
Definition: _killstreaks.gsh:310
‪WatchHurtTriggers
‪function WatchHurtTriggers()
Definition: _rcbomb.gsc:337
‪GetPlacementStartHeight
‪function GetPlacementStartHeight()
Definition: _rcbomb.gsc:497
‪HackedPreFunction
‪function HackedPreFunction(hacker)
Definition: _rcbomb.gsc:123
‪set_killstreak_delay_killcam
‪function set_killstreak_delay_killcam(killstreak_name)
Definition: _killstreaks.gsc:2446
‪RCBOMB_PLACEMENT_PRONE_HEIGHT
‪#define RCBOMB_PLACEMENT_PRONE_HEIGHT
Definition: _killstreaks.gsh:314
‪WatchShutdown
‪function WatchShutdown()
Definition: _rcbomb.gsc:316
‪RCBOMB_DEATH_HIDE_DELAY
‪#define RCBOMB_DEATH_HIDE_DELAY
Definition: _killstreaks.gsh:315
‪play_destroyed_dialog_on_owner
‪function play_destroyed_dialog_on_owner(killstreakType, killstreakId)
Definition: _killstreaks.gsc:1982
‪RCBOMB_VEHICLE
‪#define RCBOMB_VEHICLE
Definition: _killstreaks.gsh:309
‪isKillstreakAllowed
‪function isKillstreakAllowed(hardpointType, team)
Definition: _killstreakrules.gsc:352
‪is_killstreak_start_blocked
‪function is_killstreak_start_blocked()
Definition: _killstreaks.gsc:3205
‪ConfigureTeamPost
‪function ConfigureTeamPost(owner, isHacked)
Definition: _rcbomb.gsc:142
‪death_fx
‪function death_fx()
Definition: _qrdrone.gsc:958
‪CF_TOGGLE_LIGHTS_OFF
‪#define CF_TOGGLE_LIGHTS_OFF
Definition: shared.gsh:520
‪waittill_any
‪function waittill_any(str_notify1, str_notify2, str_notify3, str_notify4, str_notify5)
Definition: util_shared.csc:375
‪get_max_health
‪function get_max_health(killstreakType)
Definition: _killstreak_bundles.gsc:188
‪CF_TOGGLE_LIGHTS_ON
‪#define CF_TOGGLE_LIGHTS_ON
Definition: shared.gsh:519
‪register_dialog
‪function register_dialog(killstreakType, informDialog, taacomDialogBundleKey, pilotDialogArrayKey, startDialogKey, enemyStartDialogKey, enemyStartMultipleDialogKey, hackedDialogKey, hackedStartDialogKey, requestDialogKey, threatDialogKey, isInventory)
Definition: _killstreaks.gsc:239
‪rcbomb_hacked_health_update
‪function rcbomb_hacked_health_update(hacker)
Definition: _rcbomb.gsc:218
‪INVALID_KILLSTREAK_ID
‪#define INVALID_KILLSTREAK_ID
Definition: _killstreaks.gsh:2
‪Explode
‪function Explode(attacker, weapon)
Definition: _rcbomb.gsc:443
‪PHYSICS_TRACE_MASK_PHYSICS
‪#define PHYSICS_TRACE_MASK_PHYSICS
Definition: shared.gsh:130
‪PHYSICS_TRACE_MASK_VEHICLE
‪#define PHYSICS_TRACE_MASK_VEHICLE
Definition: shared.gsh:131
‪set_vehicle_drivable_time_starting_now
‪function set_vehicle_drivable_time_starting_now(killstreak, duration_ms=(-1))
Definition: _killstreak_hacking.gsc:140
‪InitRCBomb
‪function InitRCBomb()
Definition: _rcbomb.gsc:74
‪register_strings
‪function register_strings(killstreakType, receivedText, notUsableText, inboundText, inboundNearPlayerText, hackedText, utilizesAirspace=true, isInventory=false)
Definition: _killstreaks.gsc:223
‪killstreakStop
‪function killstreakStop(hardpointType, team, id)
Definition: _killstreakrules.gsc:293
‪get_hacked_health
‪function get_hacked_health(killstreakType)
Definition: _killstreak_bundles.gsc:202
‪WatchGameEnded
‪function WatchGameEnded()
Definition: _rcbomb.gsc:423
‪RCCarAllowFriendlyFireDamage
‪function RCCarAllowFriendlyFireDamage(eInflictor, eAttacker, sMeansOfDeath, weapon)
Definition: _rcbomb.gsc:486
‪RCBOMB_IN_WATER_TRACE_MINS
‪#define RCBOMB_IN_WATER_TRACE_MINS
Definition: _rcbomb.gsc:269
‪killstreakStart
‪function killstreakStart(hardpointType, team, hacked, displayTeamMessage)
Definition: _killstreakrules.gsc:184
‪init
‪function init()
Definition: _rcbomb.gsc:57
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪configure_team
‪function configure_team(killstreakType, killstreakId, owner, influencerType, configureTeamPreFunction, configureTeamPostFunction, isHacked=false)
Definition: _killstreaks.gsc:2806
‪HideAfterWait
‪function HideAfterWait(waitTime)
Definition: _rcbomb.gsc:435
‪waitRemoteControl
‪function waitRemoteControl()
Definition: _rcbomb.gsc:96
‪register_alt_weapon
‪function register_alt_weapon(killstreakType, weaponName, isInventory)
Definition: _killstreaks.gsc:318
‪TestWheelLocations
‪function TestWheelLocations(origin, angles, heightoffset)
Definition: _rcbomb.gsc:605
‪clear_using_remote
‪function clear_using_remote(immediate, skipNotify)
Definition: _killstreaks.gsc:2403
‪RCBOMB_SHUTDOWN_DELAY
‪#define RCBOMB_SHUTDOWN_DELAY
Definition: _killstreaks.gsh:316
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪RCBOMB_EMP_DEATH_HIDE_DELAY
‪#define RCBOMB_EMP_DEATH_HIDE_DELAY
Definition: _rcbomb.gsc:54
‪enable_hacking
‪function enable_hacking(killstreakName, preHackFunction, postHackFunction)
Definition: _killstreak_hacking.gsc:22
‪toggle_sounds
‪function toggle_sounds(on)
Definition: vehicle_shared.gsc:3379
‪isHacked
‪function isHacked()
Definition: util_shared.gsc:2493
‪RCBOMB_NAME
‪#define RCBOMB_NAME
Definition: _rcbomb.gsc:53
‪RCBOMB_PLACEMENT_CROUCH_HEIGHT
‪#define RCBOMB_PLACEMENT_CROUCH_HEIGHT
Definition: _killstreaks.gsh:313
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265
‪CalculateSpawnOrigin
‪function CalculateSpawnOrigin(origin, angles)
Definition: _rcbomb.gsc:513
‪OnDamage
‪function OnDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal)
Definition: _rcbomb.gsc:352