‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_ai_tank.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\callbacks_shared;
6 #using scripts\shared\challenges_shared;
7 #using scripts\shared\clientfield_shared;
8 #using scripts\shared\hud_shared;
9 #using scripts\shared\killstreaks_shared;
10 #using scripts\shared\scoreevents_shared;
11 #using scripts\shared\system_shared;
12 #using scripts\shared\util_shared;
13 #using scripts\shared\weapons\_weapons;
14 #using scripts\shared\vehicle_ai_shared;
15 #using scripts\shared\vehicle_shared;
16 #using scripts\shared\vehicles\_amws;
17 
18 #using scripts\mp\_challenges;
19 #using scripts\mp\_util;
20 #using scripts\mp\gametypes\_dev;
21 #using scripts\mp\gametypes\_spawning;
22 #using scripts\mp\gametypes\_spawnlogic;
23 #using scripts\mp\killstreaks\_dogs;
24 #using scripts\mp\killstreaks\_emp;
25 #using scripts\mp\killstreaks\_killstreak_bundles;
26 #using scripts\mp\killstreaks\_killstreak_detect;
27 #using scripts\mp\killstreaks\_killstreak_hacking;
28 #using scripts\mp\killstreaks\_killstreakrules;
29 #using scripts\mp\killstreaks\_killstreaks;
30 #using scripts\mp\killstreaks\_remote_weapons;
31 #using scripts\mp\killstreaks\_satellite;
32 #using scripts\mp\killstreaks\_supplydrop;
33 #using scripts\mp\killstreaks\_uav;
34 #using scripts\shared\visionset_mgr_shared;
35 
36 #insert scripts\mp\_hacker_tool.gsh;
37 #insert scripts\mp\killstreaks\_killstreaks.gsh;
38 #insert scripts\shared\shared.gsh;
39 #insert scripts\shared\version.gsh;
40 
41 #define AI_TANK_WEAPON_NAME "ai_tank_marker"
42 #define AI_TANK_HEALTH 1500
43 #define AI_TANK_PATH_TIMEOUT 45
44 #define AI_TANK_BULLET_MITIGATION .8
45 #define AI_TANK_EXPLOSIVE_MITIGATION 1
46 #define AI_TANK_STUN_DURATION 4
47 #define AI_TANK_STUN_DURATION_PROXIMITY 1.5
48 #define AI_TANK_MISSILE_TURRET 0
49 #define AI_TANK_GUN_TURRET 1
50 #define AI_TANK_MISSILE_FLASH_TAG "tag_flash"
51 #define AI_TANK_GUNNER_FLASH_TAG "tag_flash_gunner1"
52 #define AI_TANK_GUNNER_AIM_TAG "tag_gunner_aim1"
53 #define AI_TANK_GUNNER_AIM_OFFSET -24
54 #define AI_TANK_THINK_DEBUG GetDvarInt( "scr_ai_tank_think_debug" )
55 #define AI_TANK_TIME_TO_WAIT_FOR_LOST_TARGET 5
56 #define AI_TANK_FURTHEST_FROM_NAVMESH_ALLOWED ( 40 * 12 )
57 
58 #define AI_TANK_NAV_MESH_VALID_LOCATION_BOUNDARY 16
59 #define AI_TANK_NAV_MESH_VALID_LOCATION_TOLERANCE 4
60 
61 #precache( "string", "KILLSTREAK_EARNED_AI_TANK_DROP" );
62 #precache( "string", "KILLSTREAK_AI_TANK_NOT_AVAILABLE" );
63 #precache( "string", "KILLSTREAK_AI_TANK_INBOUND" );
64 #precache( "string", "KILLSTREAK_AI_TANK_HACKED" );
65 #precache( "string", "KILLSTREAK_DESTROYED_AI_TANK" );
66 #precache( "string", "mpl_killstreak_ai_tank" );
67 #precache( "triggerstring", "MP_REMOTE_USE_TANK" );
68 #precache( "fx", "killstreaks/fx_agr_emp_stun" );
69 #precache( "fx", "killstreaks/fx_agr_rocket_flash_1p" );
70 #precache( "fx", "killstreaks/fx_agr_rocket_flash_3p" );
71 #precache( "fx", "killstreaks/fx_agr_damage_state" );
72 #precache( "fx", "killstreaks/fx_agr_explosion" );
73 #precache( "fx", "killstreaks/fx_agr_drop_box" );
74 
75 #using_animtree ( "mp_vehicles" );
76 
77 #namespace ai_tank;
78 
79 function ‪init()
80 {
81  bundle = ‪struct::get_script_bundle( "killstreak", "killstreak_" + ‪AI_TANK_AGR_NAME );
82 
83  level.ai_tank_minigun_flash_3p = "killstreaks/fx_agr_rocket_flash_3p";
84 
85  ‪killstreaks::register( ‪AI_TANK_AGR_NAME, ‪AI_TANK_WEAPON_NAME, "killstreak_ai_tank_drop", "ai_tank_drop_used",&‪useKillstreakAITankDrop );
86 
89  ‪killstreaks::register_alt_weapon( ‪AI_TANK_AGR_NAME, "amws_gun_turret_mp_player" );
90  ‪killstreaks::register_alt_weapon( ‪AI_TANK_AGR_NAME, "amws_launcher_turret_mp_player" );
91 
93  ‪killstreaks::register_strings( ‪AI_TANK_AGR_NAME, &"KILLSTREAK_EARNED_AI_TANK_DROP", &"KILLSTREAK_AI_TANK_NOT_AVAILABLE", &"KILLSTREAK_AI_TANK_INBOUND", undefined, &"KILLSTREAK_AI_TANK_HACKED" );
94  ‪killstreaks::register_dialog( ‪AI_TANK_AGR_NAME, "mpl_killstreak_ai_tank", "aiTankDialogBundle", "aiTankPilotDialogBundle", "friendlyAiTank", "enemyAiTank", "enemyAiTankMultiple", "friendlyAiTankHacked", "enemyAiTankHacked", "requestAiTank", "threatAiTank" );
95 
96  // TODO: Move to killstreak data
97  level.killstreaks[‪AI_TANK_AGR_NAME].threatOnKill = true;
98 
100 
101  level.ai_tank_fov = Cos( 160 );
102  level.ai_tank_turret_weapon = GetWeapon( "ai_tank_drone_gun" );
103  level.ai_tank_turret_fire_rate = level.ai_tank_turret_weapon.fireTime;
104  level.ai_tank_remote_weapon = GetWeapon( "killstreak_ai_tank" );
105 
106  spawns = ‪spawnlogic::get_spawnpoint_array( "mp_tdm_spawn" );
107 
108  level.ai_tank_damage_fx = "killstreaks/fx_agr_damage_state";
109  level.ai_tank_explode_fx = "killstreaks/fx_agr_explosion";
110  level.ai_tank_crate_explode_fx = "killstreaks/fx_agr_drop_box";
111 
112  anims = [];
113  anims[ anims.size ] = %o_drone_tank_missile1_fire;
114  anims[ anims.size ] = %o_drone_tank_missile2_fire;
115  anims[ anims.size ] = %o_drone_tank_missile3_fire;
116  anims[ anims.size ] = %o_drone_tank_missile_full_reload;
117 
118  ‪DEFAULT( bundle.ksMainTurretRecoilForceZOffset, 0 );
119  ‪DEFAULT( bundle.ksWeaponReloadTime, 0.5 );
120 
122 
123  thread register();
124 }
125 
126 function register()
127 {
128  ‪clientfield::register( "vehicle", "ai_tank_death", ‪VERSION_SHIP, 1, "int" );
129  ‪clientfield::register( "vehicle", "ai_tank_missile_fire", ‪VERSION_SHIP, 2, "int" );
130  ‪clientfield::register( "vehicle", "ai_tank_stun", ‪VERSION_SHIP, 1, "int" );
131  ‪clientfield::register( "toplayer", "ai_tank_update_hud", ‪VERSION_SHIP, 1, "counter" );
132 }
133 
134 function ‪useKillstreakAITankDrop(hardpointType)
135 {
136  team = self.team;
137 
138  if( !self ‪supplydrop::isSupplyDropGrenadeAllowed( hardpointType ) )
139  {
140  return false;
141  }
142 
143  killstreak_id = self ‪killstreakrules::killstreakStart( hardpointType, team, false, false );
144  if ( killstreak_id == -1 )
145  {
146  return false;
147  }
148 
149  context = SpawnStruct();
150  if ( !isdefined( context ) )
151  {
152  ‪killstreak_stop_and_assert( hardpointType, team, killstreak_id, "Failed to spawn struct for ai tank." );
153  return false;
154  }
155 
156  context.radius = level.killstreakCoreBundle.ksAirdropAITankRadius;
157  context.dist_from_boundary = ‪AI_TANK_NAV_MESH_VALID_LOCATION_BOUNDARY;
158  context.max_dist_from_location = ‪AI_TANK_NAV_MESH_VALID_LOCATION_TOLERANCE;
159  context.perform_physics_trace = true;
160  context.check_same_floor = true;
161  context.isLocationGood = &‪is_location_good;
162  context.objective = &"airdrop_aitank";
163  context.killstreakRef = hardpointType;
164  context.validLocationSound = level.killstreakCoreBundle.ksValidAITankLocationSound;
166  context.dropTag = "tag_attach";
167  context.dropTagOffset = ( -35, 0, 10 );
168 
169  ‪result = self ‪supplydrop::useSupplyDropMarker( killstreak_id, context );
170 
171  // the marker is out but the chopper is yet to come
172  self notify( "supply_drop_marker_done" );
173 
174  if ( !isdefined(‪result) || !‪result )
175  {
176  //if( !self.supplyGrenadeDeathDrop )
177  ‪killstreakrules::killstreakStop( hardpointType, team, killstreak_id );
178  return false;
179  }
180 
181  self ‪killstreaks::play_killstreak_start_dialog( ‪AI_TANK_AGR_NAME, self.team, killstreak_id );
183  self AddWeaponStat( GetWeapon( ‪AI_TANK_WEAPON_NAME ), "used", 1 );
184 
185  return ‪result;
186 }
187 
188 function ‪crateLand( crate, category, owner, team, context )
189 {
190  // note: original context is being changed here
191  context.perform_physics_trace = false;
192  context.dist_from_boundary = 24;
193  context.max_dist_from_location = 96;
194 
195  if ( !crate ‪is_location_good( crate.origin, context ) || !isdefined( owner ) || team != owner.team || ( owner ‪EMP::EnemyEMPActive() && !owner hasperk("specialty_immuneemp") ) )
196  {
197  ‪killstreakrules::killstreakStop( category, team, crate.package_contents_id );
198  wait( 10 );
199 
200  if ( isdefined( crate ) )
201  crate delete();
202 
203  return;
204  }
205 
206  origin = crate.origin;
207 
208  crateBottom = BulletTrace( origin, origin + (0, 0, -50), false, crate );
209  if ( isdefined( crateBottom ) )
210  {
211  origin = crateBottom["position"] + (0,0,1);
212  }
213 
214  PlayFX( level.ai_tank_crate_explode_fx, origin, (1, 0, 0), (0, 0, 1) );
215  PlaySoundAtPosition( "veh_talon_crate_exp", crate.origin );
216 
217  level thread ‪ai_tank_killstreak_start( owner, origin, crate.package_contents_id, category );
218 
219  crate delete();
220 }
221 
222 function ‪is_location_good( location, context )
223 {
224  return ‪supplydrop::IsLocationGood( location, context ) && ‪valid_location( location );
225 }
226 
227 function ‪valid_location( location )
228 {
229  if ( !isdefined( location ) )
230  location = self.origin;
231 
232  // only do this check if we are not the player, intended for deploy box only
233  if ( !isPlayer( self ) )
234  {
235  start = self GetCentroid();
236  ‪end = location + ( 0, 0, 16 );
237 
238  ‪trace = PhysicsTrace( start, ‪end, ( 0, 0, 0 ), ( 0, 0, 0 ), self, ‪PHYSICS_TRACE_MASK_VEHICLE_CLIP );
239 
240  if ( ‪trace["fraction"] < 1 )
241  return false;
242  }
243 
245  {
246  return false;
247  }
248 
249  return true;
250 }
251 
252 function ‪HackedCallbackPre( hacker )
253 {
254  drone = self;
255  drone ‪clientfield::set( "enemyvehicle", ENEMY_VEHICLE_HACKED );
256  drone.owner ‪stop_remote();
257  drone.owner ‪clientfield::set_to_player( "static_postfx", 0 );
258  if( drone.controlled === true )
259  ‪visionset_mgr::deactivate( "visionset", ‪AI_TANK_VISIONSET_ALIAS, drone.owner );
260  drone.owner ‪remote_weapons::RemoveAndAssignNewRemoteControlTrigger( drone.useTrigger );
262  drone.owner unlink();
263  drone ‪clientfield::set( "vehicletransition", 0 );
264 }
265 
266 function ‪HackedCallbackPost( hacker )
267 {
268  drone = self;
269 
270  hacker ‪remote_weapons::UseRemoteWeapon( drone, "killstreak_ai_tank", false );
271  drone notify("WatchRemoteControlDeactivate_remoteWeapons");
272  drone.killstreak_end_time = hacker ‪killstreak_hacking::set_vehicle_drivable_time_starting_now( drone );
273 }
274 
276 {
277  drone = self;
278  drone thread ‪tank_watch_owner_events();
279 }
280 
281 function ‪ai_tank_killstreak_start( owner, origin, killstreak_id, category )
282 {
283  team = owner.team;
284 
285  waittillframeend;
286 
287  if ( level.gameEnded )
288  return;
289 
290  drone = SpawnVehicle( "spawner_bo3_ai_tank_mp", origin, (0, 0, 0), "talon" );
291 
292  if ( !isdefined( drone ) )
293  {
294  ‪killstreak_stop_and_assert( category, team, killstreak_id, "Failed to spawn ai tank vehicle." );
295  return;
296  }
297 
298  drone.settings = ‪struct::get_script_bundle( "vehiclecustomsettings", drone.scriptbundlesettings );
299 
300  drone.customDamageMonitor = true; // Disable the default monitor_damage_as_occupant thread
301  drone.avoid_shooting_owner = true;
302  drone.avoid_shooting_owner_ref_tag = ‪AI_TANK_GUNNER_FLASH_TAG;
303 
304  drone ‪killstreaks::configure_team( ‪AI_TANK_AGR_NAME, killstreak_id, owner, "small_vehicle", undefined, &‪ConfigureTeamPost );
306 
308  drone.original_vehicle_type = drone.vehicletype;
309 
310  drone ‪clientfield::set( "enemyvehicle", ‪ENEMY_VEHICLE_ACTIVE );
311  drone SetVehicleAvoidance( true );
312  drone ‪clientfield::set( "ai_tank_missile_fire", ‪AI_TANK_MISSLE_COUNT_AFTER_RELOAD );
313  drone.killstreak_id = killstreak_id;
314  drone.type = "tank_drone";
315  drone.dontDisconnectPaths = 1;
316  drone.isStunned = false;
317  drone.soundmod = "drone_land";
318  drone.ignore_vehicle_underneath_splash_scalar = true;
319  drone.treat_owner_damage_as_friendly_fire = true;
320  drone.ignore_team_kills = true;
321 
322  drone.controlled = false;
323  drone MakeVehicleUnusable();
324 
325  drone.numberRockets = ‪AI_TANK_MISSLE_COUNT_AFTER_RELOAD;
326  drone.warningShots = 3;
327  drone SetDrawInfrared( true );
328 
329  //set up number for this drone
330  if (!isdefined(drone.owner.numTankDrones))
331  drone.owner.numTankDrones=1;
332  else
333  drone.owner.numTankDrones++;
334  drone.ownerNumber = drone.owner.numTankDrones;
335 
336  // make the drone targetable
337  Target_Set( drone, (0,0,20) );
338  Target_SetTurretAquire( drone, false );
339 
340  // setup target group for missile lock on monitoring
342  drone ‪vehicle::add_to_target_group( drone );
343 
344  drone ‪setup_gameplay_think( category );
345 
346  drone.killstreak_end_time = GetTime() + ‪AI_TANK_LIFETIME;
347 
348  owner ‪remote_weapons::UseRemoteWeapon( drone, "killstreak_ai_tank", false );
349 
350  drone thread ‪kill_monitor();
351  drone thread ‪deleteOnKillbrush( drone.owner );
352  drone thread ‪tank_rocket_watch_ai();
353  level thread ‪tank_game_end_think(drone);
354 }
355 
356 function ‪get_vehicle_name( vehicle_version )
357 {
358  switch( vehicle_version )
359  {
360  case 2:
361  default:
362  return "spawner_bo3_ai_tank_mp";
363  break;
364 
365  case 1:
366  return "ai_tank_drone_mp";
367  break;
368  }
369 }
370 
371 function ‪setup_gameplay_think( category )
372 {
373  drone = self;
374 
375  drone thread ‪tank_abort_think();
376  drone thread ‪tank_team_kill();
378  drone thread ‪tank_death_think( category );
379  drone thread ‪tank_damage_think();
380  drone thread ‪WatchWater();
381 }
382 
384 {
385  self endon( "death" );
386  self.owner waittill( "teamKillKicked" );
387  self notify ( "death" );
388 }
389 
390 function ‪kill_monitor()
391 {
392  self endon( "death" );
393 
394  last_kill_vo = 0;
395  kill_vo_spacing = 4000;
396 
397  while(1)
398  {
399  self waittill( "killed", victim );
400 
401  if ( !isdefined( self.owner ) || !isdefined( victim ) )
402  continue;
403 
404  if ( self.owner == victim )
405  continue;
406 
407  if ( level.teamBased && self.owner.team == victim.team )
408  continue;
409 
410  if ( !self.controlled && last_kill_vo + kill_vo_spacing < GetTime() )
411  {
412  self ‪killstreaks::play_pilot_dialog_on_owner( "kill", ‪AI_TANK_AGR_NAME, self.killstreak_id );
413 
414  last_kill_vo = GetTime();
415  }
416  }
417 }
418 
420 {
421  tank = self;
422 
424 }
425 
427 {
429 
430  self.timed_out = true;
431 
432  self notify( "death" );
433 }
434 
436 {
437  self notify( "tank_watch_owner_events_singleton" );
438  self endon ( "tank_watch_owner_events_singleton" );
439  self endon( "death" );
440 
441  self.owner ‪util::waittill_any( "joined_team", "disconnect", "joined_spectators" );
442 
443  self MakeVehicleUsable();
444  self.controlled = false;
445 
446  if ( isdefined( self.owner ) )
447  {
448  self.owner unlink();
449  self ‪clientfield::set( "vehicletransition", 0 );
450  }
451 
452  self MakeVehicleUnusable();
453 
454  if ( isdefined( self.owner ) && ( self.controlled === true ) )
455  {
456  ‪visionset_mgr::deactivate( "visionset", ‪AI_TANK_VISIONSET_ALIAS, self.owner );
457  self.owner ‪stop_remote();
458  }
459 
460  self.abandoned = true;
461 
462  self notify( "death" );
463 }
464 
465 function ‪tank_game_end_think(drone)
466 {
467  drone endon( "death" );
468 
469  level waittill("game_ended");
470 
471  drone notify( "death" );
472 }
473 
474 
475 function ‪stop_remote() // dead
476 {
477  if ( !isdefined( self ) )
478  return;
479 
482  self ‪util::clientNotify( "nofutz" );
483 }
484 
485 
487 {
488  tank = self;
489  hackedDamageTaken = tank.defaultMaxHealth - tank.hackedHealth;
490  assert ( hackedDamageTaken > 0 );
491  if ( hackedDamageTaken > tank.damageTaken )
492  {
493  tank.damageTaken = hackedDamageTaken;
494  }
495 }
496 
497 
499 {
500  self endon( "death" );
501 
502  assert( isdefined( self.maxhealth ) );
503  self.defaultMaxHealth = self.maxhealth;
504  maxhealth = self.maxhealth; // actual max heath should be set now.
505 
506  self.maxhealth = 999999;
507  self.health = self.maxhealth;
508  self.isStunned = false;
509 
510  self.hackedHealthUpdateCallback = &‪tank_hacked_health_update;
512 
513  low_health = false;
514  self.damageTaken = 0;
515 
516  for ( ;; )
517  {
518  self waittill( "damage", ‪damage, attacker, dir, point, mod, model, tag, part, weapon, flags, inflictor, chargeLevel );
519 
520  self.maxhealth = 999999;
521  self.health = self.maxhealth;
522 
523  if ( weapon.isEmp && (mod == "MOD_GRENADE_SPLASH"))
524  {
525  emp_damage_to_apply = ‪killstreak_bundles::get_emp_grenade_damage( ‪AI_TANK_AGR_NAME, maxhealth );
526 
527  if ( !isdefined( emp_damage_to_apply ) )
528  emp_damage_to_apply = ( maxhealth / 2 );
529 
530  self.damageTaken += emp_damage_to_apply;
531  ‪damage = 0;
532  if ( !self.‪isStunned && emp_damage_to_apply > 0 )
533  {
534  self.isStunned = true;
536  self thread ‪tank_stun( ‪AI_TANK_STUN_DURATION );
537  }
538  }
539 
540  if ( !self.‪isStunned )
541  {
542  if ( weapon.doStun && (mod == "MOD_GRENADE_SPLASH" || mod == "MOD_GAS") )
543  {
544  self.isStunned = true;
546  }
547  }
548 
549  weapon_damage = ‪killstreak_bundles::get_weapon_damage( ‪AI_TANK_AGR_NAME, maxhealth, attacker, weapon, mod, ‪damage, flags, chargeLevel );
550 
551  if ( !isdefined( weapon_damage ) )
552  {
553  if ( mod == "MOD_RIFLE_BULLET" || mod == "MOD_PISTOL_BULLET" || weapon.name == "hatchet" || (mod == "MOD_PROJECTILE_SPLASH" && weapon.bulletImpactExplode) )
554  {
555  if ( isPlayer( attacker ) )
556  if ( attacker HasPerk( "specialty_armorpiercing" ) )
557  ‪damage += int( ‪damage * level.cac_armorpiercing_data );
558 
559  if ( weapon.weapClass == "spread")
560  ‪damage = ‪damage * 1.5;
561 
562  weapon_damage = ‪damage * ‪AI_TANK_BULLET_MITIGATION;
563  }
564 
565  if ( ( mod == "MOD_PROJECTILE" || mod == "MOD_GRENADE_SPLASH" || mod == "MOD_PROJECTILE_SPLASH" ) && ‪damage != 0 && !weapon.isEmp && !weapon.bulletImpactExplode)
566  {
567  weapon_damage = ‪damage * ‪AI_TANK_EXPLOSIVE_MITIGATION;
568  }
569 
570  if ( !isdefined( weapon_damage ) )
571  {
572  weapon_damage = ‪damage;
573  }
574  }
575 
576  self.damageTaken += weapon_damage;
577 
578  if ( self.controlled )
579  {
580  self.owner SendKillstreakDamageEvent( int( weapon_damage ) );
581  self.owner ‪vehicle::update_damage_as_occupant( self.damageTaken, maxhealth );
582  }
583 
584  if ( self.damageTaken >= maxhealth )
585  {
586  if( isdefined( self.owner ) )
587  self.owner.dofutz = true;
588 
589  self.health = 0;
590  self notify( "death", attacker, mod, weapon );
591  return;
592  }
593 
594  if ( !low_health && self.damageTaken > maxhealth / 1.8 )
595  {
596  self ‪killstreaks::play_pilot_dialog_on_owner( "damaged", ‪AI_TANK_AGR_NAME, self.killstreak_id );
597 
598  self thread ‪tank_low_health_fx();
599  low_health = true;
600  }
601  }
602 }
603 
605 {
606  self endon( "death" );
607 
608  self.damage_fx = ‪spawn( "script_model", self GetTagOrigin("tag_origin") + (0,0,-14) );
609  if ( !isdefined( self.damage_fx ) )
610  {
611  // intentionally not adding an AssertMsg() here
612  return;
613  }
614 
615  self.damage_fx SetModel( "tag_origin" );
616  self.damage_fx LinkTo(self, "tag_turret", (0,0,-14), (0,0,0) );
617  wait ( 0.1 );
618  PlayFXOnTag( level.ai_tank_damage_fx, self.damage_fx, "tag_origin" );
619 }
620 
621 function ‪deleteOnKillbrush(player)
622 {
623  player endon("disconnect");
624  self endon("death");
625 
626  killbrushes = GetEntArray( "trigger_hurt","classname" );
627 
628  while(1)
629  {
630  for (i = 0; i < killbrushes.size; i++)
631  {
632  if (self istouching(killbrushes[i]) )
633  {
634  if ( isdefined(self) )
635  {
636  self notify( "death", self.owner );
637  }
638 
639  return;
640  }
641  }
642  wait( 0.1 );
643  }
644 
645 }
646 
647 function ‪tank_stun( duration )
648 {
649  self endon( "death" );
650  self notify( "stunned" );
651 
652  self ClearVehGoalPos();
653  forward = AnglesToForward( self.angles );
654  forward = self.origin + forward * 128;
655  forward = forward - ( 0, 0, 64 );
656  self SetTurretTargetVec( forward );
657  self DisableGunnerFiring( 0, true );
658  self LaserOff();
659 
660  if (self.controlled)
661  {
662  self.owner FreezeControls( true );
663 
664  self.owner SendKillstreakDamageEvent( 400 );
665  }
666  if (isdefined(self.owner.fullscreen_static))
667  {
668  self.owner thread ‪remote_weapons::stunStaticFX( duration );
669  }
670 
671  self ‪clientfield::set( "ai_tank_stun", 1 );
672 
673  if( self.controlled )
674  self.owner ‪clientfield::set_to_player( "static_postfx", 1 );
675 
676  wait ( duration );
677 
678  self ‪clientfield::set( "ai_tank_stun", 0 );
679 
680  if( self.controlled )
681  self.owner ‪clientfield::set_to_player( "static_postfx", 0 );
682 
683  if (self.controlled)
684  {
685  self.owner FreezeControls( false );
686  }
687 
688  self DisableGunnerFiring( 0, false );
689  self.isStunned = false;
690 }
691 
693 {
694  self ‪clientfield::set( "ai_tank_stun", 1 );
695  self notify ("death");
696 
697  time = 0;
698  randomAngle = RandomInt(360);
699  while (time < 1.45)
700  {
701  self SetTurretTargetVec(self.origin + AnglesToForward((RandomIntRange(305, 315), int((randomAngle + time * 180)), 0)) * 100);
702  if (time > 0.2)
703  {
704  self FireWeapon( ‪AI_TANK_GUN_TURRET );
705  if ( RandomInt(100) > 85)
706  {
707  rocket = self FireWeapon( ‪AI_TANK_MISSILE_TURRET );
708 
709  if ( isdefined( rocket ) )
710  {
711  rocket.from_ai = true;
712  }
713  }
714  }
715  time += 0.05;
717  }
718  self ‪clientfield::set( "ai_tank_death", 1 );
719 
720  PlayFX( level.ai_tank_explode_fx, self.origin, (0, 0, 1) );
721  PlaySoundAtPosition( "wpn_agr_explode", self.origin );
723  self hide();
724 }
725 
726 function ‪tank_death_think( hardpointName )
727 {
728  team = self.team;
729  killstreak_id = self.killstreak_id;
730 
731  self waittill( "death", attacker, damageFromUnderneath, weapon );
732  // self waittill( "death", attacker, damageFromUnderneath, weapon, point, dir, modType );
733 
734  if ( !isdefined( self ) )
735  {
736  ‪killstreak_stop_and_assert( hardpointName, team, killstreak_id, "Failed to handle death. A." );
737  return;
738  }
739 
740  self.dead = true;
741  self LaserOff();
742 
743  self ClearVehGoalPos();
744 
745  not_abandoned = ( !isdefined( self.abandoned ) || !self.abandoned );
746 
747  if ( self.controlled == true )
748  {
749  self.owner SendKillstreakDamageEvent( 600 );
751  }
752 
753  self ‪clientfield::set( "ai_tank_death", 1 );
754  stunned = false;
755 
756  settings = self.settings;
757 
758  if ( isdefined( settings ) && ( self.timed_out === true || self.abandoned === true ) )
759  {
760  fx_origin = self GetTagOrigin( ‪VAL( settings.timed_out_death_tag_1, "tag_origin" ) );
761  ‪PlayFx( ‪VAL( settings.timed_out_death_fx_1, level.ai_tank_explode_fx ), ‪VAL( fx_origin, self.origin ), ( 0, 0, 1 ) );
762  PlaySoundAtPosition( ‪VAL( settings.timed_out_death_sound_1, "wpn_agr_explode" ), self.origin );
763  }
764  else
765  {
766  PlayFX( level.ai_tank_explode_fx, self.origin, ( 0, 0, 1 ) );
767  PlaySoundAtPosition( "wpn_agr_explode", self.origin );
768  }
769 
770 
771  if ( not_abandoned )
772  {
774 
775  if ( !isdefined( self ) )
776  {
777  ‪killstreak_stop_and_assert( hardpointName, team, killstreak_id, "Failed to handle death. B." );
778  return;
779  }
780  }
781 
782  if ( self.controlled )
783  {
784  self Ghost(); // keep the view for player with the dead by using ghost, otherwise, will end up at feet of player
785  }
786  else
787  {
788  self Hide();
789  }
790 
791  if (isdefined(self.damage_fx))
792  {
793  self.damage_fx delete();
794  }
795 
796  attacker = self [[ level.figure_out_attacker ]]( attacker );
797 
798  if ( isdefined( attacker ) && IsPlayer( attacker ) && isdefined( self.owner ) && attacker != self.owner )
799  {
800  if ( self.owner ‪util::IsEnemyPlayer( attacker ) )
801  {
802 
803  ‪scoreevents::processScoreEvent( "destroyed_aitank", attacker, self.owner, weapon );
804  LUINotifyEvent( &"player_callout", 2, &"KILLSTREAK_DESTROYED_AI_TANK", attacker.entnum );
805  attacker AddWeaponStat( weapon, "destroyed_aitank", 1 );
806  controlled = false;
807  if ( isdefined( self.wasControlledNowDead ) && self.wasControlledNowDead )
808  {
809  attacker AddWeaponStat( weapon, "destroyed_controlled_killstreak", 1 );
810  controlled = true;
811  }
812 
813  attacker ‪challenges::destroyScoreStreak( weapon, controlled, true );
815  attacker AddWeaponStat( weapon, "destroy_aitank_or_setinel", 1 );
816 
818  }
819  else
820  {
821  //Destroyed Friendly Killstreak
822  }
823  }
824 
825  if ( not_abandoned )
826  {
827  self ‪util::waittill_any_timeout( 2.0, "remote_weapon_end" );
828 
829  if ( !isdefined( self ) )
830  {
831  ‪killstreak_stop_and_assert( hardpointName, team, killstreak_id, "Failed to handle death. C." );
832  return;
833  }
834  }
835 
836  ‪killstreakrules::killstreakStop( hardpointName, team, self.killstreak_id );
837 
838  if ( isdefined( self.aim_entity ) )
839  self.aim_entity delete();
840 
841  self delete();
842 }
843 
844 function ‪killstreak_stop_and_assert( hardpoint_name, team, killstreak_id, assert_msg )
845 {
846  ‪killstreakrules::killstreakStop( hardpoint_name, team, killstreak_id );
847  AssertMsg( assert_msg );
848 }
849 
851 {
852  self endon( "death" );
853 
854  not_on_nav_mesh_count = 0;
855 
856  for ( ;; )
857  {
858  wait( 1 );
859 
860  not_on_nav_mesh_count = ( isdefined( GetClosestPointOnNavMesh( self.origin, ‪AI_TANK_FURTHEST_FROM_NAVMESH_ALLOWED ) ) ? 0 : not_on_nav_mesh_count + 1 );
861 
862  if ( not_on_nav_mesh_count >= 4 )
863  {
864  self notify( "death" );
865  }
866  }
867 }
868 
870 {
871  if ( level.teambased )
872  {
873  return ( ‪uav::HasUAV( self.team ) || ‪satellite::HasSatellite( self.team ) );
874  }
875 
876  return ( ‪uav::HasUAV( self.entnum ) || ‪satellite::HasSatellite( self.entnum ) );
877 }
878 
879 function ‪tank_get_player_enemies( on_radar )
880 {
881  enemies = [];
882 
883  if ( !isdefined( on_radar ) )
884  {
885  on_radar = false;
886  }
887 
888  if ( on_radar )
889  {
890  time = GetTime();
891  }
892 
893  foreach( teamKey, team in level.alivePlayers )
894  {
895  if ( level.teambased && teamKey == self.team )
896  {
897  continue;
898  }
899 
900  foreach( player in team )
901  {
902  if ( !‪valid_target( player, self.team, self.owner ) )
903  {
904  continue;
905  }
906 
907  if ( on_radar )
908  {
909  if ( time - player.lastFireTime > 3000 && !‪tank_has_radar() )
910  {
911  continue;
912  }
913  }
914 
915  enemies[ enemies.size ] = player;
916  }
917  }
918 
919  return enemies;
920 }
921 
923 {
924  enemies = ‪tank_get_player_enemies( false );
925  position = undefined;
926 
927  if ( enemies.size )
928  {
929  x = 0;
930  y = 0;
931  z = 0;
932 
933  foreach( enemy in enemies )
934  {
935  x += enemy.origin[0];
936  y += enemy.origin[1];
937  z += enemy.origin[2];
938  }
939 
940  x /= enemies.size;
941  y /= enemies.size;
942  z /= enemies.size;
943 
944  position = ( x, y, z );
945  }
946 
947  return position;
948 }
949 
950 function ‪valid_target( target, team, owner )
951 {
952  if ( !isdefined( target ) )
953  {
954  return false;
955  }
956 
957  if ( !IsAlive( target ) )
958  {
959  return false;
960  }
961 
962  if ( target == owner )
963  {
964  return false;
965  }
966 
967  if ( IsPlayer( target ) )
968  {
969  if ( target.sessionstate != "playing" )
970  {
971  return false;
972  }
973 
974  if ( isdefined( target.lastspawntime ) && GetTime() - target.lastspawntime < 3000 )
975  {
976  return false;
977  }
978 
979  if ( target hasPerk( "specialty_nottargetedbyaitank" ) )
980  {
981  return false;
982  }
983  }
984 
985  if ( level.teambased )
986  {
987  if ( isdefined( target.team ) && team == target.team )
988  {
989  return false;
990  }
991  }
992 
993  if ( isdefined( target.owner ) && target.owner == owner )
994  {
995  return false;
996  }
997 
998  if ( isdefined( target.script_owner ) && target.script_owner == owner )
999  {
1000  return false;
1001  }
1002 
1003  if ( ‪IS_TRUE( target.dead ) )
1004  {
1005  return false;
1006  }
1007 
1008  if ( isdefined( target.targetname ) && target.targetname == "riotshield_mp" )
1009  {
1010  if ( isdefined( target.damageTaken ) && target.damageTaken >= GetDvarInt( "riotshield_deployed_health" ) )
1011  {
1012  return false;
1013  }
1014  }
1015 
1016  return true;
1017 }
1018 
1019 function ‪startTankRemoteControl( drone ) // self == player
1020 {
1021  drone MakeVehicleUsable();
1022  drone ClearVehGoalPos();
1023  drone ClearTurretTarget();
1024  drone LaserOff();
1025 
1026  drone.treat_owner_damage_as_friendly_fire = false;
1027  drone.ignore_team_kills = false;
1028 
1029  if ( isdefined( drone.PlayerDrivenVersion ) )
1030  drone SetVehicleType( drone.PlayerDrivenVersion );
1031 
1032  drone usevehicle( self, 0 );
1033  drone ‪clientfield::set( "vehicletransition", 1 );
1034 
1035 
1036  drone MakeVehicleUnusable();
1037  drone SetBrake( false );
1038 
1039  drone thread ‪tank_rocket_watch( self );
1040  drone thread ‪vehicle::monitor_missiles_locked_on_to_me( self );
1041 
1042  self ‪vehicle::set_vehicle_drivable_time( ‪AI_TANK_LIFETIME, drone.killstreak_end_time );
1043  self ‪vehicle::update_damage_as_occupant( ‪VAL( drone.damageTaken, 0 ), ‪VAL( drone.defaultmaxhealth, 100 ) );
1044  drone ‪update_client_ammo( drone.numberRockets, true );
1045 
1046  ‪visionset_mgr::activate( "visionset", ‪AI_TANK_VISIONSET_ALIAS, self, 1, 90000, 1 );
1047 }
1048 
1049 function ‪endTankRemoteControl( drone, exitRequestedByOwner )
1050 {
1051  not_dead = !‪IS_TRUE( drone.dead );
1052 
1053  if ( isdefined( drone.owner ) )
1054  {
1056  }
1057 
1058  drone.treat_owner_damage_as_friendly_fire = true;
1059  drone.ignore_team_kills = true;
1060 
1061  if( drone.classname == "script_vehicle")
1062  drone MakeVehicleUnusable();
1063 
1064  if ( isdefined( drone.original_vehicle_type ) && not_dead )
1065  drone SetVehicleType( drone.original_vehicle_type );
1066 
1067  if ( isdefined( drone.owner ) )
1069 
1070  if( exitRequestedByOwner && not_dead )
1071  {
1072  drone ‪vehicle_ai::set_state( "combat" );
1073  }
1074 
1075  if ( drone.cobra === true && not_dead )
1076  drone thread ‪amws::cobra_retract();
1077 
1078  if ( isdefined( drone.owner ) && ( drone.controlled === true ) )
1079  ‪visionset_mgr::deactivate( "visionset", ‪AI_TANK_VISIONSET_ALIAS, drone.owner );
1080 
1081  drone ‪clientfield::set( "vehicletransition", 0 );
1082 }
1083 
1084 function ‪perform_recoil_missile_turret( player ) // self == drone
1085 {
1086  bundle = level.killstreakBundle[‪AI_TANK_AGR_NAME];
1087  Earthquake( 0.4, 0.5, self.origin, 200 );
1088  self ‪perform_recoil( "tag_barrel", ( ( ‪IS_TRUE( self.controlled ) ? bundle.ksMainTurretRecoilForceControlled : bundle.ksMainTurretRecoilForce ) ), bundle.ksMainTurretRecoilForceZOffset );
1089 
1090  if ( self.controlled && isdefined( player ) )
1091  {
1092  player PlayRumbleOnEntity( "sniper_fire" );
1093  }
1094 }
1095 
1096 function ‪perform_recoil( recoil_tag, force_scale_factor, force_z_offset ) // self == drone
1097 {
1098  angles = self GetTagAngles( recoil_tag );
1099  dir = AnglesToForward( angles );
1100  self LaunchVehicle( dir * force_scale_factor, self.origin + ( 0, 0, force_z_offset ), false );
1101 }
1102 
1103 function ‪update_client_ammo( ammo_count, driver_only_update = false ) // self == vehicle
1104 {
1105  if ( !driver_only_update )
1106  {
1107  self ‪clientfield::set( "ai_tank_missile_fire", ammo_count );
1108  }
1109 
1110  if ( self.controlled )
1111  {
1112  self.owner ‪clientfield::increment_to_player( "ai_tank_update_hud", 1 );
1113  }
1114 }
1115 
1116 function ‪tank_rocket_watch( player )
1117 {
1118  self endon( "death" );
1119  player endon( "stopped_using_remote");
1120 
1121  if ( self.numberRockets <= 0 )
1122  {
1123  self ‪reload_rockets( player );
1124  }
1125 
1126  if ( !self.‪isStunned )
1127  {
1128  self DisableDriverFiring( false );
1129  }
1130 
1131  while( true )
1132  {
1133  player waittill( "missile_fire", missile );
1134  missile.ignore_team_kills = self.ignore_team_kills;
1135 
1136  self.numberRockets--;
1137  self ‪update_client_ammo( self.numberRockets );
1138 
1139  self ‪perform_recoil_missile_turret( player );
1140 
1141  if ( self.numberRockets <= 0 )
1142  {
1143  self ‪reload_rockets( player );
1144  }
1145  }
1146 }
1147 
1149 {
1150  self endon( "death" );
1151 
1152  while( true )
1153  {
1154  self waittill( "missile_fire", missile );
1155  missile.ignore_team_kills = self.ignore_team_kills;
1156  missile.killCamEnt = self;
1157  }
1158 }
1159 
1160 function ‪reload_rockets( player )
1161 {
1162  bundle = level.killstreakBundle[‪AI_TANK_AGR_NAME];
1163  self DisableDriverFiring( true );
1164 
1165  // setup the "reload" time for the player's vehicle HUD
1166  weapon_wait_duration_ms = Int( bundle.ksWeaponReloadTime * 1000 );
1167  player SetVehicleWeaponWaitDuration( weapon_wait_duration_ms );
1168  player SetVehicleWeaponWaitEndTime( GetTime() + weapon_wait_duration_ms );
1169 
1170  wait ( bundle.ksWeaponReloadTime );
1171 
1172  self.numberRockets = ‪AI_TANK_MISSLE_COUNT_AFTER_RELOAD;
1173  self ‪update_client_ammo( self.numberRockets );
1174 
1175  wait (0.4);
1176 
1177  if ( !self.‪isStunned )
1178  {
1179  self DisableDriverFiring( false );
1180  }
1181 }
1182 
1183 #define AI_TANK_IN_WATER_TRACE_MINS ( -2, -2, -2 )
1184 #define AI_TANK_IN_WATER_TRACE_MAXS ( 2, 2, 2 )
1185 #define AI_TANK_IN_WATER_TRACE_MASK ( PHYSICS_TRACE_MASK_WATER )
1186 #define AI_TANK_IN_WATER_TRACE_WAIT ( 0.3 )
1187 #define AI_TANK_IN_WATER_TRACE_START ( 42 )
1188 #define AI_TANK_IN_WATER_TRACE_REF ( 36 )
1189 #define AI_TANK_IN_WATER_TRACE_END ( 12 )
1190 #define AI_TANK_IN_WATER_TRACE_FRACTION ( (AI_TANK_IN_WATER_TRACE_START - AI_TANK_IN_WATER_TRACE_REF) / ( AI_TANK_IN_WATER_TRACE_START - AI_TANK_IN_WATER_TRACE_END ) )
1191 #define AI_TANK_IN_WATER_TRACE_DISTANCE ( AI_TANK_IN_WATER_TRACE_START - AI_TANK_IN_WATER_TRACE_END )
1192 #define AI_TANK_IN_WATER_REF_DISTANCE ( AI_TANK_IN_WATER_TRACE_REF - AI_TANK_IN_WATER_TRACE_END )
1193 #define AI_TANK_IN_WATER_FUTZ_FRACTION ( 12 / AI_TANK_IN_WATER_TRACE_START )
1194 
1195 function ‪WatchWater()
1196 {
1197  self endon( "death" );
1198 
1199  inWater = false;
1200  while( !inWater )
1201  {
1204  inWater = ( ‪trace["fraction"] < ‪AI_TANK_IN_WATER_TRACE_FRACTION && ‪trace["fraction"] != 1.0 );
1205 
1206  waterTraceDistanceFromEnd = ‪AI_TANK_IN_WATER_TRACE_DISTANCE - ( ‪trace["fraction"] * ‪AI_TANK_IN_WATER_TRACE_DISTANCE );
1207  static_alpha = min( 1.0, waterTraceDistanceFromEnd / ‪AI_TANK_IN_WATER_REF_DISTANCE );
1208 
1209  // design does not want beeping audio for when water is an issue, maybe a different kind of audio?
1210  if ( isdefined( self.owner ) && self.controlled )
1211  self.owner ‪clientfield::set_to_player( "static_postfx", ( ( static_alpha > 0.0 ) ? 1 : 0 ) );
1212  }
1213 
1214  if( isdefined( self.owner ) )
1215  self.owner.dofutz = true;
1216 
1217  self notify( "death" );
1218 }
1219 
‪AI_TANK_NAV_MESH_VALID_LOCATION_TOLERANCE
‪#define AI_TANK_NAV_MESH_VALID_LOCATION_TOLERANCE
Definition: _ai_tank.gsc:59
‪monitor_missiles_locked_on_to_me
‪function monitor_missiles_locked_on_to_me(player, wait_time=0.1)
Definition: vehicle_shared.gsc:3617
‪processScoreEvent
‪function processScoreEvent(event, player, victim, weapon)
Definition: scoreevents_shared.gsc:19
‪AI_TANK_IN_WATER_REF_DISTANCE
‪#define AI_TANK_IN_WATER_REF_DISTANCE
Definition: _ai_tank.gsc:1192
‪UseRemoteWeapon
‪function UseRemoteWeapon(weapon, weaponName, immediate, allowManualDeactivation=true, always_allow_ride=false)
Definition: _remote_weapons.gsc:74
‪activate
‪function activate()
Definition: traps_shared.gsc:655
‪tank_death_think
‪function tank_death_think(hardpointName)
Definition: _ai_tank.gsc:726
‪set_state
‪function set_state(name, state_params)
Definition: statemachine_shared.gsc:133
‪AI_TANK_FURTHEST_FROM_NAVMESH_ALLOWED
‪#define AI_TANK_FURTHEST_FROM_NAVMESH_ALLOWED
Definition: _ai_tank.gsc:56
‪IsTouchingAnyOOBTrigger
‪function IsTouchingAnyOOBTrigger()
Definition: _oob.gsc:84
‪WaitForTimeout
‪function WaitForTimeout(killstreak, duration, callback, endCondition1, endCondition2, endCondition3)
Definition: _killstreaks.gsc:2913
‪tank_timeout_callback
‪function tank_timeout_callback()
Definition: _ai_tank.gsc:426
‪AITANK_HIDE_COMPASS_ON_REMOTE_CONTROL
‪#define AITANK_HIDE_COMPASS_ON_REMOTE_CONTROL
Definition: _killstreaks.gsh:327
‪tank_rocket_watch
‪function tank_rocket_watch(player)
Definition: _ai_tank.gsc:1116
‪get_weapon_damage
‪function get_weapon_damage(killstreakType, maxhealth, attacker, weapon, type, damage, flags, chargeShotLevel)
Definition: _killstreak_bundles.gsc:295
‪set_to_player
‪function set_to_player(str_field_name, n_value)
Definition: clientfield_shared.gsc:58
‪ramp_in_out_thread_per_player_death_shutdown
‪function ramp_in_out_thread_per_player_death_shutdown(player, ramp_in, full_period, ramp_out)
Definition: visionset_mgr_shared.gsc:385
‪stop_monitor_missiles_locked_on_to_me
‪function stop_monitor_missiles_locked_on_to_me()
Definition: vehicle_shared.gsc:3640
‪emp_crazy_death
‪function emp_crazy_death()
Definition: _ai_tank.gsc:692
‪deleteOnKillbrush
‪function deleteOnKillbrush(player)
Definition: _ai_tank.gsc:621
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪HackedCallbackPre
‪function HackedCallbackPre(hacker)
Definition: _ai_tank.gsc:252
‪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
‪cobra_retract
‪function cobra_retract()
Definition: _amws.gsc:228
‪tank_compute_enemy_position
‪function tank_compute_enemy_position()
Definition: _ai_tank.gsc:922
‪WatchWater
‪function WatchWater()
Definition: _ai_tank.gsc:1195
‪PHYSICS_TRACE_MASK_WATER
‪#define PHYSICS_TRACE_MASK_WATER
Definition: shared.gsh:132
‪VAL
‪#define VAL(__var, __default)
Definition: shared.gsh:272
‪reload_rockets
‪function reload_rockets(player)
Definition: _ai_tank.gsc:1160
‪play_pilot_dialog_on_owner
‪function play_pilot_dialog_on_owner(dialogKey, killstreakType, killstreakId)
Definition: _killstreaks.gsc:2010
‪useKillstreakAITankDrop
‪function useKillstreakAITankDrop(hardpointType)
Definition: _ai_tank.gsc:134
‪AI_TANK_IN_WATER_TRACE_END
‪#define AI_TANK_IN_WATER_TRACE_END
Definition: _ai_tank.gsc:1189
‪trace
‪function trace(from, to, target)
Definition: grapple.gsc:369
‪HackedCallbackPost
‪function HackedCallbackPost(hacker)
Definition: _ai_tank.gsc:266
‪AI_TANK_IN_WATER_TRACE_DISTANCE
‪#define AI_TANK_IN_WATER_TRACE_DISTANCE
Definition: _ai_tank.gsc:1191
‪ENEMY_VEHICLE_ACTIVE
‪#define ENEMY_VEHICLE_ACTIVE
Definition: _hacker_tool.gsh:2
‪tank_stun
‪function tank_stun(duration)
Definition: _ai_tank.gsc:647
‪AI_TANK_IN_WATER_TRACE_START
‪#define AI_TANK_IN_WATER_TRACE_START
Definition: _ai_tank.gsc:1187
‪destroyRemoteHUD
‪function destroyRemoteHUD()
Definition: _remote_weapons.gsc:498
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪EnemyEMPActive
‪function EnemyEMPActive()
Definition: _emp.gsc:365
‪waittill_any_timeout
‪function waittill_any_timeout(n_timeout, string1, string2, string3, string4, string5)
Definition: util_shared.csc:423
‪valid_location
‪function valid_location(location)
Definition: _ai_tank.gsc:227
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪update_client_ammo
‪function update_client_ammo(ammo_count, driver_only_update=false)
Definition: _ai_tank.gsc:1103
‪get_vehicle_name
‪function get_vehicle_name(vehicle_version)
Definition: _ai_tank.gsc:356
‪RegisterRemoteWeapon
‪function RegisterRemoteWeapon(weaponName, hintString, useCallback, endUseCallback, hideCompassOnUse=true)
Definition: _remote_weapons.gsc:63
‪AI_TANK_VISIONSET_ALIAS
‪#define AI_TANK_VISIONSET_ALIAS
Definition: _killstreaks.gsh:335
‪valid_target
‪function valid_target(target, team, owner)
Definition: _ai_tank.gsc:950
‪AI_TANK_IN_WATER_TRACE_WAIT
‪#define AI_TANK_IN_WATER_TRACE_WAIT
Definition: _ai_tank.gsc:1186
‪IsEnemyPlayer
‪function IsEnemyPlayer(player)
Definition: util_shared.csc:1220
‪tank_game_end_think
‪function tank_game_end_think(drone)
Definition: _ai_tank.gsc:465
‪useSupplyDropMarker
‪function useSupplyDropMarker(package_contents_id, context)
Definition: _supplydrop.gsc:575
‪AI_TANK_BULLET_MITIGATION
‪#define AI_TANK_BULLET_MITIGATION
Definition: _ai_tank.gsc:44
‪AI_TANK_GUN_TURRET
‪#define AI_TANK_GUN_TURRET
Definition: _ai_tank.gsc:49
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪AI_TANK_IN_WATER_TRACE_MAXS
‪#define AI_TANK_IN_WATER_TRACE_MAXS
Definition: _ai_tank.gsc:1184
‪RemoveAndAssignNewRemoteControlTrigger
‪function RemoveAndAssignNewRemoteControlTrigger(remoteControlTrigger)
Definition: _remote_weapons.gsc:38
‪tank_rocket_watch_ai
‪function tank_rocket_watch_ai()
Definition: _ai_tank.gsc:1148
‪set_vehicle_drivable_time
‪function set_vehicle_drivable_time(duration_ms, end_time_ms)
Definition: vehicle_shared.gsc:3703
‪crateLand
‪function crateLand(crate, category, owner, team, context)
Definition: _ai_tank.gsc:188
‪displayKillstreakStartTeamMessageToAll
‪function displayKillstreakStartTeamMessageToAll(hardpointType)
Definition: _killstreakrules.gsc:246
‪stunStaticFX
‪function stunStaticFX(duration)
Definition: _remote_weapons.gsc:483
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪stunnedTankWithEMPGrenade
‪function stunnedTankWithEMPGrenade(attacker)
Definition: challenges_shared.gsc:1500
‪wait_network_frame
‪function wait_network_frame(n_count=1)
Definition: util_shared.gsc:64
‪play_destroyed_dialog_on_owner
‪function play_destroyed_dialog_on_owner(killstreakType, killstreakId)
Definition: _killstreaks.gsc:1982
‪isStunned
‪function isStunned()
Definition: util_shared.gsc:813
‪AI_TANK_STUN_DURATION
‪#define AI_TANK_STUN_DURATION
Definition: _ai_tank.gsc:46
‪isSupplyDropGrenadeAllowed
‪function isSupplyDropGrenadeAllowed(killstreak)
Definition: _supplydrop.gsc:646
‪end
‪function end(final)
Definition: _killcam.gsc:511
‪HasSatellite
‪function HasSatellite(team_or_entnum)
Definition: _satellite.gsc:259
‪get_spawnpoint_array
‪function get_spawnpoint_array(classname)
Definition: _spawnlogic.gsc:27
‪tank_abort_think
‪function tank_abort_think()
Definition: _ai_tank.gsc:419
‪tank_get_player_enemies
‪function tank_get_player_enemies(on_radar)
Definition: _ai_tank.gsc:879
‪AI_TANK_HEALTH
‪#define AI_TANK_HEALTH
Definition: _ai_tank.gsc:42
‪increment_to_player
‪function increment_to_player(str_field_name, n_increment_count=1)
Definition: clientfield_shared.gsc:169
‪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
‪AI_TANK_AGR_NAME
‪#define AI_TANK_AGR_NAME
Definition: _killstreaks.gsh:16
‪ConfigureTeamPost
‪function ConfigureTeamPost(owner, isHacked)
Definition: _ai_tank.gsc:275
‪tank_damage_think
‪function tank_damage_think()
Definition: _ai_tank.gsc:498
‪HasUAV
‪function HasUAV(team_or_entnum)
Definition: _uav.gsc:304
‪endTankRemoteControl
‪function endTankRemoteControl(drone, exitRequestedByOwner)
Definition: _ai_tank.gsc:1049
‪AI_TANK_WEAPON_NAME
‪#define AI_TANK_WEAPON_NAME
Definition: _ai_tank.gsc:41
‪AI_TANK_MISSLE_COUNT_AFTER_RELOAD
‪#define AI_TANK_MISSLE_COUNT_AFTER_RELOAD
Definition: _killstreaks.gsh:18
‪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
‪ai_tank_killstreak_start
‪function ai_tank_killstreak_start(owner, origin, killstreak_id, category)
Definition: _ai_tank.gsc:281
‪killstreak_stop_and_assert
‪function killstreak_stop_and_assert(hardpoint_name, team, killstreak_id, assert_msg)
Definition: _ai_tank.gsc:844
‪PHYSICS_TRACE_MASK_PHYSICS
‪#define PHYSICS_TRACE_MASK_PHYSICS
Definition: shared.gsh:130
‪AI_TANK_LIFETIME
‪#define AI_TANK_LIFETIME
Definition: _killstreaks.gsh:17
‪set_vehicle_drivable_time_starting_now
‪function set_vehicle_drivable_time_starting_now(killstreak, duration_ms=(-1))
Definition: _killstreak_hacking.gsc:140
‪stop_remote
‪function stop_remote()
Definition: _ai_tank.gsc:475
‪AI_TANK_IN_WATER_TRACE_FRACTION
‪#define AI_TANK_IN_WATER_TRACE_FRACTION
Definition: _ai_tank.gsc:1190
‪AI_TANK_MISSILE_TURRET
‪#define AI_TANK_MISSILE_TURRET
Definition: _ai_tank.gsc:48
‪startTankRemoteControl
‪function startTankRemoteControl(drone)
Definition: _ai_tank.gsc:1019
‪add_to_target_group
‪function add_to_target_group(target_ent)
Definition: vehicle_shared.gsc:3603
‪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
‪setup_health
‪function setup_health(killstreak_ref, max_health, low_health)
Definition: _killstreaks.gsc:2466
‪get_hacked_health
‪function get_hacked_health(killstreakType)
Definition: _killstreak_bundles.gsc:202
‪register_info
‪function register_info(type, name, version, lerp_step_count)
Definition: visionset_mgr_shared.csc:334
‪AI_TANK_IN_WATER_TRACE_MINS
‪#define AI_TANK_IN_WATER_TRACE_MINS
Definition: _ai_tank.gsc:1183
‪AI_TANK_STUN_DURATION_PROXIMITY
‪#define AI_TANK_STUN_DURATION_PROXIMITY
Definition: _ai_tank.gsc:47
‪AI_TANK_NAV_MESH_VALID_LOCATION_BOUNDARY
‪#define AI_TANK_NAV_MESH_VALID_LOCATION_BOUNDARY
Definition: _ai_tank.gsc:58
‪tank_hacked_health_update
‪function tank_hacked_health_update(hacker)
Definition: _ai_tank.gsc:486
‪killstreakStart
‪function killstreakStart(hardpointType, team, hacked, displayTeamMessage)
Definition: _killstreakrules.gsc:184
‪clientNotify
‪function clientNotify(event)
Definition: util_shared.gsc:1416
‪tank_has_radar
‪function tank_has_radar()
Definition: _ai_tank.gsc:869
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪AI_TANK_GUNNER_FLASH_TAG
‪#define AI_TANK_GUNNER_FLASH_TAG
Definition: _ai_tank.gsc:51
‪IsLocationGood
‪function IsLocationGood(location, context)
Definition: _supplydrop.gsc:668
‪is_location_good
‪function is_location_good(location, context)
Definition: _ai_tank.gsc:222
‪perform_recoil
‪function perform_recoil(recoil_tag, force_scale_factor, force_z_offset)
Definition: _ai_tank.gsc:1096
‪tank_too_far_from_nav_mesh_abort_think
‪function tank_too_far_from_nav_mesh_abort_think()
Definition: _ai_tank.gsc:850
‪tank_low_health_fx
‪function tank_low_health_fx()
Definition: _ai_tank.gsc:604
‪configure_team
‪function configure_team(killstreakType, killstreakId, owner, influencerType, configureTeamPreFunction, configureTeamPostFunction, isHacked=false)
Definition: _killstreaks.gsc:2806
‪tank_watch_owner_events
‪function tank_watch_owner_events()
Definition: _ai_tank.gsc:435
‪init
‪function init()
Definition: _ai_tank.gsc:79
‪EndRemoteControlWeaponUse
‪function EndRemoteControlWeaponUse(exitRequestedByOwner)
Definition: _remote_weapons.gsc:369
‪register_alt_weapon
‪function register_alt_weapon(killstreakType, weaponName, isInventory)
Definition: _killstreaks.gsc:318
‪clear_using_remote
‪function clear_using_remote(immediate, skipNotify)
Definition: _killstreaks.gsc:2403
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪get_script_bundle
‪function get_script_bundle(str_type, str_name)
Definition: struct.csc:45
‪AI_TANK_EXPLOSIVE_MITIGATION
‪#define AI_TANK_EXPLOSIVE_MITIGATION
Definition: _ai_tank.gsc:45
‪tank_team_kill
‪function tank_team_kill()
Definition: _ai_tank.gsc:383
‪get_emp_grenade_damage
‪function get_emp_grenade_damage(killstreakType, maxhealth)
Definition: _killstreak_bundles.gsc:265
‪register_remote_override_weapon
‪function register_remote_override_weapon(killstreakType, weaponName, isInventory)
Definition: _killstreaks.gsc:349
‪init_target_group
‪function init_target_group()
Definition: vehicle_shared.gsc:3598
‪enable_hacking
‪function enable_hacking(killstreakName, preHackFunction, postHackFunction)
Definition: _killstreak_hacking.gsc:22
‪kill_monitor
‪function kill_monitor()
Definition: _ai_tank.gsc:390
‪result
‪function result(death, attacker, mod, weapon)
Definition: _zm_aat_blast_furnace.gsc:46
‪destroyNonAirScoreStreak_PostStatsLock
‪function destroyNonAirScoreStreak_PostStatsLock(weapon)
Definition: challenges_shared.gsc:126
‪isHacked
‪function isHacked()
Definition: util_shared.gsc:2493
‪perform_recoil_missile_turret
‪function perform_recoil_missile_turret(player)
Definition: _ai_tank.gsc:1084
‪setup_gameplay_think
‪function setup_gameplay_think(category)
Definition: _ai_tank.gsc:371
‪AI_TANK_IN_WATER_TRACE_MASK
‪#define AI_TANK_IN_WATER_TRACE_MASK
Definition: _ai_tank.gsc:1185
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265
‪PlayFx
‪function PlayFx(name)
Definition: _counteruav.gsc:390
‪PHYSICS_TRACE_MASK_VEHICLE_CLIP
‪#define PHYSICS_TRACE_MASK_VEHICLE_CLIP
Definition: shared.gsh:134