1 #using scripts\codescripts\struct;
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;
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;
17 #insert scripts\mp\killstreaks\_remote_weapons.gsh;
20 #define REMOTE_WEAPON_NAME "killstreak_remote"
22 #namespace remote_weapons;
26 level.remoteWeapons = [];
27 level.remoteExitHint = &
"MP_REMOTE_EXIT";
33 self endon(
"disconnect");
40 ArrayRemoveValue(
self.activeRemoteControlTriggers, remoteControlTrigger );
46 if ( !isdefined(
self.activeRemoteControlTriggers ) )
47 self.activeRemoteControlTriggers = [];
49 ArrayRemoveValue(
self.activeRemoteControlTriggers, undefined );
51 if ( ( !isdefined(
self.remoteControlTrigger ) || force_new_assignment ) &&
self.activeRemoteControlTriggers.size > 0 )
53 self.remoteControlTrigger =
self.activeRemoteControlTriggers[
self.activeRemoteControlTriggers.size - 1 ];
56 if ( isdefined(
self.remoteControlTrigger ) )
58 self.remoteControlTrigger.origin =
self.origin;
59 self.remoteControlTrigger LinkTo(
self );
65 assert( isdefined( level.remoteWeapons ) );
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;
74 function UseRemoteWeapon( weapon, weaponName, immediate, allowManualDeactivation =
true, always_allow_ride =
false )
77 assert( IsPlayer( player ) );
79 weapon.remoteOwner = player;
80 weapon.initTime = GetTime();
81 weapon.remoteName = weaponName;
82 weapon.remoteWeaponAllowManualDeactivation = allowManualDeactivation;
100 weapon endon(
"death" );
102 weapon waittill(
"killstreak_hacked", hacker );
104 if ( isdefined( weapon.remoteWeaponAllowManualDeactivation ) && weapon.remoteWeaponAllowManualDeactivation ==
true )
108 weapon.remoteOwner = hacker;
114 weapon endon(
"remote_weapon_end" );
119 while( isdefined( weapon ) )
130 player = weapon.remoteOwner;
132 if ( isdefined( weapon.useTrigger ) )
134 weapon.useTrigger
delete();
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 );
144 weapon.useTrigger SetTeamForTrigger( player.team );
145 weapon.useTrigger.team = player.team;
147 player ClientClaimTrigger( weapon.useTrigger );
148 player.remoteControlTrigger = weapon.useTrigger;
149 player.activeRemoteControlTriggers[ player.activeRemoteControlTriggers.size ] = weapon.useTrigger;
150 weapon.useTrigger.ClaimedBy = player;
161 weapon.useTrigger endon(
"death" );
165 if ( isdefined( weapon.remoteOwner ) )
170 weapon.useTrigger
delete();
176 weapon endon(
"remote_weapon_end" );
177 weapon endon(
"remote_weapon_shutdown" );
179 if( isdefined( weapon.useTrigger ) )
180 weapon.useTrigger endon(
"death" );
182 weapon.remoteOwner
util::waittill_any(
"joined_team",
"disconnect",
"joined_spectators" );
186 if( isdefined( weapon ) && isdefined( weapon.useTrigger ) )
187 weapon.useTrigger
delete();
193 weapon endon(
"remote_weapon_end" );
194 weapon endon(
"remote_weapon_shutdown" );
195 weapon.useTrigger endon(
"death" );
199 weapon.useTrigger TriggerEnable( !( weapon.remoteOwner IsWallRunning() ) );
207 if( player useButtonPressed() && !player.throwingGrenade && !player meleeButtonPressed() && !player
util::isUsingRemote() && !( isdefined( player.carryObject ) &&
IS_TRUE( player.carryObject.disallowRemoteControl ) ) )
220 weapon endon(
"death" );
221 weapon endon(
"remote_weapon_end" );
230 weapon.useTrigger waittill(
"trigger", player );
232 if( weapon.remoteOwner IsUsingOffhand() || weapon.remoteOwner IsWallRunning() )
237 if( isdefined( weapon.hackertrigger ) && isdefined( weapon.hackertrigger.progressbar ) )
239 if( weapon.remoteName ==
"killstreak_remote_turret" )
241 weapon.remoteOwner iPrintLnBold( &
"KILLSTREAK_AUTO_TURRET_NOT_AVAILABLE" );
255 self endon(
"death" );
259 assert( isdefined( weapon.remoteOwner ) );
261 weapon.control_initiated =
true;
262 weapon.endRemoteControlWeapon =
false;
264 weapon.remoteOwner endon(
"disconnect" );
265 weapon.remoteOwner endon(
"joined_team" );
267 weapon.remoteOwner DisableOffhandWeapons();
268 weapon.remoteOwner DisableWeaponCycling();
270 weapon.remoteOwner.dofutz =
false;
272 if( !isdefined( weapon.disableRemoteWeaponSwitch ) )
274 remoteWeapon = GetWeapon(
"killstreak_remote" );
275 weapon.remoteOwner giveWeapon( remoteWeapon );
276 weapon.remoteOwner switchToWeapon( remoteWeapon );
278 if ( always_allow_ride )
284 weapon.remoteOwner waittill(
"weapon_change", newWeapon );
288 if( isdefined( newweapon ) )
290 if( newweapon != remoteWeapon )
314 weapon.controlled =
true;
315 weapon.killCamEnt =
self;
316 weapon notify(
"remote_start");
318 if ( allowManualDeactivation )
320 weapon thread watchRemoteControlDeactivate();
323 weapon.remoteOwner thread [[level.remoteWeapons[ weapon.remoteName ].useCallback]]( weapon );
325 if ( level.remoteWeapons[ weapon.remoteName ].hideCompassOnUse )
336 self endon(
"death" );
338 self.remoteOwner waittill(
"spawned" );
340 self.control_initiated =
false;
345 self notify(
"WatchRemoteControlDeactivate_remoteWeapons");
346 self endon (
"WatchRemoteControlDeactivate_remoteWeapons");
348 weapon endon(
"remote_weapon_end" );
349 weapon endon(
"death" );
350 weapon.remoteOwner endon(
"disconnect" );
355 while( weapon.remoteOwner UseButtonPressed() )
373 if( !isdefined( weapon ) ||
IS_TRUE( weapon.endRemoteControlWeapon ) )
376 weapon.endRemoteControlWeapon =
true;
378 remote_controlled =
IS_TRUE( weapon.control_initiated ) ||
IS_TRUE( weapon.controlled );
380 while ( isdefined( weapon ) && ( weapon.forceWaitRemoteControl ===
true ) && ( remote_controlled ==
false ) )
382 remote_controlled = (
IS_TRUE( weapon.control_initiated ) ||
IS_TRUE( weapon.controlled ) );
386 if ( !isdefined( weapon ) )
389 if( isdefined( weapon.remoteOwner ) && remote_controlled )
392 if( isdefined( weapon.remoteWeaponShutdownDelay ) )
394 wait( weapon.remoteWeaponShutdownDelay );
397 player = weapon.remoteOwner;
399 if( player.dofutz ===
true )
406 if( isdefined( player ) )
409 player.dofutz =
false;
412 else if ( !exitRequestedByOwner && weapon.watch_remote_weapon_death ===
true && !IsAlive( weapon ) )
414 wait ( isdefined( weapon.watch_remote_weapon_death_duration ) ? weapon.watch_remote_weapon_death_duration : 1.0 );
417 if( isdefined( player ) )
420 player waittill(
"fade2black" );
421 if( remote_controlled )
424 cleared_killstreak_delay = 1;
425 player EnableUsability();
429 if( isdefined( weapon ) && isdefined( weapon.remoteName ) )
431 self [[ level.remoteWeapons[ weapon.remoteName ].endUseCallback]]( weapon, exitRequestedByOwner );
434 if( isdefined( weapon ))
436 weapon.killCamEnt = weapon;
438 if( isdefined( weapon.remoteOwner ) )
440 if ( remote_controlled )
442 weapon.remoteOwner unlink();
443 if( !
IS_TRUE( cleared_killstreak_delay ) )
448 if( isdefined( level.gameEnded ) && level.gameEnded )
455 if( isdefined( weapon ) )
457 weapon.control_initiated =
false;
458 weapon.controlled =
false;
459 if( isdefined( weapon.remoteOwner ) )
462 if( !exitRequestedByOwner ||
IS_TRUE( weapon.one_remote_use ) )
463 weapon notify(
"remote_weapon_end" );
469 self endon(
"disconnect" );
478 self notify(
"fade2black" );
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 )
493 self.fullscreen_static.alpha -= 0.05;
495 self.fullscreen_static.alpha = 0.15;
500 self UseServerVisionset(
false );
501 self SetInfraredVision(
false );
502 if ( isdefined(
self.fullscreen_static) )
507 if ( isdefined(
self.hud_prompt_exit ))
516 if( isdefined( owner ) && owner.usingvehicle && isdefined( owner.viewlockedentity ) && ( owner.viewlockedentity ==
self ) )
524 self endon(
"death" );
528 self notify(
"static_fx_done" );