1 #using scripts\codescripts\struct;
3 #using scripts\shared\challenges_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\hostmigration_shared;
6 #using scripts\shared\hud_shared;
7 #using scripts\shared\killstreaks_shared;
8 #using scripts\shared\math_shared;
9 #using scripts\shared\popups_shared;
10 #using scripts\shared\scoreevents_shared;
11 #using scripts\shared\util_shared;
12 #using scripts\shared\weapons\_heatseekingmissile;
13 #using scripts\shared\weapons\_weaponobjects;
15 #using scripts\mp\_challenges;
16 #using scripts\mp\_util;
17 #using scripts\mp\gametypes\_hostmigration;
18 #using scripts\mp\gametypes\_shellshock;
19 #using scripts\mp\gametypes\_spawning;
20 #using scripts\mp\killstreaks\_ai_tank;
21 #using scripts\mp\killstreaks\_airsupport;
22 #using scripts\mp\killstreaks\_killstreakrules;
23 #using scripts\mp\killstreaks\_killstreaks;
24 #using scripts\mp\killstreaks\_remote_weapons;
26 #insert scripts\mp\_hacker_tool.gsh;
27 #insert scripts\shared\shared.gsh;
28 #insert scripts\shared\version.gsh;
30 #define UAV_REMOTE_FLY_TIME 60
31 #define UAV_REMOTE_AIM_ASSIST_RANGE 200
32 #define UAV_REMOTE_MAX_PAST_RANGE 200
33 #define UAV_REMOTE_MIN_HELI_PROXIMITY 150
34 #define UAV_REMOTE_MAX_HELI_PROXIMITY 300
35 #define UAV_REMOTE_PAST_RANGE_COUNTDOWN 6.1
36 #define UAV_REMOTE_HELI_RANGE_COUNTDOWN 6.1
37 #define UAV_REMOTE_COLLISION_RADIUS 18
38 #define UAV_REMOTE_Z_OFFSET -9
39 #define UAV_REMOTE_MODEL "veh_t6_drone_quad_rotor_mp"
40 #define UAV_REMOTE_MODEL_ENEMY "veh_t6_drone_quad_rotor_mp_alt"
41 #define UAV_DEATH_MODEL "veh_t6_drone_quad_rotor_mp"
42 #define QRDRONE_MAX_HEALTH 225
44 #precache( "string", "MP_REMOTE_UAV_PLACE" );
45 #precache( "string", "MP_REMOTE_UAV_CANNOT_PLACE" );
46 #precache( "string", "SPLASHES_DESTROYED_REMOTE_UAV" );
47 #precache( "string", "SPLASHES_MARKED_BY_REMOTE_UAV" );
48 #precache( "string", "SPLASHES_REMOTE_UAV_MARKED" );
49 #precache( "string", "SPLASHES_TURRET_MARKED_BY_REMOTE_UAV" );
50 #precache( "string", "SPLASHES_REMOTE_UAV_ASSIST" );
51 #precache( "string", "KILLSTREAK_EARNED_QRDRONE" );
52 #precache( "string", "KILLSTREAK_QRDRONE_NOT_AVAILABLE" );
53 #precache( "string", "KILLSTREAK_QRDRONE_INBOUND" );
54 #precache( "string", "KILLSTREAK_QRDRONE_HACKED" );
55 #precache( "eventstring", "mpl_killstreak_qrdrone" );
56 #precache( "fx", "killstreaks/fx_drgnfire_light_green_3p" );
57 #precache( "fx", "killstreaks/fx_drgnfire_light_red_3p" );
58 #precache( "fx", "killstreaks/fx_drgnfire_light_green_1p" );
59 #precache( "fx", "weapon/fx_muz_md_rifle_3p" );
60 #precache( "fx", "killstreaks/fx_drgnfire_explosion" );
61 #precache( "fx", "killstreaks/fx_drgnfire_impact_sparks" );
62 #precache( "fx", "killstreaks/fx_drgnfire_damage_state" );
63 #precache( "fx", "killstreaks/fx_drgnfire_rotor_wash_runner" );
69 level.qrdrone_vehicle =
"qrdrone_mp";
71 level.ai_tank_stun_fx =
"killstreaks/fx_agr_emp_stun";
73 level.QRDrone_minigun_flash =
"weapon/fx_muz_md_rifle_3p";
74 level.QRDrone_fx[
"explode"] =
"killstreaks/fx_drgnfire_explosion";
77 level._effect[
"quadrotor_nudge" ] =
"killstreaks/fx_drgnfire_impact_sparks";
78 level._effect[
"quadrotor_damage" ] =
"killstreaks/fx_drgnfire_damage_state";
81 level.QRDrone_dialog[
"launch"][0] =
"ac130_plt_yeahcleared";
82 level.QRDrone_dialog[
"launch"][1] =
"ac130_plt_rollinin";
83 level.QRDrone_dialog[
"launch"][2] =
"ac130_plt_scanrange";
85 level.QRDrone_dialog[
"out_of_range"][0] =
"ac130_plt_cleanup";
86 level.QRDrone_dialog[
"out_of_range"][1] =
"ac130_plt_targetreset";
88 level.QRDrone_dialog[
"track"][0] =
"ac130_fco_moreenemy";
89 level.QRDrone_dialog[
"track"][1] =
"ac130_fco_getthatguy";
90 level.QRDrone_dialog[
"track"][2] =
"ac130_fco_guymovin";
91 level.QRDrone_dialog[
"track"][3] =
"ac130_fco_getperson";
92 level.QRDrone_dialog[
"track"][4] =
"ac130_fco_guyrunnin";
93 level.QRDrone_dialog[
"track"][5] =
"ac130_fco_gotarunner";
94 level.QRDrone_dialog[
"track"][6] =
"ac130_fco_backonthose";
95 level.QRDrone_dialog[
"track"][7] =
"ac130_fco_gonnagethim";
96 level.QRDrone_dialog[
"track"][8] =
"ac130_fco_personnelthere";
97 level.QRDrone_dialog[
"track"][9] =
"ac130_fco_rightthere";
98 level.QRDrone_dialog[
"track"][10] =
"ac130_fco_tracking";
100 level.QRDrone_dialog[
"tag"][0] =
"ac130_fco_nice";
101 level.QRDrone_dialog[
"tag"][1] =
"ac130_fco_yougothim";
102 level.QRDrone_dialog[
"tag"][2] =
"ac130_fco_yougothim2";
103 level.QRDrone_dialog[
"tag"][3] =
"ac130_fco_okyougothim";
105 level.QRDrone_dialog[
"assist"][0] =
"ac130_fco_goodkill";
106 level.QRDrone_dialog[
"assist"][1] =
"ac130_fco_thatsahit";
107 level.QRDrone_dialog[
"assist"][2] =
"ac130_fco_directhit";
108 level.QRDrone_dialog[
"assist"][3] =
"ac130_fco_rightontarget";
110 level.QRDrone_lastDialogTime = 0;
112 level.QRDrone_noDeployZones = GetEntArray(
"no_vehicles",
"targetname" );
114 level._effect[
"qrdrone_prop"] =
"_t6/weapon/qr_drone/fx_qr_wash_3p";
146 if (!
self IsOnGround())
148 self iPrintLnBold( &
"KILLSTREAK_QRDRONE_NOT_PLACEABLE" );
155 self.isCarrying =
false;
169 if ( isAlive(
self ) && isdefined( carryQRDrone ) )
172 origin = carryQRDrone.origin;
173 angles =
self.angles;
174 carryQRDrone.soundEnt
delete();
175 carryQRDrone
delete();
194 pos = owner.origin + ( anglesToForward( owner.angles ) * 4 ) + ( anglesToUp( owner.angles ) * 50 );
196 carryQRDrone = spawnTurret(
"misc_turret", pos, GetWeapon(
"auto_gun_turret" ) );
197 carryQRDrone.turretType =
"sentry";
198 carryQRDrone SetTurretType(carryQRDrone.turretType);
199 carryQRDrone.origin = pos;
200 carryQRDrone.angles = owner.angles;
202 carryQRDrone.canBePlaced =
true;
203 carryQRDrone makeUnusable();
204 carryQRDrone.owner = owner;
205 carryQRDrone SetOwner( carryQRDrone.owner );
206 carryQRDrone.scale = 3;
207 carryQRDrone.inHeliProximity =
false;
211 carryQRDrone.rangeTrigger = GetEnt(
"qrdrone_range",
"targetname" );
212 if ( !isdefined( carryQRDrone.rangeTrigger ) )
215 carryQRDrone.maxDistance = 3600;
217 carryQRDrone.minHeight = level.mapCenter[2] - 800;
220 carryQRDrone.soundEnt =
spawn(
"script_origin", carryQRDrone.origin );
221 carryQRDrone.soundEnt.angles = carryQRDrone.angles;
222 carryQRDrone.soundEnt.origin = carryQRDrone.origin;
223 carryQRDrone.soundEnt linkTo( carryQRDrone );
224 carryQRDrone.soundEnt playLoopSound(
"recondrone_idle_high" );
231 self endon (
"death" );
232 self endon (
"disconnect" );
233 self endon (
"place_carryQRDrone" );
234 self endon (
"cancel_carryQRDrone" );
240 if (
self attackButtonPressed() )
242 self notify(
"place_carryQRDrone" );
249 self endon (
"death" );
250 self endon (
"disconnect" );
254 if ( !carryQRDrone.canBePlaced )
256 if (
self.team !=
"spectator" )
257 self iPrintLnBold( &
"KILLSTREAK_QRDRONE_NOT_PLACEABLE" );
258 if ( isdefined( carryQRDrone.soundEnt ) )
259 carryQRDrone.soundEnt
delete();
260 carryQRDrone
delete();
264 self.isCarrying =
false;
265 carryQRDrone.carriedBy = undefined;
267 carryQRDrone playSound(
"sentry_gun_plant" );
268 carryQRDrone notify (
"placed" );
273 self setCanDamage(
false );
274 self setContents( 0 );
276 self.carriedBy = carrier;
277 carrier.isCarrying =
true;
280 self notify (
"carried" );
286 if ( isdefined( level.QRDrone_noDeployZones ) && level.QRDrone_noDeployZones.size )
288 foreach( zone
in level.QRDrone_noDeployZones )
290 if (
self isTouching( zone ) )
300 self endon (
"death" );
301 self endon (
"disconnect" );
302 level endon (
"game_ended" );
304 carryQRDrone endon (
"placed" );
305 carryQRDrone endon (
"death" );
307 carryQRDrone.canBePlaced =
true;
308 lastCanPlaceCarryQRDrone = -1;
313 switch(
self getStance() )
326 placement =
self CanPlayerPlaceVehicle( 22, 22, 50, heightOffset, 0, 0 );
328 carryQRDrone.angles = placement[
"angles" ];
331 if ( carryQRDrone.canBePlaced != lastCanPlaceCarryQRDrone )
333 if ( carryQRDrone.canBePlaced )
336 if (
self attackButtonPressed() )
337 self notify(
"place_carryQRDrone" );
344 lastCanPlaceCarryQRDrone = carryQRDrone.canBePlaced;
352 level endon (
"game_ended" );
354 self.owner endon (
"place_carryQRDrone" );
355 self.owner endon (
"cancel_carryQRDrone" );
357 self.owner
util::waittill_any(
"death",
"disconnect",
"joined_team",
"joined_spectators" );
359 if ( isdefined(
self ) )
367 level endon(
"game_ended" );
368 self endon (
"disconnect" );
384 if (
result !=
"success" || level.gameEnded )
390 self notify(
"qrdrone_unlock" );
398 if ( killstreak_id == -1 )
400 self notify(
"qrdrone_unlock" );
406 self notify(
"qrdrone_unlock" );
407 QRDrone =
createQRDrone( lifeId,
self, streakName, origin, angles, killstreak_id );
409 if ( isdefined( QRDrone ) )
411 self thread QRDrone_Ride( lifeId, QRDrone, streakName );
412 QRDrone waittill(
"end_remote" );
419 self iPrintLnBold( &
"MP_TOO_MANY_VEHICLES" );
429 lockSpot =
spawn(
"script_origin",
self.origin );
431 self playerLinkTo( lockSpot );
440 level endon(
"game_ended" );
448 function createQRDrone( lifeId, owner, streakName, origin, angles, killstreak_id )
450 QRDrone = spawnHelicopter( owner, origin, angles, level.qrdrone_vehicle,
UAV_REMOTE_MODEL );
451 if ( !isdefined( QRDrone ) )
454 QRDrone.lifeId = lifeId;
455 QRDrone.team = owner.team;
456 QRDrone.pers[
"team"] = owner.team;
457 QRDrone.owner = owner;
459 QRDrone.health = 999999;
460 QRDrone.maxHealth = 250;
461 QRDrone.damageTaken = 0;
462 QRDrone.destroyed =
false;
463 QRDrone setCanDamage(
true );
464 QRDrone EnableAimAssist();
466 QRDrone.smoking =
false;
467 QRDrone.inHeliProximity =
false;
468 QRDrone.heliType =
"qrdrone";
469 QRDrone.markedPlayers = [];
470 QRDrone.isStunned =
false;
472 QRDrone SetDrawInfrared(
true );
474 QRDrone.killCamEnt = QRDrone.owner;
487 Target_Set( QRDrone, (0,0,0) );
488 Target_SetTurretAquire( QRDrone,
false );
490 QRDrone.numFlares = 0;
491 QRDrone.flareOffset = (0,0,-100);
495 QRDrone.emp_fx =
spawn(
"script_model",
self.origin );
496 QRDrone.emp_fx SetModel(
"tag_origin" );
497 QRDrone.emp_fx LinkTo(
self,
"tag_origin", (0,0,-20) + AnglesToForward(
self.angles) * 6 );
509 QRDrone.playerLinked =
true;
510 self.restoreAngles =
self.angles;
512 QRDrone usevehicle(
self, 0 );
516 self AddWeaponStat( GetWeapon(
"killstreak_qrdrone" ),
"used", 1 );
518 self.qrdrone_rideLifeId = lifeId;
519 self.QRDrone = QRDrone;
525 if ( isdefined( level.qrdrone_vision ) )
531 level endon(
"game_ended" );
532 self endon (
"disconnect" );
533 QRDrone endon (
"death" );
534 QRDrone endon (
"end_remote" );
535 QRDrone endon (
"end_launch_dialog" );
543 if ( isdefined( QRDrone ) )
545 QRDrone.playerLinked =
false;
548 if ( isdefined(
self.viewlockedentity ) )
551 if ( isdefined(level.gameEnded) && level.gameEnded )
562 if ( isdefined( QRDrone ) )
564 QRDrone notify(
"end_remote" );
568 self setPlayerAngles(
self.restoreAngles );
577 self.QRDrone = undefined;
582 player endon(
"disconnect");
583 self endon(
"death" );
584 self endon (
"blowup" );
585 self endon (
"crashing" );
586 level endon (
"game_ended" );
587 self endon (
"end_remote" );
589 self.lockSounds =
spawn(
"script_model",
self.origin);
591 self.lockSounds LinkTo(
self,
"tag_player" );
595 self waittill(
"locking on" );
604 self.lockSounds PlaySoundToPlayer(
"uin_alert_lockon", player );
610 self.lockSounds PlaySoundToPlayer(
"uin_alert_lockon", player );
616 self.lockSounds StopSounds();
625 if ( isdefined(
self.locking_on) &&
self.locking_on )
633 if ( isdefined(
self.locked_on) &&
self.locked_on )
642 self endon(
"disconnect" );
643 self endon(
"death" );
644 level endon(
"game_ended" );
654 level endon(
"game_ended" );
655 self endon (
"disconnect" );
656 QRDrone endon (
"death" );
657 QRDrone endon (
"end_remote" );
665 while(
self UseButtonPressed() )
668 if( timeUsed > 0.75 )
681 if ( isdefined(
self) )
691 player endon(
"disconnect");
695 hurt = GetEntArray(
"trigger_hurt",
"classname" );
697 foreach( trig
in hurt )
699 if ( trig.origin[2] <= player.origin[2] && ( !isDefined( trig.script_parameters ) || trig.script_parameters !=
"qrdrone_safe" ) )
701 killbrushes[ killbrushes.size ] = trig;
705 crate_triggers = GetEntArray(
"crate_kill_trigger",
"targetname" );
709 for (i = 0; i < killbrushes.size; i++)
711 if (
self istouching(killbrushes[i]) )
718 foreach( trigger
in crate_triggers )
720 if ( trigger.active &&
self istouching(trigger) )
727 if ( isdefined( level.levelKillbrushes ) )
729 foreach( trigger
in level.levelKillbrushes )
731 if (
self istouching(trigger) )
739 if ( level.script ==
"mp_castaway" )
741 origin =
self.origin - ( 0, 0, 12 );
742 water = GetWaterHeight( origin );
744 if ( water - origin[2] > 0 )
764 if( health_pct > .5 )
766 return level._effect[
"quadrotor_damage" ];
774 if( isdefined(
self.damage_fx_ent ) )
776 if(
self.damage_fx_ent.effect == effect )
781 self.damage_fx_ent
delete();
799 playfxontag( effect,
self,
"tag_origin" );
806 if( isdefined( effect ) )
812 if( isdefined(
self.damage_fx_ent ) )
814 self.damage_fx_ent
delete();
821 self endon(
"death" );
823 self.maxhealth = 999999;
824 self.health =
self.maxhealth;
832 self waittill(
"damage",
damage, attacker, dir, point, mod, model, tag, part, weapon, flags );
834 if( !isdefined( attacker ) || !isplayer( attacker ) )
837 self.owner playrumbleonentity(
"damage_heavy");
840 self.damage_debug = (
damage +
" (" + weapon.name +
")" );
843 if ( mod ==
"MOD_RIFLE_BULLET" || mod ==
"MOD_PISTOL_BULLET")
845 if ( isPlayer( attacker ) )
847 if ( attacker HasPerk(
"specialty_armorpiercing" ) )
853 if (weapon.weapClass ==
"spread")
857 if ( weapon.isEmp && (mod ==
"MOD_GRENADE_SPLASH"))
865 if ( weapon.isStun && (mod ==
"MOD_GRENADE_SPLASH" || mod ==
"MOD_GAS") )
867 self.isStunned =
true;
872 self.attacker = attacker;
874 self.owner SendKillstreakDamageEvent(
int(
damage) );
882 self.owner SendKillstreakDamageEvent( 200 );
896 self endon(
"death" );
897 self notify(
"stunned" );
903 if (isdefined(
self.owner.fullscreen_static))
911 self.isStunned =
false;
916 if( isdefined(
self.damage_fx_ent ) )
918 self.damage_fx_ent
delete();
921 if ( isdefined(attacker) && IsPlayer(attacker) && attacker !=
self.owner)
928 attacker AddWeaponStat( weapon,
"destroyed_qrdrone", 1 );
930 attacker AddWeaponStat( weapon,
"destroyed_controlled_killstreak", 1 );
941 PlayFXOnTag( level.ai_tank_stun_fx,
self.emp_fx,
"tag_origin" );
944 self waittill(
"crash_done" );
946 if ( isdefined(
self.emp_fx) )
948 self.emp_fx
delete();
960 playfxontag(
self.deathfx,
self,
self.deathfxtag );
961 self playsound(
"veh_qrdrone_sparks");
966 self endon(
"crash_done" );
967 self endon(
"death" );
968 self notify(
"crashing" );
971 self takeplayercontrol();
973 self SetMaxPitchRoll( 90, 180 );
974 self SetPhysAcceleration( ( 0, 0, -800 ) );
976 side_dir = VectorCross( hitdir, (0,0,1) );
977 side_dir_mag = RandomFloatRange( -100, 100 );
979 side_dir *= side_dir_mag;
981 velocity =
self GetVelocity();
982 self SetVehVelocity( velocity + (0,0,100) + VectorNormalize( side_dir ) );
984 ang_vel =
self GetAngularVelocity();
985 ang_vel = ( ang_vel[0] * 0.3, ang_vel[1], ang_vel[2] * 0.3 );
987 yaw_vel = RandomFloatRange( 0, 210 ) *
math::sign( ang_vel[1] );
990 ang_vel += ( RandomFloatRange( -100, 100 ), yaw_vel, RandomFloatRange( -200, 200 ) );
992 self SetAngularVelocity( ang_vel );
994 self.crash_accel = RandomFloatRange( 75, 110 );
1000 self playsound(
"veh_qrdrone_dmg_hit");
1005 if( RandomInt( 100 ) < 40 )
1013 self notify(
"crash_done" );
1019 dmg_ent =
spawn(
"script_origin",
self.origin);
1020 dmg_ent linkto (
self);
1021 dmg_ent PlayLoopSound (
"veh_qrdrone_dmg_loop");
1023 dmg_ent stoploopsound(.2);
1030 self endon(
"crash_done" );
1031 self endon(
"change_state" );
1032 self endon(
"death" );
1034 weapon =
self SeatGetWeapon( 0 );
1035 fireTime = weapon.fireTime;
1040 while( time < totalFireTime )
1051 self endon(
"crash_done" );
1052 self endon(
"death" );
1058 velocity =
self GetVelocity();
1059 self SetVehVelocity( velocity + AnglesToUp(
self.angles ) *
self.crash_accel );
1060 self.crash_accel *= 0.98;
1065 if( count % 8 == 0 )
1067 if( RandomInt( 100 ) > 40 )
1069 if( velocity[2] > 150.0 )
1071 self.crash_accel *= 0.75;
1073 else if( velocity[2] < 40.0 && count < 60 )
1075 if( Abs(
self.angles[0] ) > 30 || Abs(
self.angles[2] ) > 30 )
1077 self.crash_accel = RandomFloatRange( 160, 200 );
1081 self.crash_accel = RandomFloatRange( 85, 120 );
1091 self endon(
"crash_done" );
1092 self endon(
"death" );
1096 self waittill(
"veh_collision", velocity, normal );
1097 ang_vel =
self GetAngularVelocity() * 0.5;
1098 self SetAngularVelocity( ang_vel );
1100 velocity =
self GetVelocity();
1103 if( normal[2] < 0.7 )
1105 self SetVehVelocity( velocity + normal * 70 );
1106 self playsound (
"veh_qrdrone_wall");
1107 PlayFX( level._effect[
"quadrotor_nudge" ],
self.origin );
1114 self playsound (
"veh_qrdrone_explo");
1115 self notify(
"crash_done" );
1122 self endon (
"death" );
1131 qrdrone_height =
struct::get(
"qrdrone_height",
"targetname");
1132 if ( isdefined(qrdrone_height) )
1134 self.maxHeight = qrdrone_height.origin[2];
1141 if( isdefined( zoffset ) )
1142 self.maxHeight += zoffset;
1144 self.maxDistance = 12800;
1146 self.minHeight = level.mapCenter[2] - 800;
1147 if( isdefined( minHeightOverride ) )
1148 self.minHeight = minHeightOverride;
1151 self.centerRef =
spawn(
"script_model", level.mapCenter );
1154 inRangePos =
self.origin;
1156 self.rangeCountdownActive =
false;
1167 if ( !
self.rangeCountdownActive )
1169 self.rangeCountdownActive =
true;
1172 if ( isdefined(
self.heliInProximity ) )
1174 dist = distance(
self.origin,
self.heliInProximity.origin );
1179 dist = distance(
self.origin, inRangePos );
1189 self notify(
"in_range" );
1190 self.rangeCountdownActive =
false;
1195 inRangePos =
self.origin;
1203 if (
self.origin[2] <
self.maxHeight &&
self.origin[2] >
self.minHeight && !
self.inHeliProximity )
1205 if (
self isMissileInsideHeightLock() )
1216 self endon (
"death" );
1219 staticAlpha -= 0.05;
1220 if ( staticAlpha < 0 )
1234 self endon(
"death" );
1235 self endon(
"in_range" );
1237 if ( isdefined(
self.heliInProximity ) )
1244 self.owner notify(
"stop_signal_failure" );
1246 if( isdefined(
self.distance_shutdown_override ) )
1248 return [[
self.distance_shutdown_override ]]();
1259 self endon (
"death" );
1260 self endon(
"end_ride" );
1264 if( isdefined(
self.owner ) )
1283 self endon (
"death" );
1285 level waittill(
"game_ended" );
1297 qrdrone endon (
"death" );
1299 if ( !level.vehiclesTimed )
1302 qrdrone.flyTime = 60.0;
1303 waittime =
self.flyTime - 10;
1306 qrdrone.flyTime = GetDvarInt(
"scr_QRDroneFlyTime" );
1307 waittime =
self.flyTime - 10;
1310 wait( qrdrone.flyTime );
1341 level endon(
"game_ended" );
1342 self endon(
"death" );
1345 self notify(
"leaving" );
1350 self notify(
"death" );
1355 return self UseButtonPressed();
1360 level endon(
"game_ended" );
1361 self endon(
"death" );
1362 self.owner endon(
"disconnect" );
1372 if ( timeUsed > 0.25 )
1387 if ( level.gameEnded )
1392 if( isdefined(
self.owner ) )
1394 if (
self.playerLinked ==
true )
1400 if ( isdefined(
self.scrambler ) )
1401 self.scrambler
delete();
1403 if ( isdefined(
self) && isdefined(
self.centerRef ) )
1404 self.centerRef
delete();
1406 Target_SetTurretAquire(
self,
false );
1408 if( isdefined(
self.damage_fx_ent ) )
1410 self.damage_fx_ent
delete();
1413 if ( isdefined(
self.emp_fx ) )
1415 self.emp_fx
delete();
1424 playFXOnTag( level.chopper_fx[
"light"][
"belly"],
self,
"tag_light_nose" );
1426 playFXOnTag( level.chopper_fx[
"light"][
"tail"],
self,
"tag_light_tail1" );
1432 if ( dialogGroup ==
"tag" )
1437 if ( getTime() - level.QRDrone_lastDialogTime < waitTime )
1440 level.QRDrone_lastDialogTime = getTime();
1442 randomIndex = randomInt( level.QRDrone_dialog[ dialogGroup ].size );
1443 soundAlias = level.QRDrone_dialog[ dialogGroup ][ randomIndex ];
1445 self playLocalSound( soundAlias );
1450 level endon(
"game_ended" );
1451 self endon(
"death" );
1452 self endon(
"end_remote" );
1456 inHeliProximity =
false;
1458 if ( !
self.inHeliProximity && inHeliProximity )
1459 self.inHeliProximity =
true;
1460 else if (
self.inHeliProximity && !inHeliProximity )
1462 self.inHeliProximity =
false;
1463 self.heliInProximity = undefined;
1473 self.owner endon(
"disconnect");
1474 self endon(
"death");
1476 while(
self.owner attackbuttonpressed() )
1481 while( !
self.owner attackbuttonpressed() )
1487 self.owner thread
hud::fade_to_black_for_x_sec( GetDvarfloat(
"scr_rcbomb_fadeOut_delay" ), GetDvarfloat(
"scr_rcbomb_fadeOut_timeIn" ), GetDvarfloat(
"scr_rcbomb_fadeOut_timeBlack" ), GetDvarfloat(
"scr_rcbomb_fadeOut_timeOut" ) );
1492 self endon (
"disconnect" );
1493 QRDrone endon (
"death" );
1494 QRDrone endon (
"blowup" );
1495 QRDrone endon (
"crashing" );
1496 level endon (
"game_ended" );
1497 QRDrone endon (
"end_remote" );
1504 if (
self AttackButtonPressed() )
1506 QRDrone FireWeapon();
1507 weapon = GetWeapon(
"qrdrone_turret" );
1508 fireTime = weapon.fireTime;
1521 self.owner endon(
"disconnect");
1522 self endon (
"death");
1524 self notify(
"blowup");
1526 explosionOrigin =
self.origin;
1527 explosionAngles =
self.angles;
1529 if ( !isdefined( attacker ) )
1531 attacker =
self.owner;
1534 origin =
self.origin + (0,0,10);
1539 if ( isdefined(attacker) )
1541 self radiusDamage( origin, radius, max_damage, min_damage, attacker,
"MOD_EXPLOSIVE",
self.weapon );
1543 PhysicsExplosionSphere( origin, radius, radius, 1, max_damage, min_damage );
1547 playsoundatposition(
"veh_qrdrone_explo",
self.origin);
1549 PlayFX( level.QRDrone_fx[
"explode"] , explosionOrigin, (0, 0, 1 ));
1552 if( isdefined(
self.owner))
1556 if ( attacker !=
self.owner )
1558 level.globalKillstreaksDestroyed++;
1559 attacker AddWeaponStat(
self.weapon,
"destroyed", 1 );
1564 self.owner SendKillstreakDamageEvent( 600 );
1571 if ( isdefined(
self.neverDelete ) &&
self.neverDelete )
1583 self endon(
"disconnect");
1585 self UseServerVisionset(
true );
1586 self SetVisionSetForPlayer( level.qrdrone_vision, 1 );
1588 self.QRDrone waittill(
"end_remote");
1590 self UseServerVisionset(
false );
1610 if( isdefined(
self) )
1612 self notify (
"stop_signal_failure" );
1613 self.flashingSignalFailure =
false;
1616 if ( isdefined(
self.fullscreen_static ) )
1626 if ( isdefined(
self.fullscreen_static ) )
1628 self.fullscreen_static.alpha = alpha;
1633 if( !isdefined(
self.flashingSignalFailure ) || !
self.flashingSignalFailure )
1636 self.flashingSignalFailure =
true;
1637 if (
self IsRemoteControlling() )
1643 self notify (
"stop_signal_failure" );
1645 self.flashingSignalFailure =
false;
1652 self endon(
"stop_signal_failure" );
1653 drone endon(
"death" );
1658 drone PlaySoundToPlayer(
"uin_alert_lockon",
self );