‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_drone_strike.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\scoreevents_shared;
6 #using scripts\shared\util_shared;
7 
8 #using scripts\mp\_challenges;
9 #using scripts\mp\_util;
10 #using scripts\mp\gametypes\_spawning;
11 #using scripts\mp\killstreaks\_airsupport;
12 #using scripts\mp\killstreaks\_killstreakrules;
13 #using scripts\mp\killstreaks\_killstreaks;
14 #using scripts\mp\killstreaks\_satellite;
15 #using scripts\mp\killstreaks\_planemortar;
16 #using scripts\mp\killstreaks\_killstreak_bundles;
17 #using scripts\mp\gametypes\_globallogic_audio;
18 #using scripts\shared\weapons\_hacker_tool;
19 #using scripts\mp\killstreaks\_killstreak_hacking;
20 
21 #insert scripts\mp\_hacker_tool.gsh;
22 #insert scripts\mp\killstreaks\_killstreaks.gsh;
23 #insert scripts\shared\shared.gsh;
24 #insert scripts\shared\version.gsh;
25 
26 #namespace drone_strike;
27 #define DRONE_STRIKE_NAME "drone_strike"
28 
29 #precache( "locationselector", "map_directional_selector" );
30 #precache( "string", "KILLSTREAK_DRONE_STRIKE_NOT_AVAILABLE" );
31 #precache( "string", "KILLSTREAK_DRONE_STRIKE_EARNED" );
32 #precache( "string", "KILLSTREAK_DRONE_STRIKE_INBOUND" );
33 #precache( "string", "KILLSTREAK_DRONE_STRIKE_INBOUND_NEAR_PLAYER" );
34 #precache( "string", "KILLSTREAK_DRONE_STRIKE_HACKED" );
35 #precache( "string", "KILLSTREAK_DESTROYED_ROLLING_THUNDER_DRONE" );
36 #precache( "string", "KILLSTREAK_DESTROYED_ROLLING_THUNDER_ALL_DRONES" );
37 
38 #precache( "eventstring", "mpl_killstreak_DRONE_STRIKE" );
39 #precache( "fx", "killstreaks/fx_rolling_thunder_thruster_trails" );
40 
41 function ‪init()
42 {
43  ‪killstreaks::register( ‪DRONE_STRIKE_NAME, ‪DRONE_STRIKE_NAME, "killstreak_drone_strike", "drone_strike_used", &‪ActivateDroneStrike, true );
44  ‪killstreaks::register_strings( ‪DRONE_STRIKE_NAME, &"KILLSTREAK_DRONE_STRIKE_EARNED", &"KILLSTREAK_DRONE_STRIKE_NOT_AVAILABLE", &"KILLSTREAK_DRONE_STRIKE_INBOUND", &"KILLSTREAK_DRONE_STRIKE_INBOUND_NEAR_PLAYER", &"KILLSTREAK_DRONE_STRIKE_HACKED" );
45  ‪killstreaks::register_dialog( ‪DRONE_STRIKE_NAME, "mpl_killstreak_drone_strike", "droneStrikeDialogBundle", undefined, "friendlyDroneStrike", "enemyDroneStrike", "enemyDroneStrikeMultiple", "friendlyDroneStrikeHacked", "enemyDroneStrikeHacked", "requestDroneStrike", "threatDroneStrike" );
47 }
48 
50 {
51  if ( self ‪killstreakrules::isKillstreakAllowed( ‪DRONE_STRIKE_NAME, self.team ) == false )
52  {
53  return false;
54  }
55 
57 
58  if ( !isdefined( ‪result ) || !‪result )
59  {
60  return false;
61  }
62 
63  return true;
64 }
65 
67 {
68  self BeginLocationNapalmSelection( ‪DRONE_STRIKE_LOCATION_SELECTOR );
69  self.selectingLocation = true;
70  self thread airsupport::EndSelectionThink();
71 
72  locations = [];
73  if( !isdefined( self.pers["drone_strike_radar_used"] ) || !self.pers["drone_strike_radar_used"] )
74  {
75  self thread planemortar::SingleRadarSweep();
76  }
77 
78  location = self ‪WaitForLocationSelection();
79 
80  // if the player gets disconnected, self will be undefined
81  if( !isdefined( self ) )
82  {
83  return false;
84  }
85 
86  if ( !isdefined( location.origin ) )
87  {
88  self.pers["drone_strike_radar_used"] = true;
89  self notify( "cancel_selection" );
90  return false;
91  }
92 
93  if ( self ‪killstreakrules::isKillstreakAllowed( ‪DRONE_STRIKE_NAME, self.team ) == false)
94  {
95  self.pers["drone_strike_radar_used"] = true;
96  self notify("cancel_selection");
97  return false;
98  }
99 
100  self.pers["drone_strike_radar_used"] = false;
102 }
103 
105 {
106  self endon( "emp_jammed" );
107  self endon( "emp_grenaded" );
108 
109  self waittill( "confirm_location", location, yaw );
110 
111  locationInfo = SpawnStruct();
112  locationInfo.origin = location;
113  locationInfo.yaw = yaw;
114 
115  return locationInfo;
116 }
117 
118 function ‪DroneStrikeLocationSelected( location )
119 {
120  team = self.team;
121  killstreak_id = self ‪killstreakrules::killstreakStart( ‪DRONE_STRIKE_NAME, team, false, true );
122  if( killstreak_id == ‪INVALID_KILLSTREAK_ID )
123  {
124  return false;
125  }
126 
128  self AddWeaponStat( GetWeapon( "drone_strike" ), "used", 1 );
129 
130  spawn_influencer = level ‪spawning::create_enemy_influencer( "artillery", location.origin, team );
131 
132  self thread ‪WatchForKillstreakEnd( team, spawn_influencer, killstreak_id );
133  self thread ‪StartDroneStrike( location.origin, location.yaw, team, killstreak_id );
134 
135  return true;
136 }
137 
138 function ‪WatchForKillstreakEnd( team, influencer, killstreak_id )
139 {
140  self ‪util::waittill_any( "disconnect", "joined_team", "joined_spectators", "drone_strike_complete", "emp_jammed" );
142 }
143 
144 function ‪StartDroneStrike( position, yaw, team, killstreak_id )
145 {
146  self endon( "emp_jammed" );
147  self endon( "joined_team" );
148  self endon( "joined_spectators" );
149  self endon( "disconnect" );
150 
151  angles = ( 0, yaw, 0 );
152  direction = AnglesToForward( angles );
154 
155  selectedPosition = ( position[0], position[1], height );
156  startPoint = selectedPosition + VectorScale( direction, ‪DRONE_STRIKE_START_OFFSET );
157  endPoint = selectedPosition + VectorScale( direction, ‪DRONE_STRIKE_END_OFFSET );
158 
159  // trace to get the target point
160  traceStartPos = ( position[0], position[1], height );
161  traceEndPos = ( position[0], position[1], -height );
162  ‪trace = BulletTrace( traceStartPos, traceEndPos, 0, undefined );
163  targetPoint = ( ( ‪trace[ "fraction" ] < 1.0 ) ? ‪trace[ "position" ] : ( position[0], position[1], 0.0 ) );
164 
165  initialOffset = -VectorScale( direction, ( ( ‪DRONE_STRIKE_COUNT * 0.5 ) - 1 ) * ‪DRONE_STRIKE_FORWARD_OFFSET );
166 
167  for( i = 0; i < ‪DRONE_STRIKE_COUNT; i++ )
168  {
169  right = AnglesToRight( angles );
170  rightOffset = VectorScale( right, ‪DRONE_STRIKE_RIGHT_OFFSET );
171  leftOffset = VectorScale( right, ‪DRONE_STRIKE_LEFT_OFFSET );
172  forwardOffset = endPoint + initialOffset + VectorScale( direction, i * ‪DRONE_STRIKE_FORWARD_OFFSET );
173 
174  self thread ‪SpawnDrone( startPoint + rightOffset, forwardOffset + rightOffset, targetPoint, angles, self.team, killstreak_id );
175  self thread ‪SpawnDrone( startPoint - rightOffset, forwardOffset - rightOffset, targetPoint, angles, self.team, killstreak_id );
176  self thread ‪SpawnDrone( startPoint + leftOffset, forwardOffset + leftOffset, targetPoint, angles, self.team, killstreak_id );
178 
179  self playsound ("mpl_thunder_flyover_wash");
180  }
181 
182  wait( 3 ); //Wait for the last drone to explode
183  self notify( "drone_strike_complete" );
184 }
185 
186 function ‪SpawnDrone( startPoint, endPoint, targetPoint, angles, team, killstreak_id )
187 {
188  drone = SpawnPlane( self, "script_model", startPoint );
189  drone.team = team;
190  drone.targetname = "drone_strike";
191  drone SetOwner( self );
192  drone.owner = self;
193  drone.owner thread ‪WatchOwnerEvents( drone );
194  drone ‪killstreaks::configure_team( ‪DRONE_STRIKE_NAME, killstreak_id, self );
196  Target_Set( drone );
197 
198  drone endon( "delete" );
199  drone endon( "death" );
200 
201  drone.angles = angles;
202  drone SetModel( ‪DRONE_STRIKE_MODEL );
203  drone SetEnemyModel( ‪DRONE_STRIKE_MODEL );
204  drone NotSolid();
205 
206  PlayFxOnTag( "killstreaks/fx_rolling_thunder_thruster_trails", drone, "tag_fx");
207  drone ‪clientfield::set( "enemyvehicle", ‪ENEMY_VEHICLE_ACTIVE );
208 
209  drone ‪SetupDamageHandling();
210  drone thread ‪WatchForEmp( self );
211 
212  drone MoveTo( endpoint, ‪DRONE_STRIKE_FLIGHT_TIME, 0, 0 );
214 
215  weapon = GetWeapon( "drone_strike" );
216  velocity = drone GetVelocity();
217 
218  halfGravity = 386;
219  dXY = Abs( ‪DRONE_STRIKE_END_OFFSET );
220  dZ = endPoint[2] - targetPoint[2];
221  dVxy = dXY * sqrt( halfGravity / dZ );
222 
223  nvel = VectorNormalize( velocity );
224  launchVel = nvel * dVxy;
225 
226  bomb = self LaunchBomb( weapon, drone.origin, launchVel );
227 
228  Target_Set( bomb );
229 
230  bomb ‪killstreaks::configure_team( ‪DRONE_STRIKE_NAME, killstreak_id, self );
232  drone notify( "hackertool_update_ent", bomb );
233 
234  bomb ‪clientfield::set( "enemyvehicle", ‪ENEMY_VEHICLE_ACTIVE );
235  bomb.targetname = "drone_strike";
236  bomb SetOwner( self );
237  bomb.owner = self;
238  bomb.team = team;
239  bomb playsound( "mpl_thunder_incoming_start" );
240  bomb ‪SetupDamageHandling();
241  bomb thread ‪WatchForEmp( self );
242 
243  bomb.owner thread ‪WatchOwnerEvents( bomb );
245 
246  drone Hide();
247 
249 
250  drone Delete();
251 }
252 
254 {
255  drone = self;
256  drone SetCanDamage( true );
259  drone.health = drone.maxhealth;
260  drone thread ‪killstreaks::MonitorDamage( ‪DRONE_STRIKE_NAME, drone.maxhealth, &‪DestroyDronePlane, drone.lowhealth, undefined, 0, &‪EmpDamageDrone, true );
261 }
262 
263 function ‪DestroyDronePlane( attacker, weapon )
264 {
265  self endon( "death" );
266 
267  attacker = self [[ level.figure_out_attacker ]]( attacker );
268  if( isdefined( attacker ) && ( !isdefined( self.owner ) || self.owner ‪util::IsEnemyPlayer( attacker ) ) )
269  {
270  ‪challenges::destroyedAircraft( attacker, weapon, false );
271  attacker ‪challenges::addFlySwatterStat( weapon, self );
272  ‪scoreevents::processScoreEvent( "destroyed_rolling_thunder_drone", attacker, self.owner, weapon );
273  LUINotifyEvent( &"player_callout", 2, &"KILLSTREAK_DESTROYED_ROLLING_THUNDER_DRONE", attacker.entnum );
274  }
275 
276  params = level.killstreakBundle[‪DRONE_STRIKE_NAME];
277  if( isdefined( params.ksExplosionFX ) )
278  PlayFXOnTag( params.ksExplosionFX, self, "tag_origin" );
279 
280  self setModel( "tag_origin" );
281 
282  wait( 0.5 );
283 
284  self delete();
285 }
286 
287 function ‪WatchOwnerEvents( bomb )
288 {
289  player = self;
290 
291  bomb endon( "death" );
292 
293  player ‪util::waittill_any( "disconnect", "joined_team", "joined_spectators" );
294 
295  if( isdefined( isalive( bomb ) ) )
296  bomb delete();
297 }
298 
299 function ‪WatchForEmp( owner )
300 {
301  self endon( "delete" );
302  self endon( "death" );
303 
304  self waittill( "emp_deployed", attacker );
305 
306  thread ‪DroneStrikeAwardEMPScoreEvent( attacker, self );
307  self ‪BlowUpDroneStrike();
308 }
309 
310 function ‪EmpDamageDrone( attacker )
311 {
312  thread ‪DroneStrikeAwardEMPScoreEvent( attacker, self );
313  self ‪BlowUpDroneStrike();
314 }
315 
316 function ‪DroneStrikeAwardEMPScoreEvent( attacker, victim )
317 {
318  owner = self.owner;
319 
320  attacker endon( "disconnect" );
321  attacker notify( "DroneStrikeAwardScoreEvent_singleton" );
322  attacker endon( "DroneStrikeAwardScoreEvent_singleton" );
323  waittillframeend;
324 
325  attacker = self [[ level.figure_out_attacker ]]( attacker );
326  ‪scoreevents::processScoreEvent( "destroyed_rolling_thunder_all_drones", attacker, victim, GetWeapon( "emp" ) );
327  ‪challenges::destroyedAircraft( attacker, GetWeapon( "emp" ), false );
328  attacker ‪challenges::addFlySwatterStat( GetWeapon( "emp" ), self );
329  LUINotifyEvent( &"player_callout", 2, &"KILLSTREAK_DESTROYED_ROLLING_THUNDER_ALL_DRONES", attacker.entnum );
330 
332 }
333 
335 {
336  params = level.killstreakBundle[‪DRONE_STRIKE_NAME];
337  if( isdefined( self ) && isdefined( params.ksExplosionFX ) )
338  PlayFX( params.ksExplosionFX, self.origin );
339  self delete();
340 }
‪processScoreEvent
‪function processScoreEvent(event, player, victim, weapon)
Definition: scoreevents_shared.gsc:19
‪DRONE_STRIKE_LOCATION_SELECTOR
‪#define DRONE_STRIKE_LOCATION_SELECTOR
Definition: _killstreaks.gsh:208
‪WaitForLocationSelection
‪function WaitForLocationSelection()
Definition: _drone_strike.gsc:104
‪EmpDamageDrone
‪function EmpDamageDrone(attacker)
Definition: _drone_strike.gsc:310
‪DRONE_STRIKE_LEFT_OFFSET
‪#define DRONE_STRIKE_LEFT_OFFSET
Definition: _killstreaks.gsh:212
‪ActivateDroneStrike
‪function ActivateDroneStrike()
Definition: _drone_strike.gsc:49
‪create_enemy_influencer
‪function create_enemy_influencer(name, origin, team)
Definition: _spawning.gsc:285
‪init
‪function init()
Definition: _drone_strike.gsc:41
‪SetupDamageHandling
‪function SetupDamageHandling()
Definition: _drone_strike.gsc:253
‪DestroyDronePlane
‪function DestroyDronePlane(attacker, weapon)
Definition: _drone_strike.gsc:263
‪DRONE_STRIKE_END_OFFSET
‪#define DRONE_STRIKE_END_OFFSET
Definition: _killstreaks.gsh:216
‪finishHardpointLocationUsage
‪function finishHardpointLocationUsage(location, usedCallback)
Definition: _airsupport.gsc:58
‪getMinimumFlyHeight
‪function getMinimumFlyHeight()
Definition: _airsupport.gsc:167
‪play_killstreak_start_dialog
‪function play_killstreak_start_dialog(killstreakType, team, killstreakId)
Definition: _killstreaks.gsc:1905
‪DroneStrikeLocationSelected
‪function DroneStrikeLocationSelected(location)
Definition: _drone_strike.gsc:118
‪trace
‪function trace(from, to, target)
Definition: grapple.gsc:369
‪addFlySwatterStat
‪function addFlySwatterStat(weapon, aircraft)
Definition: challenges_shared.gsc:86
‪DRONE_STRIKE_Z_OFFSET
‪#define DRONE_STRIKE_Z_OFFSET
Definition: _killstreaks.gsh:210
‪ENEMY_VEHICLE_ACTIVE
‪#define ENEMY_VEHICLE_ACTIVE
Definition: _hacker_tool.gsh:2
‪SelectDroneStrikePath
‪function SelectDroneStrikePath()
Definition: _drone_strike.gsc:66
‪DroneStrikeAwardEMPScoreEvent
‪function DroneStrikeAwardEMPScoreEvent(attacker, victim)
Definition: _drone_strike.gsc:316
‪get_low_health
‪function get_low_health(killstreakType)
Definition: _killstreak_bundles.gsc:195
‪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
‪WatchOwnerEvents
‪function WatchOwnerEvents(bomb)
Definition: _drone_strike.gsc:287
‪destroyedAircraft
‪function destroyedAircraft(attacker, weapon, playerControlled)
Definition: challenges_shared.gsc:1405
‪isKillstreakAllowed
‪function isKillstreakAllowed(hardpointType, team)
Definition: _killstreakrules.gsc:352
‪set_team_kill_penalty_scale
‪function set_team_kill_penalty_scale(killstreakType, scale, isInventory)
Definition: _killstreaks.gsc:404
‪waittill_any
‪function waittill_any(str_notify1, str_notify2, str_notify3, str_notify4, str_notify5)
Definition: util_shared.csc:375
‪DRONE_STRIKE_START_OFFSET
‪#define DRONE_STRIKE_START_OFFSET
Definition: _killstreaks.gsh:215
‪get_max_health
‪function get_max_health(killstreakType)
Definition: _killstreak_bundles.gsc:188
‪register_dialog
‪function register_dialog(killstreakType, informDialog, taacomDialogBundleKey, pilotDialogArrayKey, startDialogKey, enemyStartDialogKey, enemyStartMultipleDialogKey, hackedDialogKey, hackedStartDialogKey, requestDialogKey, threatDialogKey, isInventory)
Definition: _killstreaks.gsc:239
‪INVALID_KILLSTREAK_ID
‪#define INVALID_KILLSTREAK_ID
Definition: _killstreaks.gsh:2
‪SpawnDrone
‪function SpawnDrone(startPoint, endPoint, targetPoint, angles, team, killstreak_id)
Definition: _drone_strike.gsc:186
‪WatchForEmp
‪function WatchForEmp(owner)
Definition: _drone_strike.gsc:299
‪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
‪DRONE_STRIKE_NAME
‪#define DRONE_STRIKE_NAME
Definition: _drone_strike.gsc:27
‪killstreakStart
‪function killstreakStart(hardpointType, team, hacked, displayTeamMessage)
Definition: _killstreakrules.gsc:184
‪DRONE_STRIKE_COUNT
‪#define DRONE_STRIKE_COUNT
Definition: _killstreaks.gsh:209
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪DRONE_STRIKE_MODEL
‪#define DRONE_STRIKE_MODEL
Definition: _killstreaks.gsh:207
‪configure_team
‪function configure_team(killstreakType, killstreakId, owner, influencerType, configureTeamPreFunction, configureTeamPostFunction, isHacked=false)
Definition: _killstreaks.gsc:2806
‪DRONE_STRIKE_FLIGHT_TIME
‪#define DRONE_STRIKE_FLIGHT_TIME
Definition: _killstreaks.gsh:217
‪DRONE_STRIKE_RIGHT_OFFSET
‪#define DRONE_STRIKE_RIGHT_OFFSET
Definition: _killstreaks.gsh:211
‪DRONE_STRIKE_FORWARD_OFFSET
‪#define DRONE_STRIKE_FORWARD_OFFSET
Definition: _killstreaks.gsh:213
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪StartDroneStrike
‪function StartDroneStrike(position, yaw, team, killstreak_id)
Definition: _drone_strike.gsc:144
‪play_taacom_dialog
‪function play_taacom_dialog(dialogKey, killstreakType, killstreakId)
Definition: _globallogic_audio.gsc:274
‪enable_hacking
‪function enable_hacking(killstreakName, preHackFunction, postHackFunction)
Definition: _killstreak_hacking.gsc:22
‪result
‪function result(death, attacker, mod, weapon)
Definition: _zm_aat_blast_furnace.gsc:46
‪BlowUpDroneStrike
‪function BlowUpDroneStrike()
Definition: _drone_strike.gsc:334
‪WatchForKillstreakEnd
‪function WatchForKillstreakEnd(team, influencer, killstreak_id)
Definition: _drone_strike.gsc:138
‪DRONE_STRIKE_SPAWN_INTERVAL
‪#define DRONE_STRIKE_SPAWN_INTERVAL
Definition: _killstreaks.gsh:214
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265