‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_turret.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\mp\_util;
4 #using scripts\mp\gametypes\_globallogic_audio;
5 #using scripts\mp\gametypes\_hostmigration;
6 #using scripts\mp\gametypes\_spawning;
7 #using scripts\mp\killstreaks\_airsupport;
8 #using scripts\mp\killstreaks\_emp;
9 #using scripts\mp\killstreaks\_killstreakrules;
10 #using scripts\mp\killstreaks\_killstreaks;
11 #using scripts\mp\killstreaks\_killstreak_bundles;
12 #using scripts\mp\killstreaks\_placeables;
13 #using scripts\mp\killstreaks\_remote_weapons;
14 #using scripts\mp\killstreaks\_killstreak_hacking;
15 #using scripts\mp\teams\_teams;
16 
17 #using scripts\shared\callbacks_shared;
18 #using scripts\shared\challenges_shared;
19 #using scripts\shared\clientfield_shared;
20 #using scripts\shared\hostmigration_shared;
21 #using scripts\shared\scoreevents_shared;
22 #using scripts\shared\killstreaks_shared;
23 #using scripts\shared\popups_shared;
24 #using scripts\shared\util_shared;
25 #using scripts\shared\weapons\_weaponobjects;
26 #using scripts\shared\turret_shared;
27 #using scripts\shared\vehicle_shared;
28 #using scripts\shared\vehicle_death_shared;
29 #using scripts\shared\visionset_mgr_shared;
30 
31 #insert scripts\mp\_hacker_tool.gsh;
32 #insert scripts\mp\killstreaks\_killstreaks.gsh;
33 #insert scripts\shared\shared.gsh;
34 #insert scripts\shared\version.gsh;
35 
36 #precache( "string", "KILLSTREAK_EARNED_AUTO_TURRET" );
37 #precache( "string", "KILLSTREAK_AUTO_TURRET_INBOUND" );
38 #precache( "string", "KILLSTREAK_AUTO_TURRET_NOT_AVAILABLE" );
39 #precache( "string", "KILLSTREAK_AUTO_TURRET_HACKED" );
40 #precache( "string", "KILLSTREAK_DESTROYED_AUTO_TURRET" );
41 #precache( "triggerstring", "KILLSTREAK_AUTO_TURRET_PLACE_TURRET_HINT" );
42 #precache( "triggerstring", "KILLSTREAK_AUTO_TURRET_INVALID_TURRET_LOCATION" );
43 #precache( "triggerstring", "KILLSTREAK_SENTRY_TURRET_PICKUP" );
44 #precache( "triggerstring", "MP_REMOTE_USE_TURRET" );
45 #precache( "string", "mpl_killstreak_auto_turret" );
46 
47 #using_animtree( "mp_autoturret" );
48 
49 #define TURRET_NAME "autoturret"
50 #define TURRET_SCAN_ANGLE_BUFFER 10
51 #define TURRET_SCAN_WAIT 2.5
52 #define PLACEABLE_MOVEABLE_TIMEOUT_EXTENSION_TU1 5000 // tu1: make sure this matches the same value in placeables.gsc
53 
54 #namespace turret;
55 
56 function ‪init()
57 {
58  ‪killstreaks::register( "autoturret", "autoturret", "killstreak_auto_turret", "auto_turret_used", &‪ActivateTurret );
59  ‪killstreaks::register_alt_weapon( "autoturret", "auto_gun_turret" );
60  ‪killstreaks::register_remote_override_weapon( "autoturret", "killstreak_remote_turret" );
61  ‪killstreaks::register_strings( "autoturret", &"KILLSTREAK_EARNED_AUTO_TURRET", &"KILLSTREAK_AUTO_TURRET_NOT_AVAILABLE", &"KILLSTREAK_AUTO_TURRET_INBOUND", undefined, &"KILLSTREAK_AUTO_TURRET_HACKED", false );
62  ‪killstreaks::register_dialog( ‪TURRET_NAME, "mpl_killstreak_auto_turret", "turretDialogBundle", undefined, "friendlyTurret", "enemyTurret", "enemyTurretMultiple", "friendlyTurretHacked", "enemyTurretHacked", "requestTurret", "threatTurret" );
63 
64  // TODO: Move to killstreak data
65  level.killstreaks[‪TURRET_NAME].threatOnKill = true;
66 
67  ‪clientfield::register( "vehicle", "auto_turret_open", ‪VERSION_SHIP, 1, "int" );
68  ‪clientfield::register( "scriptmover", "auto_turret_init", ‪VERSION_SHIP, 1, "int" ); // re-export model in close position to save this clientfield
69  ‪clientfield::register( "scriptmover", "auto_turret_close", ‪VERSION_SHIP, 1, "int" );
70 
71  level.autoturretOpenAnim = %o_turret_sentry_deploy;
72  level.autoturretCloseAnim = %o_turret_sentry_close;
73 
75  vehicle::add_main_callback( ‪TURRET_VEHICLE_NAME, &‪InitTurret );
76 
78 }
79 
80 function ‪InitTurret()
81 {
82  turretVehicle = self;
83  //turretVehicle.delete_on_death = undefined; // don't delete on death as we may need to support futz on death
84  turretVehicle.dontfreeme = true; // don't allow the shared shutdown sequence until we are ready
85  turretVehicle.damage_on_death = false; // never cause damage when auto turret dies
86  turretVehicle.delete_on_death = undefined; // disallow the vehicle death's delete
87  turretVehicle.watch_remote_weapon_death = true;
88  turretVehicle.watch_remote_weapon_death_duration = ‪TURRET_WATCH_DEATH_DURATION;
89 
90  turretVehicle.maxhealth = ‪TURRET_HEALTH;
91  turretVehicle.damageTaken = 0;
92 
94 
95  if ( isdefined( tableHealth ) )
96  {
97  turretVehicle.maxhealth = tableHealth;
98 
99  }
100 
101  turretVehicle.health = turretVehicle.maxhealth;
102 
104  // setting min dist squared prevents an exploit of drawing fire and not getting hurt when there is no collision on the turret
105  turretVehicle ‪turret::set_min_target_distance_squared( DistanceSquared( turretVehicle GetTagOrigin( "tag_flash" ), turretVehicle GetTagOrigin( "tag_barrel" ) ), 0 );
107  turretVehicle ‪clientfield::set( "enemyvehicle", ‪ENEMY_VEHICLE_ACTIVE );
108  turretVehicle.soundmod = "drone_land";
109  //turretVehicle NotSolid();
110 
111  turretVehicle.overrideVehicleDamage = &‪OnTurretDamage;
112  turretVehicle.overrideVehicleDeath = &‪OnTurretDeath;
113 }
114 
116 {
117  player = self;
118  assert( IsPlayer( player ) );
119 
120  killstreakId = self ‪killstreakrules::killstreakStart( ‪TURRET_NAME, player.team, false, false );
121  if( killstreakId == ‪INVALID_KILLSTREAK_ID )
122  {
123  return false;
124  }
125 
126  bundle = level.killstreakBundle[‪TURRET_NAME];
127 
128  turret = player ‪placeables::SpawnPlaceable( ‪TURRET_NAME, killstreakId,
131  ‪TURRET_PICKUP_TEXT, ‪TURRET_DURATION, undefined, 0, bundle.ksPlaceableHint, bundle.ksPlaceableInvalidLocationHint );
132 
133  turret thread ‪WatchTurretShutdown( killstreakId, player.team );
134  turret thread ‪util::ghost_wait_show_to_player( player );
135  turret.otherModel thread ‪util::ghost_wait_show_to_others( player );
136  turret ‪clientfield::set( "auto_turret_init", 1 );
137  turret.otherModel ‪clientfield::set( "auto_turret_init", 1 );
138 
139  event = turret ‪util::waittill_any_return( "placed", "cancelled", "death" );
140  if( event != "placed" )
141  {
142  return false;
143  }
144 
145  turret playsound ("mpl_turret_startup");
146  return true;
147 }
148 
149 function ‪OnPlaceTurret( turret )
150 {
151  player = self;
152  assert( IsPlayer( player ) );
153 
154  if( isdefined( turret.vehicle ) )
155  {
156  turret.vehicle.origin = turret.origin;
157  turret.vehicle.angles = turret.angles;
158 
159  turret.vehicle thread ‪util::ghost_wait_show( 0.05 );
160 
161  turret.vehicle playsound ("mpl_turret_startup");
162  }
163  else
164  {
165  turret.vehicle = SpawnVehicle( ‪TURRET_VEHICLE_NAME, turret.origin, turret.angles, "dynamic_spawn_ai" );
166  turret.vehicle.owner = player;
167  turret.vehicle SetOwner( player );
168  turret.vehicle.ownerEntNum = player.entNum;
169  turret.vehicle.parentStruct = turret;
170  turret.vehicle.controlled = false;
171  turret.vehicle.treat_owner_damage_as_friendly_fire = true;
172  turret.vehicle.ignore_team_kills = true;
173  turret.vehicle.deal_no_crush_damage = true;
174 
175  turret.vehicle.team = player.team;
176  turret.vehicle SetTeam( player.team );
177  turret.vehicle ‪turret::set_team( player.team, 0 );
178  turret.vehicle ‪turret::set_torso_targetting( 0 );
179  turret.vehicle ‪turret::set_target_leading( 0 );
180  turret.vehicle.use_non_teambased_enemy_selection = true;
181  turret.vehicle.waittill_turret_on_target_delay = 0.25;
182  //turret.vehicle turret::set_see_from_tag_flash( true, 0 );
183  //turret.vehicle turret::
184  turret.vehicle.ignore_vehicle_underneath_splash_scalar = true;
185 
186  turret.vehicle ‪killstreaks::configure_team( ‪TURRET_NAME, turret.killstreakId, player, "small_vehicle" );
188 
189  turret.vehicle thread ‪turret_watch_owner_events();
190  turret.vehicle thread ‪turret_laser_watch();
191  turret.vehicle thread ‪setup_death_watch_for_new_targets();
192 
193  turret.vehicle ‪CreateTurretInfluencer( "turret" );
194  turret.vehicle ‪CreateTurretInfluencer( "turret_close" );
195 
196  turret.vehicle thread ‪util::ghost_wait_show( 0.05 );
197 
198  if ( IsSentient( turret.vehicle ) == false )
199  turret.vehicle MakeSentient(); // so other sentients will consider this as a potential enemy
200 
201  player ‪killstreaks::play_killstreak_start_dialog( ‪TURRET_NAME, player.pers["team"], turret.killstreakId );
203  player AddWeaponStat( GetWeapon( ‪TURRET_NAME ), "used", 1 );
204 
205  turret.vehicle.killstreak_end_time = GetTime() + ‪TURRET_DURATION + ‪PLACEABLE_MOVEABLE_TIMEOUT_EXTENSION_TU1;
206  }
207 
208  turret.vehicle ‪turret::enable( 0, false );
209  Target_Set( turret.vehicle, ( 0, 0, 36 ) );
210  turret.vehicle Unlink();
211 
212  turret.vehicle ‪vehicle::disconnect_paths( 0, false );
213 
214  turret.vehicle thread ‪TurretScanning();
215 
216  turret ‪play_deploy_anim();
217 
218  player ‪remote_weapons::UseRemoteWeapon( turret.vehicle, ‪TURRET_NAME, false );
219 }
220 
221 function ‪HackedCallbackPre( hacker )
222 {
223  turretVehicle = self;
224  turretVehicle ‪clientfield::set( "enemyvehicle", ENEMY_VEHICLE_HACKED );
225  turretVehicle.owner ‪clientfield::set_to_player( "static_postfx", 0 );
226  if( turretVehicle.controlled === true )
227  ‪visionset_mgr::deactivate( "visionset", ‪TURRET_VISIONSET_ALIAS, turretVehicle.owner );
228  turretVehicle.owner ‪remote_weapons::RemoveAndAssignNewRemoteControlTrigger( turretVehicle.useTrigger );
229  turretVehicle ‪remote_weapons::EndRemoteControlWeaponUse( true );
230  turretVehicle.owner unlink();
231  turretVehicle ‪clientfield::set( "vehicletransition", 0 );
232 }
233 
234 function ‪HackedCallbackPost( hacker )
235 {
236  turretVehicle = self;
237  hacker ‪remote_weapons::UseRemoteWeapon( turretVehicle, ‪TURRET_NAME, false );
238  turretVehicle notify( "WatchRemoteControlDeactivate_remoteWeapons" );
239  turretVehicle.killstreak_end_time = hacker ‪killstreak_hacking::set_vehicle_drivable_time_starting_now( turretVehicle );
240 }
241 
242 function ‪play_deploy_anim_after_wait( wait_time )
243 {
244  turret = self;
245  turret endon( "death" );
246 
247  wait wait_time;
248 
249  turret ‪play_deploy_anim();
250 }
251 
253 {
254  turret = self;
255 
256  turret ‪clientfield::set( "auto_turret_close", 0 );
257  turret.otherModel ‪clientfield::set( "auto_turret_close", 0 );
258 
259  if ( isdefined( turret.vehicle ))
260  {
261  turret.vehicle ‪clientfield::set( "auto_turret_open", 1 );
262  }
263 }
264 
265 function ‪OnCancelPlacement( turret )
266 {
267  turret notify( "sentry_turret_shutdown" );
268 }
269 
270 function ‪OnPickupTurret( turret )
271 {
272  player = self;
273  turret.vehicle Ghost();
274  turret.vehicle ‪turret::disable( 0 );
275  turret.vehicle LinkTo( turret );
276  Target_Remove( turret.vehicle );
277 
278  turret ‪clientfield::set( "auto_turret_close", 1 );
279  turret.otherModel ‪clientfield::set( "auto_turret_close", 1 );
280 
281  if ( isdefined( turret.vehicle ) )
282  {
283  turret.vehicle notify( "end_turret_scanning" );
284  turret.vehicle SetTurretTargetRelativeAngles( ( 0, 0, 0 ) );
285 
286  turret.vehicle ‪clientfield::set( "auto_turret_open", 0 );
287 
288  if( isdefined( turret.vehicle.useTrigger ) )
289  {
290  turret.vehicle.useTrigger Delete();
291  turret.vehicle playsound ("mpl_turret_down");
292  }
293 
294  turret.vehicle ‪vehicle::connect_paths();
295  }
296 }
297 
298 function ‪OnTurretDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal )
299 {
300  empDamage = int( iDamage + ( self.healthdefault * ‪TURRET_EMP_DAMAGE_PERCENTAGE ) + 0.5 );
301 
302  iDamage = self ‪killstreaks::OnDamagePerWeapon( ‪TURRET_NAME, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, self.maxhealth, undefined, self.maxhealth*0.4, undefined, empDamage, undefined, true, 1.0 );
303  self.damageTaken += iDamage;
304 
305  if ( self.controlled )
306  {
307  self.owner ‪vehicle::update_damage_as_occupant( self.damageTaken, self.maxHealth );
308  }
309 
310  // turret death
311  if ( self.damageTaken > self.maxHealth && !isdefined( self.will_die ) )
312  {
313  self.will_die = true;
314  self thread ‪OnDeathAfterFrameEnd( eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime );
315  }
316 
317  return iDamage;
318 }
319 
320 function ‪OnTurretDeath( eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime )
321 {
322  // currently, OnTurretDeath is not getting called, so we call OnDeath directly from OnTurretDamage
323  self ‪OnDeath( eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime );
324 }
325 
326 function ‪OnDeathAfterFrameEnd( eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime )
327 {
328  waittillframeend;
329 
330  if ( isdefined( self ) )
331  {
332  self ‪OnDeath( eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime );
333  }
334 }
335 
336 function ‪OnDeath( eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime )
337 {
338  turretVehicle = self;
339 
340  // only die once
341  if ( turretVehicle.dead === true )
342  return;
343 
344  turretVehicle.dead = true;
345 
346  turretVehicle DisableDriverFiring( true );
347  turretvehicle ‪turret::disable( 0 );
348 
349  turretvehicle ‪vehicle::connect_paths();
350 
351  eAttacker = self [[ level.figure_out_attacker ]]( eAttacker );
352 
353  if( isdefined( turretVehicle.parentStruct ) )
354  {
355  turretVehicle.parentStruct ‪placeables::ForceShutdown();
356 
357  if ( turretVehicle.parentStruct.killstreakTimedOut === true && isdefined( turretVehicle.owner ) )
358  {
359  turretVehicle.owner ‪globallogic_audio::play_taacom_dialog( "timeout", turretVehicle.parentStruct.killstreakType );
360  }
361  else
362  {
363  if ( isdefined( eAttacker ) && isdefined( turretVehicle.owner ) && ( eAttacker != turretVehicle.owner ) )
364  turretVehicle.parentStruct ‪killstreaks::play_destroyed_dialog_on_owner( turretVehicle.parentStruct.killstreakType, turretVehicle.parentStruct.killstreakId );
365  }
366  }
367 
368  if ( isdefined( eAttacker ) && IsPlayer( eAttacker ) && ( !isdefined( self.owner ) || self.owner ‪util::IsEnemyPlayer( eAttacker ) ) )
369  {
370  ‪scoreevents::processScoreEvent( "destroyed_sentry_gun", eAttacker, self, weapon );
371  eAttacker ‪challenges::destroyScoreStreak( weapon, turretVehicle.controlled, true, false );
373  eAttacker AddPlayerStat( "destroy_turret", 1 );
374  eAttacker AddWeaponStat( weapon, "destroy_turret", 1 );
375  LUINotifyEvent( &"player_callout", 2, &"KILLSTREAK_DESTROYED_AUTO_TURRET", eAttacker.entnum );
376  }
377 
378  turretVehicle ‪vehicle_death::death_fx();
379  turretVehicle playsound ("mpl_m_turret_exp");
380 
381  // anticipating futz
382 
383  wait 0.1;
384 
385  turretVehicle Ghost();
386  turretVehicle NotSolid();
387 
388  turretVehicle ‪util::waittill_any_timeout( 2.0, "remote_weapon_end" );
389 
390  if ( isdefined( turretVehicle ) )
391  {
392  // wait until control is released, vehicle gets deleted, or owner disconnects
393  while ( isdefined( turretVehicle ) && ( turretVehicle.controlled || !isdefined( turretVehicle.owner ) ) )
395 
396  turretVehicle.dontfreeme = undefined; // allows vehicle shared shutdown to finish
397 
398  // we decided to be responsible for deleting the vehicle, so we delete here
399  wait 0.5;
400  if ( isdefined ( turretVehicle ) )
401  turretVehicle delete();
402  }
403 }
404 
405 function ‪OnShutdown( turret )
406 {
407  turret notify( "sentry_turret_shutdown" );
408 }
409 
410 function ‪StartTurretRemoteControl( turretVehicle )
411 {
412  player = self;
413  assert( IsPlayer( player ) );
414 
415  turretVehicle ‪turret::disable( 0 );
416  turretVehicle UseVehicle( player, 0 );
417  turretVehicle ‪clientfield::set( "vehicletransition", 1 );
418  turretVehicle.controlled = true;
419  turretVehicle.treat_owner_damage_as_friendly_fire = false;
420  turretVehicle.ignore_team_kills = false;
421 
423  player ‪vehicle::update_damage_as_occupant( ‪VAL( turretVehicle.damageTaken, 0 ), ‪VAL( turretVehicle.maxHealth, 100 ) );
424 
425  ‪visionset_mgr::activate( "visionset", ‪TURRET_VISIONSET_ALIAS, self, 1, 90000, 1 );
426 }
427 
428 function ‪EndTurretRemoteControl( turretVehicle, exitRequestedByOwner )
429 {
430  if( exitRequestedByOwner )
431  {
432  turretVehicle thread ‪EnableTurretAfterWait( 0.1 ); // currently, this must be called after the player leaves the vehicle
433  }
434  turretVehicle ‪clientfield::set( "vehicletransition", 0 );
435 
436  if ( isdefined( turretVehicle.owner ) && ( turretVehicle.controlled === true ) )
437  ‪visionset_mgr::deactivate( "visionset", ‪TURRET_VISIONSET_ALIAS, turretVehicle.owner );
438 
439  turretVehicle.controlled = false;
440  turretVehicle.treat_owner_damage_as_friendly_fire = true;
441  turretVehicle.ignore_team_kills = true;
442 }
443 
444 function ‪EnableTurretAfterWait( wait_time ) // self == turretVehicle
445 {
446  self endon ( "death" );
447  if ( isdefined( self.owner ) )
448  {
449  self.owner endon( "joined_team" );
450  self.owner endon( "disconnect" );
451  self.owner endon( "joined_spectators" );
452  }
453 
454  wait wait_time;
455  self ‪turret::enable( 0, false );
456 }
457 
459 {
460  turret = self;
461 
462  preset = GetInfluencerPreset( ‪name );
463 
464  if ( !IsDefined( preset ) )
465  {
466  return;
467  }
468 
469  // place the influencer out infront of the turret
470  projected_point = turret.origin + VectorScale( AnglesToForward( turret.angles ), preset["radius"] * 0.7 );
471  return ‪spawning::create_enemy_influencer( ‪name, turret.origin, turret.team );
472 }
473 
475 {
476  self notify( "turret_watch_owner_events_singleton" );
477  self endon ( "tturet_watch_owner_events_singleton" );
478  self endon( "death" );
479 
480  self.owner ‪util::waittill_any( "joined_team", "disconnect", "joined_spectators" );
481 
482  self MakeVehicleUsable();
483  self.controlled = false;
484 
485  if ( isdefined( self.owner ) )
486  {
487  self.owner unlink();
488  self ‪clientfield::set( "vehicletransition", 0 );
489  }
490 
491  self MakeVehicleUnusable();
492 
493  if ( isdefined( self.owner ) )
494  {
496  }
497 
498  self.abandoned = true;
499 
500  ‪OnShutdown( self );
501 }
502 
504 {
505  turretVehicle = self;
506  turretVehicle endon( "death" );
507 
508  while( 1 )
509  {
510  laser_should_be_on = ( !turretVehicle.controlled && turretVehicle ‪turret::does_have_target( 0 ) );
511 
512  if ( laser_should_be_on )
513  {
514  if ( IsLaserOn( turretVehicle ) == false )
515  {
516  turretVehicle ‪turret::enable_laser( true, 0 );
517  }
518  }
519  else
520  {
521  if ( IsLaserOn( turretVehicle ) )
522  {
523  turretVehicle ‪turret::enable_laser( false, 0 );
524  }
525  }
526 
527  wait 0.25;
528  }
529 }
530 
532 {
533  turretVehicle = self;
534 
535  turretVehicle endon( "death" );
536  old_target = undefined;
537 
538  while( 1 )
539  {
540  turretVehicle waittill( "has_new_target", new_target );
541 
542  if ( isdefined( old_target ) )
543  old_target notify( "abort_death_watch" );
544 
545  new_target thread ‪target_death_watch( turretVehicle );
546  old_target = new_target;
547  }
548 }
549 
550 function ‪target_death_watch( turretVehicle )
551 {
552  target = self;
553  target endon( "abort_death_watch" );
554 
555  turretVehicle endon( "death" );
556 
557  target ‪util::waittill_any( "death", "disconnect", "joined_team", "joined_spectators" );
558 
559  turretVehicle ‪turret::stop( 0, true );
560 }
561 
563 {
564  turretVehicle = self;
565 
566  turretVehicle endon( "death" );
567  turretVehicle endon( "end_turret_scanning" );
568 
569  turret_data = turretVehicle ‪_get_turret_data( 0 );
570 
571  turretVehicle.do_not_clear_targets_during_think = true; // don't let shared turret code clear targets; TurretScanning will clear targets
572  // note: turret:clear_target() indirectly affects targetType which affects how SetTurretTargetRelativeAngles behaves.
573 
574  wait 0.8;
575 
576  while( 1 )
577  {
578  if ( turretVehicle.controlled )
579  {
580  wait 0.5;
581  continue;
582  }
583 
584  if ( turretVehicle ‪turret::does_have_target( 0 ) )
585  {
586  wait 0.25;
587  continue;
588  }
589 
590  /# turret_data = turretVehicle ‪_get_turret_data( 0 ); #/ // for live update
591 
592  turretVehicle ‪turret::clear_target( 0 );
593 
594  if ( turretVehicle.scanPos === "left" )
595  {
596  turretVehicle SetTurretTargetRelativeAngles( ( 0, ( turret_data.leftArc - ‪TURRET_SCAN_ANGLE_BUFFER ), 0 ), 0 );
597  turretVehicle.scanPos = "right";
598  }
599  else
600  {
601  turretVehicle SetTurretTargetRelativeAngles( ( 0, -( turret_data.rightArc - ‪TURRET_SCAN_ANGLE_BUFFER ), 0 ), 0 );
602  turretVehicle.scanPos = "left";
603  }
604 
605  wait ‪TURRET_SCAN_WAIT;
606  }
607 }
608 
609 function ‪WatchTurretShutdown( killstreakId, team )
610 {
611  turret = self;
612 
613  turret waittill( "sentry_turret_shutdown" );
614 
615  ‪killstreakrules::killstreakStop( ‪TURRET_NAME, team, killstreakId );
616 
617  if( isdefined( turret.vehicle ) )
618  {
619  turret.vehicle ‪spawning::remove_influencers();
620  }
621 }
‪processScoreEvent
‪function processScoreEvent(event, player, victim, weapon)
Definition: scoreevents_shared.gsc:19
‪UseRemoteWeapon
‪function UseRemoteWeapon(weapon, weaponName, immediate, allowManualDeactivation=true, always_allow_ride=false)
Definition: _remote_weapons.gsc:74
‪EnableTurretAfterWait
‪function EnableTurretAfterWait(wait_time)
Definition: _turret.gsc:444
‪enable
‪function enable(handler)
Definition: _perplayer.gsc:54
‪activate
‪function activate()
Definition: traps_shared.gsc:655
‪OnCancelPlacement
‪function OnCancelPlacement(turret)
Definition: _turret.gsc:265
‪OnDeathAfterFrameEnd
‪function OnDeathAfterFrameEnd(eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime)
Definition: _turret.gsc:326
‪EndTurretRemoteControl
‪function EndTurretRemoteControl(turretVehicle, exitRequestedByOwner)
Definition: _turret.gsc:428
‪HackedCallbackPost
‪function HackedCallbackPost(hacker)
Definition: _turret.gsc:234
‪create_enemy_influencer
‪function create_enemy_influencer(name, origin, team)
Definition: _spawning.gsc:285
‪ForceShutdown
‪function ForceShutdown()
Definition: _placeables.gsc:455
‪TURRET_VISIONSET_ALIAS
‪#define TURRET_VISIONSET_ALIAS
Definition: _killstreaks.gsh:336
‪set_max_target_distance
‪function set_max_target_distance(n_distance, n_index)
Definition: turret_shared.gsc:842
‪clear_target
‪function clear_target(n_index)
Definition: turret_shared.gsc:791
‪OnPickupTurret
‪function OnPickupTurret(turret)
Definition: _turret.gsc:270
‪TURRET_INVALID_PLACEMENT_MODEL
‪#define TURRET_INVALID_PLACEMENT_MODEL
Definition: _killstreaks.gsh:25
‪set_to_player
‪function set_to_player(str_field_name, n_value)
Definition: clientfield_shared.gsc:58
‪connect_paths
‪function connect_paths()
Definition: vehicle_shared.gsc:3592
‪TURRET_MAX_TARGET_DISTANCE
‪#define TURRET_MAX_TARGET_DISTANCE
Definition: _killstreaks.gsh:30
‪TURRET_NAME
‪#define TURRET_NAME
Definition: _turret.gsc:49
‪TURRET_SCAN_WAIT
‪#define TURRET_SCAN_WAIT
Definition: _turret.gsc:51
‪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
‪destroyScoreStreak
‪function destroyScoreStreak(weapon, playerControlled, groundBased, countAsKillstreakVehicle=true)
Definition: challenges_shared.gsc:784
‪ActivateTurret
‪function ActivateTurret()
Definition: _turret.gsc:115
‪VAL
‪#define VAL(__var, __default)
Definition: shared.gsh:272
‪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
‪ENEMY_VEHICLE_ACTIVE
‪#define ENEMY_VEHICLE_ACTIVE
Definition: _hacker_tool.gsh:2
‪TURRET_EMP_DAMAGE_PERCENTAGE
‪#define TURRET_EMP_DAMAGE_PERCENTAGE
Definition: _killstreaks.gsh:34
‪set_target_leading
‪function set_target_leading(n_index, n_target_leading_factor=0.1)
Definition: turret_shared.gsc:626
‪TURRET_VALID_PLACEMENT_MODEL
‪#define TURRET_VALID_PLACEMENT_MODEL
Definition: _killstreaks.gsh:24
‪set_min_target_distance_squared
‪function set_min_target_distance_squared(n_distance_squared, n_index)
Definition: turret_shared.gsc:874
‪waittill_any_timeout
‪function waittill_any_timeout(n_timeout, string1, string2, string3, string4, string5)
Definition: util_shared.csc:423
‪set_team
‪function set_team(str_team, n_index)
Definition: turret_shared.gsc:371
‪set_on_target_angle
‪function set_on_target_angle(n_angle, n_index)
Definition: turret_shared.gsc:643
‪TURRET_VISIONSET_LERP_STEP_COUNT
‪#define TURRET_VISIONSET_LERP_STEP_COUNT
Definition: _killstreaks.gsh:348
‪play_deploy_anim
‪function play_deploy_anim()
Definition: _turret.gsc:252
‪RegisterRemoteWeapon
‪function RegisterRemoteWeapon(weaponName, hintString, useCallback, endUseCallback, hideCompassOnUse=true)
Definition: _remote_weapons.gsc:63
‪disable
‪function disable(handler)
Definition: _perplayer.gsc:79
‪DisplayKillstreakTeamMessageToAll
‪function DisplayKillstreakTeamMessageToAll(killstreak, player)
Definition: popups_shared.gsc:91
‪does_have_target
‪function does_have_target(n_index)
Definition: turret_shared.gsc:1618
‪IsEnemyPlayer
‪function IsEnemyPlayer(player)
Definition: util_shared.csc:1220
‪SpawnPlaceable
‪function SpawnPlaceable(killstreakRef, killstreakId, onPlaceCallback, onCancelCallback, onMoveCallback, onShutdownCallback, onDeathCallback, onEmpCallback, model, validModel, invalidModel, spawnsVehicle, pickupString, timeout, health, empDamage, placeHintString, invalidLocationHintString)
Definition: _placeables.gsc:20
‪RemoveAndAssignNewRemoteControlTrigger
‪function RemoveAndAssignNewRemoteControlTrigger(remoteControlTrigger)
Definition: _remote_weapons.gsc:38
‪enable_laser
‪function enable_laser(b_enable, n_index)
Definition: turret_shared.gsc:260
‪OnDeath
‪function OnDeath(eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime)
Definition: _turret.gsc:336
‪TURRET_HEALTH
‪#define TURRET_HEALTH
Definition: _killstreaks.gsh:33
‪set_vehicle_drivable_time
‪function set_vehicle_drivable_time(duration_ms, end_time_ms)
Definition: vehicle_shared.gsc:3703
‪TURRET_MODEL
‪#define TURRET_MODEL
Definition: _killstreaks.gsh:23
‪HackedCallbackPre
‪function HackedCallbackPre(hacker)
Definition: _turret.gsc:221
‪InitTurret
‪function InitTurret()
Definition: _turret.gsc:80
‪set_torso_targetting
‪function set_torso_targetting(n_index, n_torso_targetting_offset=(-12))
Definition: turret_shared.gsc:619
‪OnTurretDamage
‪function OnTurretDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal)
Definition: _turret.gsc:298
‪TURRET_WATCH_DEATH_DURATION
‪#define TURRET_WATCH_DEATH_DURATION
Definition: _killstreaks.gsh:36
‪play_destroyed_dialog_on_owner
‪function play_destroyed_dialog_on_owner(killstreakType, killstreakId)
Definition: _killstreaks.gsc:1982
‪TURRET_REMOTE_TEXT
‪#define TURRET_REMOTE_TEXT
Definition: _killstreaks.gsh:26
‪death_fx
‪function death_fx()
Definition: _qrdrone.gsc:958
‪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
‪ghost_wait_show
‪function ghost_wait_show(wait_time=0.1)
Definition: _util.gsc:916
‪ghost_wait_show_to_player
‪function ghost_wait_show_to_player(player, wait_time=0.1, self_endon_string1)
Definition: _util.gsc:937
‪get_max_health
‪function get_max_health(killstreakType)
Definition: _killstreak_bundles.gsc:188
‪remove_influencers
‪function remove_influencers()
Definition: _spawning.gsc:405
‪play_deploy_anim_after_wait
‪function play_deploy_anim_after_wait(wait_time)
Definition: _turret.gsc:242
‪register_dialog
‪function register_dialog(killstreakType, informDialog, taacomDialogBundleKey, pilotDialogArrayKey, startDialogKey, enemyStartDialogKey, enemyStartMultipleDialogKey, hackedDialogKey, hackedStartDialogKey, requestDialogKey, threatDialogKey, isInventory)
Definition: _killstreaks.gsc:239
‪update_damage_as_occupant
‪function update_damage_as_occupant(damage_taken, max_health)
Definition: vehicle_shared.gsc:3709
‪INVALID_KILLSTREAK_ID
‪#define INVALID_KILLSTREAK_ID
Definition: _killstreaks.gsh:2
‪set_vehicle_drivable_time_starting_now
‪function set_vehicle_drivable_time_starting_now(killstreak, duration_ms=(-1))
Definition: _killstreak_hacking.gsc:140
‪TURRET_SCAN_ANGLE_BUFFER
‪#define TURRET_SCAN_ANGLE_BUFFER
Definition: _turret.gsc:50
‪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
‪TURRET_TARGET_ANGLE
‪#define TURRET_TARGET_ANGLE
Definition: _killstreaks.gsh:31
‪register_info
‪function register_info(type, name, version, lerp_step_count)
Definition: visionset_mgr_shared.csc:334
‪_get_turret_data
‪function _get_turret_data(n_index)
Definition: turret_shared.gsc:1725
‪OnShutdown
‪function OnShutdown(turret)
Definition: _turret.gsc:405
‪stop
‪function stop(n_blend=0.2)
Definition: animation_shared.gsc:97
‪setup_death_watch_for_new_targets
‪function setup_death_watch_for_new_targets()
Definition: _turret.gsc:531
‪PLACEABLE_MOVEABLE_TIMEOUT_EXTENSION_TU1
‪#define PLACEABLE_MOVEABLE_TIMEOUT_EXTENSION_TU1
Definition: _turret.gsc:52
‪TURRET_DURATION
‪#define TURRET_DURATION
Definition: _killstreaks.gsh:32
‪killstreakStart
‪function killstreakStart(hardpointType, team, hacked, displayTeamMessage)
Definition: _killstreakrules.gsc:184
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪TURRET_HIDE_COMPASS_ON_REMOTE_CONTROL
‪#define TURRET_HIDE_COMPASS_ON_REMOTE_CONTROL
Definition: _killstreaks.gsh:331
‪configure_team
‪function configure_team(killstreakType, killstreakId, owner, influencerType, configureTeamPreFunction, configureTeamPostFunction, isHacked=false)
Definition: _killstreaks.gsc:2806
‪EndRemoteControlWeaponUse
‪function EndRemoteControlWeaponUse(exitRequestedByOwner)
Definition: _remote_weapons.gsc:369
‪register_alt_weapon
‪function register_alt_weapon(killstreakType, weaponName, isInventory)
Definition: _killstreaks.gsc:318
‪target_death_watch
‪function target_death_watch(turretVehicle)
Definition: _turret.gsc:550
‪turret_laser_watch
‪function turret_laser_watch()
Definition: _turret.gsc:503
‪clear_using_remote
‪function clear_using_remote(immediate, skipNotify)
Definition: _killstreaks.gsc:2403
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪TURRET_VEHICLE_NAME
‪#define TURRET_VEHICLE_NAME
Definition: _killstreaks.gsh:22
‪CreateTurretInfluencer
‪function CreateTurretInfluencer(name)
Definition: _turret.gsc:458
‪play_taacom_dialog
‪function play_taacom_dialog(dialogKey, killstreakType, killstreakId)
Definition: _globallogic_audio.gsc:274
‪register_remote_override_weapon
‪function register_remote_override_weapon(killstreakType, weaponName, isInventory)
Definition: _killstreaks.gsc:349
‪enable_hacking
‪function enable_hacking(killstreakName, preHackFunction, postHackFunction)
Definition: _killstreak_hacking.gsc:22
‪destroyNonAirScoreStreak_PostStatsLock
‪function destroyNonAirScoreStreak_PostStatsLock(weapon)
Definition: challenges_shared.gsc:126
‪TurretScanning
‪function TurretScanning()
Definition: _turret.gsc:562
‪disconnect_paths
‪function disconnect_paths(detail_level=2, move_allowed=true)
Definition: vehicle_shared.gsc:3580
‪name
‪class GroundFx name
‪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
‪WatchTurretShutdown
‪function WatchTurretShutdown(killstreakId, team)
Definition: _turret.gsc:609
‪OnPlaceTurret
‪function OnPlaceTurret(turret)
Definition: _turret.gsc:149
‪TURRET_PICKUP_TEXT
‪#define TURRET_PICKUP_TEXT
Definition: _killstreaks.gsh:29
‪init
‪function init()
Definition: _turret.gsc:56
‪StartTurretRemoteControl
‪function StartTurretRemoteControl(turretVehicle)
Definition: _turret.gsc:410
‪turret_watch_owner_events
‪function turret_watch_owner_events()
Definition: _turret.gsc:474
‪ghost_wait_show_to_others
‪function ghost_wait_show_to_others(player, wait_time=0.1, self_endon_string1)
Definition: _util.gsc:977
‪OnTurretDeath
‪function OnTurretDeath(eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime)
Definition: _turret.gsc:320
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265