‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_satellite.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\challenges_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\util_shared;
7 #using scripts\shared\hostmigration_shared;
8 #using scripts\shared\callbacks_shared;
9 #using scripts\shared\tweakables_shared;
10 #using scripts\shared\weapons\_heatseekingmissile;
11 #using scripts\shared\weapons\_weaponobjects;
12 #using scripts\shared\damagefeedback_shared;
13 #using scripts\shared\scoreevents_shared;
14 #using scripts\shared\math_shared;
15 #using scripts\shared\killstreaks_shared;
16 
17 #using scripts\mp\gametypes\_battlechatter;
18 #using scripts\mp\gametypes\_globallogic_audio;
19 #using scripts\mp\killstreaks\_airsupport;
20 #using scripts\mp\killstreaks\_killstreak_bundles;
21 #using scripts\mp\killstreaks\_killstreak_hacking;
22 #using scripts\mp\killstreaks\_killstreakrules;
23 #using scripts\mp\killstreaks\_killstreaks;
24 #using scripts\mp\teams\_teams;
25 #using scripts\mp\_util;
26 
27 #insert scripts\mp\_hacker_tool.gsh;
28 #insert scripts\mp\killstreaks\_killstreaks.gsh;
29 #insert scripts\shared\shared.gsh;
30 #insert scripts\shared\version.gsh;
31 
32 #namespace satellite;
33 
34 #define SATELLITE_NAME "satellite"
35 #define SATELLITE_KILLSTREAK_NAME "killstreak_satellite"
36 
37 #precache( "string", "mpl_killstreak_satellite" );
38 #precache( "string", "KILLSTREAK_EARNED_SATELLITE" );
39 #precache( "string", "KILLSTREAK_SATELLITE_INBOUND" );
40 #precache( "string", "KILLSTREAK_DESTROYED_SATELLITE" );
41 #precache( "string", "KILLSTREAK_SATELLITE_NOT_AVAILABLE" );
42 #precache( "string", "KILLSTREAK_SATELLITE_HACKED" );
43 
44 function ‪init()
45 {
46  if ( level.teamBased )
47  {
48  foreach( team in level.teams )
49  {
50  level.activeSatellites[ team ] = 0;
51  }
52  }
53  else
54  {
55  level.activeSatellites = [];
56  }
57 
58  level.activePlayerSatellites = [];
59 
60  if ( ‪tweakables::getTweakableValue( "killstreak", "allowradardirection" ) )
61  {
63  ‪killstreaks::register_strings( ‪SATELLITE_NAME, &"KILLSTREAK_EARNED_SATELLITE", &"KILLSTREAK_SATELLITE_NOT_AVAILABLE", &"KILLSTREAK_SATELLITE_INBOUND", undefined, &"KILLSTREAK_SATELLITE_HACKED" );
64  ‪killstreaks::register_dialog( ‪SATELLITE_NAME, "mpl_killstreak_satellite", "satelliteDialogBundle", undefined, "friendlySatellite", "enemySatellite", "enemySatelliteMultiple", "friendlySatelliteHacked", "enemySatelliteHacked", "requestSatellite", "threatSatellite" );
65  }
66 
69 
70  level thread ‪SatelliteTracker();
71 }
72 
74 {
75  self.entnum = self getEntityNumber();
76 
77  if ( !level.teamBased )
78  {
79  level.activeSatellites[ self.entnum ] = 0;
80  }
81 
82  level.activePlayerSatellites[ self.entnum ] = 0; // needed for satellite-related kill scores
83 }
84 
85 function ‪OnPlayerSpawned( local_client_num )
86 {
87  if ( !level.teambased )
88  {
90  }
91 }
92 
94 {
95  if( self ‪killstreakrules::isKillstreakAllowed( ‪SATELLITE_NAME, self.team ) == false )
96  {
97  return false;
98  }
99 
100  killstreak_id = self ‪killstreakrules::killstreakStart( ‪SATELLITE_NAME, self.team );
101  if( killstreak_id == -1 )
102  {
103  return false;
104  }
105 
106  minFlyHeight = int( ‪airsupport::getMinimumFlyHeight() );
107  zOffset = minFlyHeight + ‪SATELLITE_Z_OFFSET;
108 
109  // pick a random start point from map center
110  travelAngle = RandomFloatRange( ‪VAL( level.satellite_spawn_from_angle_min, ‪SATELLITE_SPAWN_FROM_ANGLE_MIN ), ‪VAL( level.satellite_spawn_from_angle_max, ‪SATELLITE_SPAWN_FROM_ANGLE_MAX ) );
112  xOffset = sin( travelAngle ) * travelRadius;
113  yOffset = cos( travelAngle ) * travelRadius;
114 
115  satellite = ‪spawn( "script_model", ‪airsupport::GetMapCenter() + ( xOffset, yOffset, zOffset ));
116  satellite setModel( ‪SATELLITE_MODEL );
117  satellite SetScale( ‪SATELLITE_MODEL_SCALE );
118 
119  satellite.killstreak_id = killstreak_id;
120  satellite.owner = self;
121  satellite.ownerEntNum = self GetEntityNumber();
122  satellite.team = self.team;
123  satellite setTeam( self.team );
124  satellite setOwner( self );
125  satellite ‪killstreaks::configure_team( ‪SATELLITE_NAME, killstreak_id, self, undefined, undefined, &‪ConfigureTeamPost );
127  satellite.targetname = ‪SATELLITE_NAME;
128  satellite.maxhealth = ‪SATELLITE_HEALTH;
129  satellite.lowhealth = ‪SATELLITE_LOW_HEALTH;
130  satellite.health = 99999;
131  satellite.leaving = false;
132 
133  satellite SetCanDamage( true );
134  satellite thread ‪killstreaks::MonitorDamage( ‪SATELLITE_NAME, satellite.maxhealth, &‪DestroySatellite, satellite.lowhealth, &‪OnLowHealth, 0, undefined, false );
136  // satellite.overrideVehicleDamage = &SatelliteDamageOverride; // satellite is not a vehicle right now
137  satellite.killstreakDamageModifier = &‪killstreakDamageModifier;
138 
139  satellite.rocketDamage = ( satellite.maxhealth / ‪SATELLITE_MISSILES_TO_DESTROY ) + 1;
140 
141  /#
142  //Box( airsupport::GetMapCenter() + ( xOffset, yOffset, zOffset ), (-4, -4, 0 ), ( 4, 4, 5000 ), 0, ( 1, 0, 0 ), 0.6, false, 2000 );
143  //Box( airsupport::GetMapCenter() + ( -xOffset, -yoffset, zOffset ), (-4, -4, 0 ), ( 4, 4, 5000 ), 0, ( 0, 1, 0 ), 0.6, false, 2000 );
144  #/
145 
146  satellite MoveTo( ‪airsupport::GetMapCenter() + ( -xOffset, -yoffset, zOffset ), ‪SATELLITE_DURATION_MS * 0.001 );
147 
148  Target_Set( satellite );
149 
150  satellite ‪clientfield::set( "enemyvehicle", ‪ENEMY_VEHICLE_ACTIVE );
151 
153 
154  satellite thread ‪heatseekingmissile::MissileTarget_ProximityDetonateIncomingMissile( "death", undefined, true );
155 
156  satellite thread ‪Rotate( ‪SATELLITE_ROTATION_DURATION );
157 
158  self ‪killstreaks::play_killstreak_start_dialog( ‪SATELLITE_NAME, self.team, killstreak_id );
160  self AddWeaponStat( GetWeapon( ‪SATELLITE_NAME ), "used", 1 );
161 
162  return true;
163 }
164 
165 function ‪HackedPreFunction( hacker )
166 {
167  satellite = self;
168  satellite ‪ResetActiveSatellite();
169 }
170 
172 {
173  satellite = self;
174 
175  satellite thread ‪teams::WaitUntilTeamChangeSingleTon( owner, "Satellite_watch_team_change", &‪OnTeamChange, self.entNum, "delete", "death", "leaving" );
176  if ( ‪isHacked == false )
177  {
178  satellite ‪teams::HideToSameTeam();
179  }
180  else
181  {
182  satellite SetVisibleToAll();
183  }
184  satellite ‪AddActiveSatellite();
185 }
186 
187 function ‪Rotate( duration )
188 {
189  self endon( "death" );
190 
191  while( true )
192  {
193  self rotateyaw( -360, duration );
194  wait( duration );
195  }
196 }
197 
198 function ‪OnLowHealth( attacker, weapon )
199 {
200 }
201 
202 function ‪OnTeamChange( entNum, event )
203 {
204  ‪DestroySatellite( undefined, undefined );
205 }
206 
207 function ‪OnTimeout()
208 {
210 
211  self.leaving = true;
213 
215  wait( ‪UAV_EXIT_TIME );
216 
217  if( Target_IsTarget( self ) )
218  Target_Remove( self );
219 
220  self delete();
221 }
222 
223 function ‪DestroySatelliteByEMP( attacker, arg )
224 {
225  ‪DestroySatellite( attacker, GetWeapon( "emp" ) );
226 }
227 
228 function ‪DestroySatellite( attacker = undefined, weapon = undefined )
229 {
230  attacker = self [[ level.figure_out_attacker ]]( attacker );
231  if ( isdefined( attacker ) && ( !isdefined( self.owner ) || self.owner ‪util::IsEnemyPlayer( attacker ) ) )
232  {
233  ‪challenges::destroyedAircraft( attacker, weapon, false );
234  ‪scoreevents::processScoreEvent( "destroyed_satellite", attacker, self.owner, weapon );
235  attacker ‪challenges::addFlySwatterStat( weapon, self );
236  LUINotifyEvent( &"player_callout", 2, &"KILLSTREAK_DESTROYED_SATELLITE", attacker.entnum );
237  if( !self.leaving )
239  }
240 
241  self notify( "crashing" );
242 
243  params = level.killstreakBundle[‪SATELLITE_NAME];
244  if( isdefined( params.ksExplosionFX ) )
245  PlayFXOnTag( params.ksExplosionFX, self, "tag_origin" );
246 
247  self setModel( "tag_origin" );
248  if( Target_IsTarget( self ) )
249  Target_Remove( self );
250 
251  wait( 0.5 );
252 
253  if( !self.leaving )
255 
256  self delete();
257 }
258 
259 function ‪HasSatellite( team_or_entnum )
260 {
261  return level.activeSatellites[ team_or_entnum ] > 0;
262 }
263 
265 {
266  if ( level.teamBased )
267  {
268  level.activeSatellites[ self.team ]++;
269  }
270  else
271  {
272  level.activeSatellites[ self.ownerEntNum ]++;
273  }
274 
275  level.activePlayerSatellites[ self.ownerEntNum ]++;
276 
277  level notify( "satellite_update" );
278 }
279 
281 {
283 
284  ‪killstreakrules::killstreakStop( ‪SATELLITE_NAME, self.originalteam, self.killstreak_id );
285 }
286 
288 {
289  if( level.teamBased )
290  {
291  level.activeSatellites[ self.team ]--;
292 
293  assert( level.activeSatellites[ self.team ] >= 0 );
294  if( level.activeSatellites[ self.team ] < 0 )
295  {
296  level.activeSatellites[ self.team ] = 0;
297  }
298  }
299  else if ( isdefined( self.ownerEntNum ) )
300  {
301  level.activeSatellites[ self.ownerEntNum ]--;
302 
303  assert( level.activeSatellites[ self.ownerEntNum ] >= 0 );
304  if( level.activeSatellites[ self.ownerEntNum ] < 0 )
305  {
306  level.activeSatellites[ self.ownerEntNum ] = 0;
307  }
308  }
309 
310  assert( isdefined( self.ownerEntNum ) );
311  level.activePlayerSatellites[ self.ownerEntNum ]--;
312  assert( level.activePlayerSatellites[ self.ownerEntNum ] >= 0 );
313 
314  level notify( "satellite_update" );
315 }
316 
318 {
319  level endon ( "game_ended" );
320 
321  while( true )
322  {
323  level waittill ( "satellite_update" );
324 
325  // intentionally keeping both teambased and non-teambased logic for now
326  // TODO: one "might" be able to change it to teambased only; when trying to do so, watch for knock-on effects
327 
328  if( level.teamBased )
329  {
330  foreach( team in level.teams )
331  {
332  activeSatellites = level.activeSatellites[ team ];
333  activeSatellitesAndUAVs = activeSatellites + ( ( isdefined( level.activeUAVs ) ) ? level.activeUAVs[ team ] : 0 );
334 
335  SetTeamSatellite( team, ( activeSatellites > 0 ) );
336  ‪util::set_team_radar( team, ( activeSatellitesAndUAVs > 0 ) );
337  }
338  }
339  else
340  {
341  for( i = 0; i < level.players.size; i++ )
342  {
343  ‪UpdatePlayerSatelliteForDM( level.players[ i ] );
344  }
345  }
346  }
347 }
348 
350 {
351  if( !isdefined( player.entnum ) )
352  {
353  player.entnum = player getEntityNumber();
354  }
355 
356  activeSatellites = level.activeSatellites[ player.entnum ];
357  activeSatellitesAndUAVs = activeSatellites + ( ( isdefined( level.activeUAVs ) ) ? level.activeUAVs[ player.entnum ] : 0 );
358 
359  player SetClientUIVisibilityFlag( "radar_client", ( activeSatellitesAndUAVs > 0 ) );
360  player.hasSatellite = ( activeSatellites > 0 );
361 }
362 
363 function ‪killstreakDamageModifier( ‪damage, attacker, direction, point, sMeansOfDeath, tagName, modelName, partname, weapon, flags, inflictor, chargeLevel )
364 {
365  if( ( sMeansOfDeath == "MOD_PISTOL_BULLET" ) || ( sMeansOfDeath == "MOD_RIFLE_BULLET" ) )
366  return 0;
367 
368  if ( sMeansOfDeath == "MOD_PROJECTILE_SPLASH" )
369  return 0;
370 
371  return ‪damage;
372 }
‪processScoreEvent
‪function processScoreEvent(event, player, victim, weapon)
Definition: scoreevents_shared.gsc:19
‪SATELLITE_TRAVEL_DISTANCE_SCALE
‪#define SATELLITE_TRAVEL_DISTANCE_SCALE
Definition: _killstreaks.gsh:105
‪SATELLITE_MODEL
‪#define SATELLITE_MODEL
Definition: _killstreaks.gsh:95
‪init
‪function init()
Definition: _satellite.gsc:44
‪WaitForTimeout
‪function WaitForTimeout(killstreak, duration, callback, endCondition1, endCondition2, endCondition3)
Definition: _killstreaks.gsc:2913
‪set_team_radar
‪function set_team_radar(team, value)
Definition: _util.gsc:1129
‪HackedPreFunction
‪function HackedPreFunction(hacker)
Definition: _satellite.gsc:165
‪MissileTarget_ProximityDetonateIncomingMissile
‪function MissileTarget_ProximityDetonateIncomingMissile(endon1, endon2, allowDirectDamage)
Definition: _heatseekingmissile.gsc:1085
‪getMinimumFlyHeight
‪function getMinimumFlyHeight()
Definition: _airsupport.gsc:167
‪play_killstreak_start_dialog
‪function play_killstreak_start_dialog(killstreakType, team, killstreakId)
Definition: _killstreaks.gsc:1905
‪OnTimeout
‪function OnTimeout()
Definition: _satellite.gsc:207
‪VAL
‪#define VAL(__var, __default)
Definition: shared.gsh:272
‪OnPlayerSpawned
‪function OnPlayerSpawned(local_client_num)
Definition: _satellite.gsc:85
‪play_pilot_dialog_on_owner
‪function play_pilot_dialog_on_owner(dialogKey, killstreakType, killstreakId)
Definition: _killstreaks.gsc:2010
‪getTweakableValue
‪function getTweakableValue(category, name)
Definition: _tweakables.gsc:12
‪ActivateSatellite
‪function ActivateSatellite()
Definition: _satellite.gsc:93
‪addFlySwatterStat
‪function addFlySwatterStat(weapon, aircraft)
Definition: challenges_shared.gsc:86
‪ENEMY_VEHICLE_ACTIVE
‪#define ENEMY_VEHICLE_ACTIVE
Definition: _hacker_tool.gsh:2
‪UAV_EXIT_TIME
‪#define UAV_EXIT_TIME
Definition: _killstreaks.gsh:68
‪SATELLITE_MISSILES_TO_DESTROY
‪#define SATELLITE_MISSILES_TO_DESTROY
Definition: _killstreaks.gsh:101
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪RemoveActiveSatellite
‪function RemoveActiveSatellite()
Definition: _satellite.gsc:280
‪GetMaxMapWidth
‪function GetMaxMapWidth()
Definition: _airsupport.gsc:802
‪SATELLITE_NAME
‪#define SATELLITE_NAME
Definition: _satellite.gsc:34
‪SATELLITE_KILLSTREAK_NAME
‪#define SATELLITE_KILLSTREAK_NAME
Definition: _satellite.gsc:35
‪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
‪GetMapCenter
‪function GetMapCenter()
Definition: _airsupport.gsc:766
‪IsEnemyPlayer
‪function IsEnemyPlayer(player)
Definition: util_shared.csc:1220
‪HideToSameTeam
‪function HideToSameTeam()
Definition: _teams.gsc:485
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪SatelliteTracker
‪function SatelliteTracker()
Definition: _satellite.gsc:317
‪on_spawned
‪function on_spawned(func, obj)
Definition: callbacks_shared.csc:245
‪destroyedAircraft
‪function destroyedAircraft(attacker, weapon, playerControlled)
Definition: challenges_shared.gsc:1405
‪SATELLITE_MODEL_SCALE
‪#define SATELLITE_MODEL_SCALE
Definition: _killstreaks.gsh:96
‪play_destroyed_dialog_on_owner
‪function play_destroyed_dialog_on_owner(killstreakType, killstreakId)
Definition: _killstreaks.gsc:1982
‪SATELLITE_SPAWN_FROM_ANGLE_MIN
‪#define SATELLITE_SPAWN_FROM_ANGLE_MIN
Definition: _killstreaks.gsh:103
‪isKillstreakAllowed
‪function isKillstreakAllowed(hardpointType, team)
Definition: _killstreakrules.gsc:352
‪DestroySatelliteByEMP
‪function DestroySatelliteByEMP(attacker, arg)
Definition: _satellite.gsc:223
‪HasSatellite
‪function HasSatellite(team_or_entnum)
Definition: _satellite.gsc:259
‪Rotate
‪function Rotate(duration)
Definition: _satellite.gsc:187
‪register_dialog
‪function register_dialog(killstreakType, informDialog, taacomDialogBundleKey, pilotDialogArrayKey, startDialogKey, enemyStartDialogKey, enemyStartMultipleDialogKey, hackedDialogKey, hackedStartDialogKey, requestDialogKey, threatDialogKey, isInventory)
Definition: _killstreaks.gsc:239
‪SATELLITE_ROTATION_DURATION
‪#define SATELLITE_ROTATION_DURATION
Definition: _killstreaks.gsh:102
‪ConfigureTeamPost
‪function ConfigureTeamPost(owner, isHacked)
Definition: _satellite.gsc:171
‪OnTeamChange
‪function OnTeamChange(entNum, event)
Definition: _satellite.gsc:202
‪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
‪OnPlayerConnect
‪function OnPlayerConnect()
Definition: _satellite.gsc:73
‪ResetActiveSatellite
‪function ResetActiveSatellite()
Definition: _satellite.gsc:287
‪AddActiveSatellite
‪function AddActiveSatellite()
Definition: _satellite.gsc:264
‪SATELLITE_Z_OFFSET
‪#define SATELLITE_Z_OFFSET
Definition: _killstreaks.gsh:98
‪killstreakStart
‪function killstreakStart(hardpointType, team, hacked, displayTeamMessage)
Definition: _killstreakrules.gsc:184
‪SATELLITE_SPAWN_FROM_ANGLE_MAX
‪#define SATELLITE_SPAWN_FROM_ANGLE_MAX
Definition: _killstreaks.gsh:104
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪WaitUntilTeamChangeSingleTon
‪function WaitUntilTeamChangeSingleTon(player, singletonString, callback, arg, end_condition1, end_condition2, end_condition3)
Definition: _teams.gsc:465
‪configure_team
‪function configure_team(killstreakType, killstreakId, owner, influencerType, configureTeamPreFunction, configureTeamPostFunction, isHacked=false)
Definition: _killstreaks.gsc:2806
‪DestroySatellite
‪function DestroySatellite(attacker=undefined, weapon=undefined)
Definition: _satellite.gsc:228
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪player_killstreak_threat_tracking
‪function player_killstreak_threat_tracking(killstreakType)
Definition: _killstreaks.gsc:2092
‪killstreakDamageModifier
‪function killstreakDamageModifier(damage, attacker, direction, point, sMeansOfDeath, tagName, modelName, partname, weapon, flags, inflictor, chargeLevel)
Definition: _satellite.gsc:363
‪enable_hacking
‪function enable_hacking(killstreakName, preHackFunction, postHackFunction)
Definition: _killstreak_hacking.gsc:22
‪on_connect
‪function on_connect()
Definition: _arena.gsc:20
‪WaitTillEMP
‪function WaitTillEMP(onEmpdCallback, arg)
Definition: killstreaks_shared.gsc:157
‪isHacked
‪function isHacked()
Definition: util_shared.gsc:2493
‪SATELLITE_HEALTH
‪#define SATELLITE_HEALTH
Definition: _killstreaks.gsh:99
‪OnLowHealth
‪function OnLowHealth(attacker, weapon)
Definition: _satellite.gsc:198
‪SATELLITE_DURATION_MS
‪#define SATELLITE_DURATION_MS
Definition: _killstreaks.gsh:97
‪Leave
‪function Leave(duration)
Definition: _airsupport.gsc:889
‪SATELLITE_LOW_HEALTH
‪#define SATELLITE_LOW_HEALTH
Definition: _killstreaks.gsh:100
‪UpdatePlayerSatelliteForDM
‪function UpdatePlayerSatelliteForDM(player)
Definition: _satellite.gsc:349