‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_remote_weapons.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\hud_shared;
5 #using scripts\shared\util_shared;
6 #using scripts\shared\clientfield_shared;
7 #insert scripts\shared\shared.gsh;
8 #using scripts\shared\lui_shared;
9 #using scripts\mp\killstreaks\_qrdrone;
10 
11 #using scripts\mp\_util;
12 #using scripts\mp\killstreaks\_ai_tank;
13 #using scripts\mp\killstreaks\_killstreaks;
14 #using scripts\mp\killstreaks\_killstreakrules;
15 #using scripts\mp\killstreaks\_turret;
16 
17 #insert scripts\mp\killstreaks\_remote_weapons.gsh;
18 
19 // Manager for all weapons that can be remotely controlled with the tablet
20 #define REMOTE_WEAPON_NAME "killstreak_remote"
21 
22 #namespace remote_weapons;
23 
24 function ‪init()
25 {
26  level.remoteWeapons = [];
27  level.remoteExitHint = &"MP_REMOTE_EXIT";
29 }
30 
32 {
33  self endon("disconnect");
34 
36 }
37 
38 function ‪RemoveAndAssignNewRemoteControlTrigger( remoteControlTrigger ) // player = self
39 {
40  ArrayRemoveValue( self.activeRemoteControlTriggers, remoteControlTrigger );
41  self ‪AssignRemoteControlTrigger( true );
42 }
43 
44 function ‪AssignRemoteControlTrigger( force_new_assignment = false ) // player = self
45 {
46  if ( !isdefined( self.activeRemoteControlTriggers ) )
47  self.activeRemoteControlTriggers = [];
48 
49  ArrayRemoveValue( self.activeRemoteControlTriggers, undefined );
50 
51  if ( ( !isdefined( self.remoteControlTrigger ) || force_new_assignment ) && self.activeRemoteControlTriggers.size > 0 )
52  {
53  self.remoteControlTrigger = self.activeRemoteControlTriggers[ self.activeRemoteControlTriggers.size - 1 ];
54  }
55 
56  if ( isdefined( self.remoteControlTrigger ) )
57  {
58  self.remoteControlTrigger.origin = self.origin;
59  self.remoteControlTrigger LinkTo( self );
60  }
61 }
62 
63 function ‪RegisterRemoteWeapon( weaponName, hintString, useCallback, endUseCallback, hideCompassOnUse = true )
64 {
65  assert( isdefined( level.remoteWeapons ) );
66 
67  level.remoteWeapons[ weaponName ] = SpawnStruct();
68  level.remoteWeapons[ weaponName ].hintString = hintString;
69  level.remoteWeapons[ weaponName ].useCallback = useCallback;
70  level.remoteWeapons[ weaponName ].endUseCallback = endUseCallback;
71  level.remoteWeapons[ weaponName ].hideCompassOnUse = hideCompassOnUse;
72 }
73 
74 function ‪UseRemoteWeapon( weapon, weaponName, immediate, allowManualDeactivation = true, always_allow_ride = false )
75 {
76  player = self;
77  assert( IsPlayer( player ) );
78 
79  weapon.remoteOwner = player;
80  weapon.initTime = GetTime();
81  weapon.remoteName = weaponName;
82  weapon.remoteWeaponAllowManualDeactivation = allowManualDeactivation;
83 
85 
86  if( !immediate )
87  {
89  }
90  else
91  {
92  weapon thread ‪WatchOwnerDisconnect();
93  weapon ‪UseRemoteControlWeapon( allowManualDeactivation, always_allow_ride );
94  }
95 }
96 
97 function ‪WatchForHack()
98 {
99  weapon = self;
100  weapon endon( "death" );
101 
102  weapon waittill( "killstreak_hacked", hacker );
103 
104  if ( isdefined( weapon.remoteWeaponAllowManualDeactivation ) && weapon.remoteWeaponAllowManualDeactivation == true )
105  {
106  weapon thread ‪WatchRemoteControlDeactivate();
107  }
108  weapon.remoteOwner = hacker;
109 }
110 
112 {
113  weapon = self;
114  weapon endon( "remote_weapon_end" );
115  weapon ‪util::waittill_any( "death", "remote_weapon_shutdown" );
116 
117  weapon ‪EndRemoteControlWeaponUse( false );
118 
119  while( isdefined( weapon ) )
120  {
121  ‪WAIT_SERVER_FRAME; // Wait until any death animations and any other waits are finished
122  }
123 
124  //Check for queued remote weapon
125 }
126 
128 {
129  weapon = self;
130  player = weapon.remoteOwner;
131 
132  if ( isdefined( weapon.useTrigger ) )
133  {
134  weapon.useTrigger delete();
135  }
136 
137  weapon.useTrigger = ‪spawn( "trigger_radius_use", player.origin, 32, 32 );
138  weapon.useTrigger EnableLinkTo();
139  weapon.useTrigger LinkTo( player );
140  weapon.useTrigger SetHintLowPriority( true );
141  weapon.useTrigger SetCursorHint( "HINT_NOICON" );
142  weapon.useTrigger SetHintString( level.remoteWeapons[ weapon.remoteName ].hintString );
143 
144  weapon.useTrigger SetTeamForTrigger( player.team );
145  weapon.useTrigger.team = player.team;
146 
147  player ClientClaimTrigger( weapon.useTrigger );
148  player.remoteControlTrigger = weapon.useTrigger;
149  player.activeRemoteControlTriggers[ player.activeRemoteControlTriggers.size ] = weapon.useTrigger;
150  weapon.useTrigger.ClaimedBy = player;
151 
152  weapon thread ‪WatchWeaponDeath();
153  weapon thread ‪WatchOwnerDisconnect();
154  weapon thread ‪WatchRemoteTriggerUse();
155  weapon thread ‪WatchRemoteTriggerDisable();
156 }
157 
159 {
160  weapon = self;
161  weapon.useTrigger endon( "death" );
162 
163  weapon ‪util::waittill_any( "death", "remote_weapon_end" );
164 
165  if ( isdefined( weapon.remoteOwner ) )
166  {
167  weapon.remoteOwner ‪RemoveAndAssignNewRemoteControlTrigger( weapon.useTrigger );
168  }
169 
170  weapon.useTrigger delete();
171 }
172 
174 {
175  weapon = self;
176  weapon endon( "remote_weapon_end" );
177  weapon endon( "remote_weapon_shutdown" );
178 
179  if( isdefined( weapon.useTrigger ) )
180  weapon.useTrigger endon( "death" );
181 
182  weapon.remoteOwner ‪util::waittill_any( "joined_team", "disconnect", "joined_spectators" );
183 
185 
186  if( isdefined( weapon ) && isdefined( weapon.useTrigger ) )
187  weapon.useTrigger delete();
188 }
189 
191 {
192  weapon = self;
193  weapon endon( "remote_weapon_end" );
194  weapon endon( "remote_weapon_shutdown" );
195  weapon.useTrigger endon( "death" );
196 
197  while( true )
198  {
199  weapon.useTrigger TriggerEnable( !( weapon.remoteOwner IsWallRunning() ) );
200  wait( 0.1 );
201  }
202 }
203 
205 {
206  player = self;
207  if( player useButtonPressed() && !player.throwingGrenade && !player meleeButtonPressed() && !player ‪util::isUsingRemote() && !( isdefined( player.carryObject ) && ‪IS_TRUE( player.carryObject.disallowRemoteControl ) ) )
208  {
209  return true;
210  }
211  else
212  {
213  return false;
214  }
215 }
216 
218 {
219  weapon = self;
220  weapon endon( "death" );
221  weapon endon( "remote_weapon_end" );
222 
223  if( weapon.remoteOwner ‪util::is_bot() )
224  {
225  return;
226  }
227 
228  while( true )
229  {
230  weapon.useTrigger waittill( "trigger", player );
231 
232  if( weapon.remoteOwner IsUsingOffhand() || weapon.remoteOwner IsWallRunning() )
233  {
234  continue;
235  }
236 
237  if( isdefined( weapon.hackertrigger ) && isdefined( weapon.hackertrigger.progressbar ) )
238  {
239  if( weapon.remoteName == "killstreak_remote_turret" )
240  {
241  weapon.remoteOwner iPrintLnBold( &"KILLSTREAK_AUTO_TURRET_NOT_AVAILABLE" );
242  }
243 
244  continue;
245  }
246  if( weapon.remoteOwner ‪AllowRemoteStart() )
247  {
249  }
250  }
251 }
252 
253 function ‪UseRemoteControlWeapon( allowManualDeactivation = true, always_allow_ride = false )
254 {
255  self endon( "death" );
256 
257  weapon = self;
258 
259  assert( isdefined( weapon.remoteOwner ) );
260 
261  weapon.control_initiated = true;
262  weapon.endRemoteControlWeapon = false;
263 
264  weapon.remoteOwner endon( "disconnect" );
265  weapon.remoteOwner endon( "joined_team" );
266 
267  weapon.remoteOwner DisableOffhandWeapons();
268  weapon.remoteOwner DisableWeaponCycling();
269 
270  weapon.remoteOwner.dofutz = false;
271 
272  if( !isdefined( weapon.disableRemoteWeaponSwitch ) )
273  {
274  remoteWeapon = GetWeapon( "killstreak_remote" );
275  weapon.remoteOwner giveWeapon( remoteWeapon );
276  weapon.remoteOwner switchToWeapon( remoteWeapon );
277 
278  if ( always_allow_ride )
279  {
280  weapon.remoteOwner ‪util::waittill_any( "weapon_change", "death" );
281  }
282  else
283  {
284  weapon.remoteOwner waittill( "weapon_change", newWeapon );
285  }
286  }
287 
288  if( isdefined( newweapon ) )
289  {
290  if( newweapon != remoteWeapon )
291  {
292  weapon.remoteOwner ‪killstreaks::clear_using_remote( true, true );
293  return;
294  }
295  }
296 
297  weapon.remoteOwner thread ‪killstreaks::watch_for_remove_remote_weapon();
298 
299  weapon.remoteOwner ‪util::setUsingRemote( weapon.remoteName );
300  weapon.remoteOwner ‪util::freeze_player_controls( true );
301 
302  ‪result = weapon.remoteOwner ‪killstreaks::init_ride_killstreak( weapon.remoteName, always_allow_ride );
303 
304  if( ‪result != "success" )
305  {
306  if( ‪result != "disconnect" )
307  {
308  weapon.remoteOwner ‪killstreaks::clear_using_remote();
310  }
311  }
312  else
313  {
314  weapon.controlled = true;
315  weapon.killCamEnt = self;
316  weapon notify("remote_start"); // shuts down the AI scripts for this weapon
317 
318  if ( allowManualDeactivation )
319  {
320  weapon thread watchRemoteControlDeactivate();
321  }
322 
323  weapon.remoteOwner thread [[level.remoteWeapons[ weapon.remoteName ].useCallback]]( weapon );
324 
325  if ( level.remoteWeapons[ weapon.remoteName ].hideCompassOnUse )
326  {
327  weapon.remoteOwner ‪killstreaks::hide_compass();
328  }
329  }
330 
331  weapon.remoteOwner ‪util::freeze_player_controls( false );
332 }
333 
335 {
336  self endon( "death" );
337 
338  self.remoteOwner waittill( "spawned" );
339 
340  self.control_initiated = false;
341 }
342 
344 {
345  self notify("WatchRemoteControlDeactivate_remoteWeapons");
346  self endon ("WatchRemoteControlDeactivate_remoteWeapons");
347  weapon = self;
348  weapon endon( "remote_weapon_end" );
349  weapon endon( "death" );
350  weapon.remoteOwner endon( "disconnect" );
351 
352  while( true )
353  {
354  timeUsed = 0;
355  while( weapon.remoteOwner UseButtonPressed() )
356  {
357  timeUsed += 0.05;
358  if ( timeUsed > ‪REMOTE_USE_HOLD_TIME_SECONDS )
359  {
360  weapon thread ‪EndRemoteControlWeaponUse( true );
361  return;
362  }
364  }
366  }
367 }
368 
369 function ‪EndRemoteControlWeaponUse( exitRequestedByOwner )
370 {
371  weapon = self;
372 
373  if( !isdefined( weapon ) || ‪IS_TRUE( weapon.endRemoteControlWeapon ) )
374  return;
375 
376  weapon.endRemoteControlWeapon = true;
377 
378  remote_controlled = ‪IS_TRUE( weapon.control_initiated ) || ‪IS_TRUE( weapon.controlled );
379 
380  while ( isdefined( weapon ) && ( weapon.forceWaitRemoteControl === true ) && ( remote_controlled == false ) )
381  {
382  remote_controlled = ( ‪IS_TRUE( weapon.control_initiated ) || ‪IS_TRUE( weapon.controlled ) );
384  }
385 
386  if ( !isdefined( weapon ) )
387  return;
388 
389  if( isdefined( weapon.remoteOwner ) && remote_controlled )
390  {
391 
392  if( isdefined( weapon.remoteWeaponShutdownDelay ) ) //when changing teams or disconnect, we can skip this
393  {
394  wait( weapon.remoteWeaponShutdownDelay );
395  }
396 
397  player = weapon.remoteOwner;
398 
399  if( player.dofutz === true )
400  {
401 
402  player ‪clientfield::set_to_player( "static_postfx", 1 );
403 
404  wait 1;
405 
406  if( isdefined( player ) )
407  {
408  player ‪clientfield::set_to_player( "static_postfx", 0 );
409  player.dofutz = false;
410  }
411  }
412  else if ( !exitRequestedByOwner && weapon.watch_remote_weapon_death === true && !IsAlive( weapon ) )
413  {
414  wait ( isdefined( weapon.watch_remote_weapon_death_duration ) ? weapon.watch_remote_weapon_death_duration : 1.0 );
415  }
416 
417  if( isdefined( player ) )
418  {
419  player thread ‪FadeToBlackAndBackIn();
420  player waittill( "fade2black" ); // we the prev call to be blocking, in the same time we dont want to be left with black screen if smth external kills this thread.
421  if( remote_controlled )
422  player unlink();
423  player ‪killstreaks::clear_using_remote( true ); // must come before the end use callback, its notify clears all the AI threads on the remote weapons
424  cleared_killstreak_delay = 1;
425  player EnableUsability(); // there are cases where the typical path to enable usability is not called, (because of some endon)
426  }
427  }
428 
429  if( isdefined( weapon ) && isdefined( weapon.remoteName ) )
430  {
431  self [[ level.remoteWeapons[ weapon.remoteName ].endUseCallback]]( weapon, exitRequestedByOwner );
432  }
433 
434  if( isdefined( weapon ))
435  {
436  weapon.killCamEnt = weapon;
437 
438  if( isdefined( weapon.remoteOwner ) )
439  {
440  if ( remote_controlled )
441  {
442  weapon.remoteOwner unlink();
443  if( !‪IS_TRUE( cleared_killstreak_delay ) )
445  weapon.remoteOwner ‪util::clientNotify( "nofutz" );
446  }
447 
448  if( isdefined( level.gameEnded ) && level.gameEnded )
449  {
450  weapon.remoteOwner ‪util::freeze_player_controls( true );
451  }
452  }
453  }
454 
455  if( isdefined( weapon ) )
456  {
457  weapon.control_initiated = false;
458  weapon.controlled = false;
459  if( isdefined( weapon.remoteOwner ) )
460  weapon.remoteOwner ‪killstreaks::unhide_compass();
461 
462  if( !exitRequestedByOwner || ‪IS_TRUE( weapon.one_remote_use ) )
463  weapon notify( "remote_weapon_end" );
464  }
465 }
466 
468 {
469  self endon( "disconnect" );
470  // self endon( "death" ); // never end on death as it may never fade back in
471 
473 
474  self ‪qrdrone::destroyHud();
475 
477 
478  self notify( "fade2black" );
479 
481 }
482 
483 function ‪stunStaticFX( duration )
484 {
485  self endon( "remove_remote_weapon" );
486  self.fullscreen_static.alpha = 0.65;
487  wait ( duration - 0.5 );
488  time = duration - 0.5;
489  while ( time < duration )
490  {
492  time += 0.05;
493  self.fullscreen_static.alpha -= 0.05;
494  }
495  self.fullscreen_static.alpha = 0.15;
496 }
497 
499 {
500  self UseServerVisionset( false );
501  self SetInfraredVision( false );
502  if ( isdefined(self.fullscreen_static) )
503  {
504  self.fullscreen_static ‪destroy();
505  }
506 
507  if ( isdefined( self.hud_prompt_exit ))
508  {
509  self.hud_prompt_exit ‪destroy();
510  }
511 }
512 
513 function ‪set_static( val )
514 {
515  owner = self.owner;
516  if( isdefined( owner ) && owner.usingvehicle && isdefined( owner.viewlockedentity ) && ( owner.viewlockedentity == self ) )
517  {
518  owner ‪clientfield::set_to_player( "static_postfx", val );
519  }
520 }
521 
522 function ‪do_static_fx()
523 {
524  self endon( "death" );
525  self ‪set_static( 1 );
526  wait 2;
527  self ‪set_static( 0 );
528  self notify( "static_fx_done" );
529 }
‪init_ride_killstreak
‪function init_ride_killstreak(streak, always_allow=false)
Definition: _killstreaks.gsc:2237
‪UseRemoteWeapon
‪function UseRemoteWeapon(weapon, weaponName, immediate, allowManualDeactivation=true, always_allow_ride=false)
Definition: _remote_weapons.gsc:74
‪set_static
‪function set_static(val)
Definition: _remote_weapons.gsc:513
‪hide_compass
‪function hide_compass()
Definition: _killstreaks.gsc:2456
‪is_bot
‪function is_bot()
Definition: util_shared.gsc:2488
‪ResetControlInitiatedUponOwnerRespawn
‪function ResetControlInitiatedUponOwnerRespawn()
Definition: _remote_weapons.gsc:334
‪do_static_fx
‪function do_static_fx()
Definition: _remote_weapons.gsc:522
‪set_to_player
‪function set_to_player(str_field_name, n_value)
Definition: clientfield_shared.gsc:58
‪init
‪function init()
Definition: _remote_weapons.gsc:24
‪FadeToBlackAndBackIn
‪function FadeToBlackAndBackIn()
Definition: _remote_weapons.gsc:467
‪REMOTE_USE_HOLD_TIME_SECONDS
‪#define REMOTE_USE_HOLD_TIME_SECONDS
Definition: _remote_weapons.gsh:1
‪screen_fade_in
‪function screen_fade_in(fadeintime)
Definition: hud_shared.gsc:264
‪destroyRemoteHUD
‪function destroyRemoteHUD()
Definition: _remote_weapons.gsc:498
‪freeze_player_controls
‪function freeze_player_controls(b_frozen=true)
Definition: util_shared.gsc:2474
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪destroyHud
‪function destroyHud()
Definition: _qrdrone.gsc:1608
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪reset_killstreak_delay_killcam
‪function reset_killstreak_delay_killcam()
Definition: _killstreaks.gsc:2451
‪RegisterRemoteWeapon
‪function RegisterRemoteWeapon(weaponName, hintString, useCallback, endUseCallback, hideCompassOnUse=true)
Definition: _remote_weapons.gsc:63
‪CreateRemoteWeaponTrigger
‪function CreateRemoteWeaponTrigger()
Definition: _remote_weapons.gsc:127
‪isUsingRemote
‪function isUsingRemote()
Definition: util_shared.gsc:2705
‪RemoveAndAssignNewRemoteControlTrigger
‪function RemoveAndAssignNewRemoteControlTrigger(remoteControlTrigger)
Definition: _remote_weapons.gsc:38
‪WatchRemoveRemoteControlledWeapon
‪function WatchRemoveRemoteControlledWeapon()
Definition: _remote_weapons.gsc:111
‪stunStaticFX
‪function stunStaticFX(duration)
Definition: _remote_weapons.gsc:483
‪on_spawned
‪function on_spawned(func, obj)
Definition: callbacks_shared.csc:245
‪setUsingRemote
‪function setUsingRemote(remoteName, set_killstreak_delay_killcam=true)
Definition: _util.gsc:569
‪WatchOwnerDisconnect
‪function WatchOwnerDisconnect()
Definition: _remote_weapons.gsc:173
‪waittill_any
‪function waittill_any(str_notify1, str_notify2, str_notify3, str_notify4, str_notify5)
Definition: util_shared.csc:375
‪UseRemoteControlWeapon
‪function UseRemoteControlWeapon(allowManualDeactivation=true, always_allow_ride=false)
Definition: _remote_weapons.gsc:253
‪AllowRemoteStart
‪function AllowRemoteStart()
Definition: _remote_weapons.gsc:204
‪unhide_compass
‪function unhide_compass()
Definition: _killstreaks.gsc:2461
‪WatchRemoteControlDeactivate
‪function WatchRemoteControlDeactivate()
Definition: _remote_weapons.gsc:343
‪clientNotify
‪function clientNotify(event)
Definition: util_shared.gsc:1416
‪AssignRemoteControlTrigger
‪function AssignRemoteControlTrigger(force_new_assignment=false)
Definition: _remote_weapons.gsc:44
‪WatchForHack
‪function WatchForHack()
Definition: _remote_weapons.gsc:97
‪screen_fade_out
‪function screen_fade_out(n_time, str_color)
Definition: lui_shared.csc:396
‪EndRemoteControlWeaponUse
‪function EndRemoteControlWeaponUse(exitRequestedByOwner)
Definition: _remote_weapons.gsc:369
‪clear_using_remote
‪function clear_using_remote(immediate, skipNotify)
Definition: _killstreaks.gsc:2403
‪destroy
‪function destroy(watcher, owner)
Definition: _decoy.gsc:108
‪watch_for_remove_remote_weapon
‪function watch_for_remove_remote_weapon()
Definition: _killstreaks.gsc:2250
‪result
‪function result(death, attacker, mod, weapon)
Definition: _zm_aat_blast_furnace.gsc:46
‪on_player_spawned
‪function on_player_spawned()
Definition: _remote_weapons.gsc:31
‪WatchRemoteTriggerUse
‪function WatchRemoteTriggerUse()
Definition: _remote_weapons.gsc:217
‪WatchWeaponDeath
‪function WatchWeaponDeath()
Definition: _remote_weapons.gsc:158
‪WatchRemoteTriggerDisable
‪function WatchRemoteTriggerDisable()
Definition: _remote_weapons.gsc:190
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265