‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_uav.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\challenges_shared;
5 #using scripts\shared\clientfield_shared;
6 #using scripts\shared\damagefeedback_shared;
7 #using scripts\shared\killstreaks_shared;
8 #using scripts\shared\math_shared;
9 #using scripts\shared\scoreevents_shared;
10 #using scripts\shared\system_shared;
11 #using scripts\shared\tweakables_shared;
12 #using scripts\shared\util_shared;
13 #using scripts\shared\weapons\_heatseekingmissile;
14 #using scripts\shared\weapons\_weaponobjects;
15 
16 #using scripts\mp\gametypes\_globallogic_audio;
17 #using scripts\mp\killstreaks\_airsupport;
18 #using scripts\mp\killstreaks\_killstreak_bundles;
19 #using scripts\mp\killstreaks\_killstreak_detect;
20 #using scripts\mp\killstreaks\_killstreak_hacking;
21 #using scripts\mp\killstreaks\_killstreakrules;
22 #using scripts\mp\killstreaks\_killstreaks;
23 #using scripts\mp\teams\_teams;
24 #using scripts\mp\_util;
25 
26 #insert scripts\mp\_hacker_tool.gsh;
27 #insert scripts\mp\killstreaks\_killstreaks.gsh;
28 #insert scripts\shared\shared.gsh;
29 #insert scripts\shared\version.gsh;
30 
31 #precache( "eventstring", "mpl_killstreak_radar" );
32 #precache( "string", "KILLSTREAK_EARNED_RADAR" );
33 #precache( "string", "KILLSTREAK_RADAR_INBOUND" );
34 #precache( "string", "KILLSTREAK_RADAR_NOT_AVAILABLE" );
35 #precache( "string", "KILLSTREAK_DESTROYED_UAV" );
36 #precache( "string", "KILLSTREAK_RADAR_HACKED" );
37 
38 #precache( "fx", "killstreaks/fx_uav_damage_trail" );
39 #precache( "fx", "killstreaks/fx_uav_lights" );
40 #precache( "fx", "killstreaks/fx_uav_bunner" );
41 
42 #define UAV_NAME "uav"
43 
44 #namespace uav;
45 
46 function ‪init()
47 {
48  if ( level.teamBased )
49  {
50  foreach( team in level.teams )
51  {
52  level.activeUAVs[ team ] = 0;
53  }
54  }
55  else
56  {
57  level.activeUAVs = [];
58  }
59 
60  level.activePlayerUAVs = [];
61  level.spawnedUAVs = [];
62 
63  if ( ‪tweakables::getTweakableValue( "killstreak", "allowradar" ) )
64  {
65  ‪killstreaks::register( ‪UAV_NAME, ‪UAV_NAME, "killstreak_uav", "uav_used", &‪ActivateUAV );
66  ‪killstreaks::register_strings( ‪UAV_NAME, &"KILLSTREAK_EARNED_RADAR", &"KILLSTREAK_RADAR_NOT_AVAILABLE", &"KILLSTREAK_RADAR_INBOUND", undefined, &"KILLSTREAK_RADAR_HACKED" );
67  ‪killstreaks::register_dialog( ‪UAV_NAME, "mpl_killstreak_radar", "uavDialogBundle", "uavPilotDialogBundle", "friendlyUav", "enemyUav", "enemyUavMultiple", "friendlyUavHacked", "enemyUavHacked", "requestUav", "threatUav" );
68  }
69 
70  level thread ‪UAVTracker();
71 
75 
76  setMatchFlag( "radar_allies", 0 );
77  setMatchFlag( "radar_axis", 0 );
78 }
79 
80 function ‪HackedPreFunction( hacker )
81 {
82  uav = self;
83  uav ‪ResetActiveUAV();
84 }
85 
87 {
88  uav = self;
89  uav thread ‪teams::WaitUntilTeamChangeSingleTon( owner, "UAV_watch_team_change", &‪OnTeamChange, owner.entNum, "delete", "death", "leaving" );
90  if ( ‪isHacked == false )
91  {
93  }
94  else
95  {
96  uav SetVisibleToAll();
97  }
98  owner ‪AddActiveUAV();
99 }
100 
101 function ‪ActivateUAV()
102 {
103  assert( isdefined( level.players ) );
104 
105  if ( self ‪killstreakrules::isKillstreakAllowed( ‪UAV_NAME, self.team ) == false )
106  {
107  return false;
108  }
109 
110  killstreak_id = self ‪killstreakrules::killstreakStart( ‪UAV_NAME, self.team );
111  if ( killstreak_id == -1 )
112  {
113  return false;
114  }
115 
116  rotator = level.airsupport_rotator;
117  attach_angle = -90;
118 
119  uav = ‪spawn( "script_model", rotator getTagOrigin( "tag_origin" ) );
120  ‪ARRAY_ADD( level.spawnedUAVs, uav );
121 
122  uav setModel( ‪UAV_MODEL );
123 
124  uav.targetname = ‪UAV_NAME;
125 
126  uav ‪killstreaks::configure_team( ‪UAV_NAME, killstreak_id, self, undefined, undefined, &‪ConfigureTeamPost );
128 
129  uav ‪clientfield::set( "enemyvehicle", ‪ENEMY_VEHICLE_ACTIVE );
131 
132  uav SetDrawInfrared( true );
133 
134  uav.killstreak_id = killstreak_id;
135  uav.leaving = false;
136  uav.health = 99999;
137 
138  uav.maxhealth = ‪UAV_HEALTH;
139  uav.lowhealth = ‪UAV_LOW_HEALTH;
140 
141  uav SetCanDamage( true );
142  uav thread ‪killstreaks::MonitorDamage( ‪UAV_NAME, uav.maxhealth, &‪DestroyUAV, uav.lowhealth, &‪OnLowHealth, 0, undefined, true );
143 
144  uav thread ‪heatseekingmissile::MissileTarget_ProximityDetonateIncomingMissile( "crashing", undefined, true );
145  uav.rocketDamage = uav.maxhealth + 1;
146 
147  minFlyHeight = int( ‪airsupport::getMinimumFlyHeight() );
148  zOffset = minFlyHeight + ‪VAL( level.uav_z_offset, ‪UAV_Z_OFFSET );
149 
150  angle = randomInt( 360 );
151  radiusOffset = ‪VAL( level.uav_rotation_radius, ‪UAV_ROTATION_RADIUS ) + randomInt( ‪VAL( level.uav_rotation_random_offset, ‪UAV_ROTATION_RANDOM_OFFSET ) );
152  xOffset = cos( angle ) * radiusOffset;
153  yOffset = sin( angle ) * radiusOffset;
154  angleVector = vectorNormalize( ( xOffset, yOffset, zOffset ) );
155  angleVector = angleVector * zOffset;
156  uav linkTo( rotator, "tag_origin", angleVector, ( 0, angle + attach_angle, 0 ) );
157 
158  self AddWeaponStat( GetWeapon( ‪UAV_NAME ), "used", 1 );
159 
160  uav thread ‪killstreaks::WaitForTimeout( ‪UAV_NAME, ‪UAV_DURATION, &‪OnTimeout, "delete", "death", "crashing" );
161  uav thread ‪killstreaks::WaitForTimecheck( ‪UAV_DURATION_CHECK, &‪OnTimecheck, "delete", "death", "crashing" );
162 
163  uav thread ‪StartUAVFx();
164 
165  self ‪killstreaks::play_killstreak_start_dialog( ‪UAV_NAME, self.team, killstreak_id );
166 
167  uav ‪killstreaks::play_pilot_dialog_on_owner( "arrive", ‪UAV_NAME, killstreak_id );
169 
170  return true;
171 }
172 
173 function ‪OnLowHealth( attacker, weapon )
174 {
175  self.is_damaged = true;
176  params = level.killstreakBundle[‪UAV_NAME];
177  if( isdefined( params.fxLowHealth ) )
178  PlayFXOnTag( params.fxLowHealth, self, "tag_origin" );
179 }
180 
181 function ‪OnTeamChange( entNum, event )
182 {
183  ‪DestroyUAV( undefined, undefined );
184 }
185 
186 function ‪DestroyUAV( attacker, weapon )
187 {
188  attacker = self [[ level.figure_out_attacker ]]( attacker );
189  if( isdefined( attacker ) && ( !isdefined( self.owner ) || self.owner ‪util::IsEnemyPlayer( attacker ) ) )
190  {
191  ‪challenges::destroyedAircraft( attacker, weapon, false );
192  ‪scoreevents::processScoreEvent( "destroyed_uav", attacker, self.owner, weapon );
193  LUINotifyEvent( &"player_callout", 2, &"KILLSTREAK_DESTROYED_UAV", attacker.entnum );
194  attacker ‪challenges::addFlySwatterStat( weapon, self );
195  }
196 
197  if( !self.leaving )
198  {
199  self ‪RemoveActiveUAV();
200 
202  }
203 
204  self notify( "crashing" );
205 
206  self playsound ( "evt_helicopter_midair_exp" );
207 
208  params = level.killstreakBundle[‪UAV_NAME];
209  if( isdefined( params.ksExplosionFX ) )
210  PlayFXOnTag( params.ksExplosionFX, self, "tag_origin" );
211 
212  self StopLoopSound();
213  self setModel( "tag_origin" );
214  Target_Remove( self );
215  self unlink();
216 
217  wait( 0.5 );
218 
219  ArrayRemoveValue( level.spawnedUAVs, self );
220  self notify( "delete" );
221  self delete();
222 }
223 
225 {
226  self.entNum = self getEntityNumber();
227 
228  if ( !level.teambased )
229  {
230  level.activeUAVs[ self.entNum ] = 0;
231  }
232 
233  level.activePlayerUAVs[ self.entNum ] = 0; // needed for UAV-related kill scores
234 }
235 
237 {
238  self endon( "disconnect" );
239  if( level.teambased == false || level.multiteam == true )
240  {
241  level notify( "uav_update" );
242  }
243 }
244 
246 {
248 }
249 
250 function ‪OnTimeout()
251 {
253 
254  if( ‪IS_TRUE( self.is_damaged ) )
255  {
256  PlayFxOnTag( ‪FX_UAV_DAMAGE_TRAIL, self, "tag_body" );
257  }
258 
260 
261  self.leaving = true;
262  self ‪RemoveActiveUAV();
263 
265  wait( ‪UAV_EXIT_TIME );
266 
267  Target_Remove( self );
268  ArrayRemoveValue( level.spawnedUAVs, self );
269  self delete();
270 }
271 
272 function ‪OnTimecheck()
273 {
274  self ‪killstreaks::play_pilot_dialog_on_owner( "timecheck", ‪UAV_NAME, self.killstreak_id );
275 }
276 
277 function ‪StartUAVFx()
278 {
279  self endon( "death" );
280  wait ( 0.1 );
281 
282  if( isdefined( self ) )
283  {
284  PlayFXOnTag( ‪FX_UAV_LIGHTS, self, "tag_origin" );
285  PlayFXOnTag( ‪FX_UAV_BURNER, self, "tag_origin" );
286  self PlayLoopSound ("veh_uav_engine_loop", 1);
287  }
288 }
289 
291 {
292  self endon( "death" );
293  wait ( 0.1 );
294 
295  if( isdefined( self ) )
296  {
297  PlayFXOnTag( ‪FX_UAV_BURNER, self, "tag_origin" );
298  self StopLoopSound();
299  team = ‪util::getOtherTeam( self.team );
300  self playsoundtoteam ( "veh_kls_uav_afterburner" , team );
301  }
302 }
303 
304 function ‪HasUAV( team_or_entnum )
305 {
306  return level.activeUAVs[ team_or_entnum ] > 0;
307 }
308 
309 function ‪AddActiveUAV()
310 {
311  if ( level.teamBased )
312  {
313  assert( isdefined( self.team ) );
314  level.activeUAVs[self.team]++;
315  }
316  else
317  {
318  assert( isdefined( self.entNum ) );
319  if ( !isdefined( self.entNum ) )
320  {
321  self.entNum = self GetEntityNumber();
322  }
323 
324  level.activeUAVs[ self.entNum ]++;
325  }
326 
327  level.activePlayerUAVs[ self.entNum ]++;
328 
329  level notify ( "uav_update" );
330 }
331 
333 {
334  uav = self;
335  uav ‪ResetActiveUAV();
336  uav ‪killstreakrules::killstreakStop( ‪UAV_NAME, self.originalteam, self.killstreak_id );
337 }
338 
340 {
341  if ( level.teamBased )
342  {
343  level.activeUAVs[self.team]--;
344  assert( level.activeUAVs[self.team] >= 0 );
345 
346  if( level.activeUAVs[self.team] < 0 )
347  {
348  level.activeUAVs[self.team] = 0;
349  }
350  }
351  else if( isdefined( self.owner ) )
352  {
353  assert( isdefined( self.owner.entNum ) );
354  if( !isdefined( self.owner.entNum ) )
355  {
356  self.owner.entNum = self.owner getEntityNumber();
357  }
358 
359  level.activeUAVs[self.owner.entNum]--;
360 
361  assert( level.activeUAVs[self.owner.entNum] >= 0 );
362  if( level.activeUAVs[self.owner.entNum] < 0 )
363  {
364  level.activeUAVs[self.owner.entNum] = 0;
365  }
366  }
367 
368  if ( isdefined( self.owner ) )
369  {
370  level.activePlayerUAVs[self.owner.entNum]--;
371  assert( level.activePlayerUAVs[self.owner.entNum] >= 0 );
372  }
373  level notify ( "uav_update" );
374 }
375 
376 function ‪UAVTracker()
377 {
378  level endon ( "game_ended" );
379 
380  while( true )
381  {
382  level waittill ( "uav_update" );
383 
384  // intentionally keeping both teambased and non-teambased logic for now
385  // TODO: one "might" be able to change it to teambased only; when trying to do so, watch for knock-on effects
386 
387  if( level.teamBased )
388  {
389  foreach( team in level.teams )
390  {
391  activeUAVs = level.activeUAVs[ team ];
392  activeUAVsAndSatellites = activeUAVs + ( ( isdefined( level.activeSatellites ) ) ? level.activeSatellites[ team ] : 0 );
393 
394  SetTeamSpyplane( team, int( min( activeUAVs, 2 ) ) );
395  ‪util::set_team_radar( team, ( activeUAVsAndSatellites > 0 ) );
396  }
397  }
398  else
399  {
400  for( i = 0; i < level.players.size; i++ )
401  {
402  player = level.players[ i ];
403 
404  assert( isdefined( player.entNum ) );
405  if( !isdefined( player.entNum ) )
406  {
407  player.entNum = player getEntityNumber();
408  }
409 
410  activeUAVs = level.activeUAVs[ player.entNum ];
411  activeUAVsAndSatellites = activeUAVs + ( ( isdefined( level.activeSatellites ) ) ? level.activeSatellites[ player.entnum ] : 0 );
412 
413  player SetClientUIVisibilityFlag( "radar_client", ( activeUAVsAndSatellites > 0 ) );
414  player.hasSpyplane = int( min( activeUAVs, 2 ) );
415  }
416  }
417  }
418 }
419 
421 {
422  foreach( uav in level.spawnedUAVs )
423  {
424  if ( isdefined( uav ) )
425  {
426 
428  }
429  }
430 }
‪processScoreEvent
‪function processScoreEvent(event, player, victim, weapon)
Definition: scoreevents_shared.gsc:19
‪UAV_NAME
‪#define UAV_NAME
Definition: _uav.gsc:42
‪UAV_Z_OFFSET
‪#define UAV_Z_OFFSET
Definition: _killstreaks.gsh:69
‪UAV_MODEL
‪#define UAV_MODEL
Definition: _killstreaks.gsh:60
‪AddActiveUAV
‪function AddActiveUAV()
Definition: _uav.gsc:309
‪ActivateUAV
‪function ActivateUAV()
Definition: _uav.gsc:101
‪WaitForTimeout
‪function WaitForTimeout(killstreak, duration, callback, endCondition1, endCondition2, endCondition3)
Definition: _killstreaks.gsc:2913
‪PlayAfterburnerFx
‪function PlayAfterburnerFx()
Definition: _uav.gsc:290
‪FX_UAV_BURNER
‪#define FX_UAV_BURNER
Definition: _killstreaks.gsh:62
‪set_team_radar
‪function set_team_radar(team, value)
Definition: _util.gsc:1129
‪HideAllUAVsToSameTeam
‪function HideAllUAVsToSameTeam()
Definition: _uav.gsc:420
‪UAV_ROTATION_RADIUS
‪#define UAV_ROTATION_RADIUS
Definition: _killstreaks.gsh:70
‪MissileTarget_ProximityDetonateIncomingMissile
‪function MissileTarget_ProximityDetonateIncomingMissile(endon1, endon2, allowDirectDamage)
Definition: _heatseekingmissile.gsc:1085
‪UAV_ROTATION_RANDOM_OFFSET
‪#define UAV_ROTATION_RANDOM_OFFSET
Definition: _killstreaks.gsh:71
‪getMinimumFlyHeight
‪function getMinimumFlyHeight()
Definition: _airsupport.gsc:167
‪on_joined_team
‪function on_joined_team()
Definition: _battlechatter.gsc:133
‪OnPlayerJoinedTeam
‪function OnPlayerJoinedTeam()
Definition: _uav.gsc:245
‪play_killstreak_start_dialog
‪function play_killstreak_start_dialog(killstreakType, team, killstreakId)
Definition: _killstreaks.gsc:1905
‪VAL
‪#define VAL(__var, __default)
Definition: shared.gsh:272
‪play_pilot_dialog_on_owner
‪function play_pilot_dialog_on_owner(dialogKey, killstreakType, killstreakId)
Definition: _killstreaks.gsc:2010
‪FX_UAV_LIGHTS
‪#define FX_UAV_LIGHTS
Definition: _killstreaks.gsh:61
‪getTweakableValue
‪function getTweakableValue(category, name)
Definition: _tweakables.gsc:12
‪addFlySwatterStat
‪function addFlySwatterStat(weapon, aircraft)
Definition: challenges_shared.gsc:86
‪ENEMY_VEHICLE_ACTIVE
‪#define ENEMY_VEHICLE_ACTIVE
Definition: _hacker_tool.gsh:2
‪DestroyUAV
‪function DestroyUAV(attacker, weapon)
Definition: _uav.gsc:186
‪UAV_EXIT_TIME
‪#define UAV_EXIT_TIME
Definition: _killstreaks.gsh:68
‪UAV_HEALTH
‪#define UAV_HEALTH
Definition: _killstreaks.gsh:64
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪getOtherTeam
‪function getOtherTeam(team)
Definition: _util.gsc:360
‪MonitorDamage
‪function MonitorDamage(killstreak_ref, max_health, destroyed_callback, low_health, low_health_callback, emp_damage, emp_callback, allow_bullet_damage)
Definition: _killstreaks.gsc:2499
‪IsEnemyPlayer
‪function IsEnemyPlayer(player)
Definition: util_shared.csc:1220
‪HideToSameTeam
‪function HideToSameTeam()
Definition: _teams.gsc:485
‪OnTimecheck
‪function OnTimecheck()
Definition: _uav.gsc:272
‪OnPlayerSpawned
‪function OnPlayerSpawned()
Definition: _uav.gsc:236
‪ResetActiveUAV
‪function ResetActiveUAV()
Definition: _uav.gsc:339
‪UAV_LOW_HEALTH
‪#define UAV_LOW_HEALTH
Definition: _killstreaks.gsh:65
‪on_spawned
‪function on_spawned(func, obj)
Definition: callbacks_shared.csc:245
‪destroyedAircraft
‪function destroyedAircraft(attacker, weapon, playerControlled)
Definition: challenges_shared.gsc:1405
‪play_destroyed_dialog_on_owner
‪function play_destroyed_dialog_on_owner(killstreakType, killstreakId)
Definition: _killstreaks.gsc:1982
‪isKillstreakAllowed
‪function isKillstreakAllowed(hardpointType, team)
Definition: _killstreakrules.gsc:352
‪init
‪function init()
Definition: _uav.gsc:46
‪OnTimeout
‪function OnTimeout()
Definition: _uav.gsc:250
‪ARRAY_ADD
‪#define ARRAY_ADD(__array, __item)
Definition: shared.gsh:304
‪killstreakTargetSet
‪function killstreakTargetSet(killstreakEntity, offset)
Definition: _killstreak_detect.gsc:29
‪StartUAVFx
‪function StartUAVFx()
Definition: _uav.gsc:277
‪HasUAV
‪function HasUAV(team_or_entnum)
Definition: _uav.gsc:304
‪UAV_DURATION_CHECK
‪#define UAV_DURATION_CHECK
Definition: _killstreaks.gsh:67
‪register_dialog
‪function register_dialog(killstreakType, informDialog, taacomDialogBundleKey, pilotDialogArrayKey, startDialogKey, enemyStartDialogKey, enemyStartMultipleDialogKey, hackedDialogKey, hackedStartDialogKey, requestDialogKey, threatDialogKey, isInventory)
Definition: _killstreaks.gsc:239
‪ConfigureTeamPost
‪function ConfigureTeamPost(owner, isHacked)
Definition: _uav.gsc:86
‪OnPlayerConnect
‪function OnPlayerConnect()
Definition: _uav.gsc:224
‪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
‪OnLowHealth
‪function OnLowHealth(attacker, weapon)
Definition: _uav.gsc:173
‪killstreakStart
‪function killstreakStart(hardpointType, team, hacked, displayTeamMessage)
Definition: _killstreakrules.gsc:184
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪FX_UAV_DAMAGE_TRAIL
‪#define FX_UAV_DAMAGE_TRAIL
Definition: _killstreaks.gsh:63
‪WaitForTimecheck
‪function WaitForTimecheck(duration, callback, endCondition1, endCondition2, endCondition3)
Definition: killstreaks_shared.gsc:130
‪WaitUntilTeamChangeSingleTon
‪function WaitUntilTeamChangeSingleTon(player, singletonString, callback, arg, end_condition1, end_condition2, end_condition3)
Definition: _teams.gsc:465
‪OnTeamChange
‪function OnTeamChange(entNum, event)
Definition: _uav.gsc:181
‪configure_team
‪function configure_team(killstreakType, killstreakId, owner, influencerType, configureTeamPreFunction, configureTeamPostFunction, isHacked=false)
Definition: _killstreaks.gsc:2806
‪UAV_DURATION
‪#define UAV_DURATION
Definition: _killstreaks.gsh:66
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪player_killstreak_threat_tracking
‪function player_killstreak_threat_tracking(killstreakType)
Definition: _killstreaks.gsc:2092
‪enable_hacking
‪function enable_hacking(killstreakName, preHackFunction, postHackFunction)
Definition: _killstreak_hacking.gsc:22
‪on_connect
‪function on_connect()
Definition: _arena.gsc:20
‪HackedPreFunction
‪function HackedPreFunction(hacker)
Definition: _uav.gsc:80
‪isHacked
‪function isHacked()
Definition: util_shared.gsc:2493
‪Leave
‪function Leave(duration)
Definition: _airsupport.gsc:889
‪RemoveActiveUAV
‪function RemoveActiveUAV()
Definition: _uav.gsc:332
‪UAVTracker
‪function UAVTracker()
Definition: _uav.gsc:376