1 #using scripts\codescripts\struct;
3 #using scripts\shared\challenges_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\math_shared;
6 #using scripts\shared\scoreevents_shared;
7 #using scripts\shared\util_shared;
9 #using scripts\mp\_challenges;
10 #using scripts\mp\_util;
11 #using scripts\mp\killstreaks\_airsupport;
12 #using scripts\mp\killstreaks\_dogs;
13 #using scripts\mp\killstreaks\_killstreakrules;
14 #using scripts\mp\killstreaks\_killstreaks;
15 #using scripts\mp\killstreaks\_missile_swarm;
17 #insert scripts\mp\_hacker_tool.gsh;
18 #insert scripts\shared\shared.gsh;
19 #insert scripts\shared\version.gsh;
21 #precache( "string", "KILLSTREAK_EARNED_MISSILE_SWARM" );
22 #precache( "string", "KILLSTREAK_MISSILE_SWARM_NOT_AVAILABLE" );
23 #precache( "string", "KILLSTREAK_MISSILE_SWARM_INBOUND" );
24 #precache( "string", "KILLSTREAK_MISSILE_SWARM_HACKED" );
25 #precache( "eventstring", "mpl_killstreak_missile_swarm" );
26 #precache( "fx", "killstreaks/fx_hrpy_swrm_os_circle" );
27 #precache( "fx", "killstreaks/fx_hrpy_swrm_exhaust_trail_close" );
29 #namespace missile_swarm;
33 level.missile_swarm_max = 6;
34 level.missile_swarm_flyheight = 3000;
35 level.missile_swarm_flydist = 5000;
39 level.swarm_fx[
"swarm" ] =
"killstreaks/fx_hrpy_swrm_os_circle";
40 level.swarm_fx[
"swarm_tail"] =
"killstreaks/fx_hrpy_swrm_exhaust_trail_close";
41 level.missileDroneSoundStart =
"mpl_hk_scan";
58 assert( hardpointType ==
"missile_swarm" );
60 level.missile_swarm_origin = level.mapCenter + ( 0, 0, level.missile_swarm_flyheight );
62 if ( level.script ==
"mp_drone" )
64 level.missile_swarm_origin = level.missile_swarm_origin + ( -5000, 0, 2000 );
66 if ( level.script ==
"mp_la" )
68 level.missile_swarm_origin = level.missile_swarm_origin + ( 0, 0, 2000 );
70 if ( level.script ==
"mp_turbine" )
72 level.missile_swarm_origin = level.missile_swarm_origin + ( 0, 0, 1500 );
74 if ( level.script ==
"mp_downhill" )
76 level.missile_swarm_origin = level.missile_swarm_origin + ( 4000, 0, 1000 );
78 if ( level.script ==
"mp_hydro" )
80 level.missile_swarm_origin = level.missile_swarm_origin + ( 0, 0, 5000 );
82 if ( level.script ==
"mp_magma" )
84 level.missile_swarm_origin = level.missile_swarm_origin + ( 0, -6000, 3000 );
86 if ( level.script ==
"mp_uplink" )
88 level.missile_swarm_origin = level.missile_swarm_origin + ( -6000, 0, 2000 );
90 if ( level.script ==
"mp_bridge" )
92 level.missile_swarm_origin = level.missile_swarm_origin + ( 0, 0, 2000 );
94 if ( level.script ==
"mp_paintball" )
96 level.missile_swarm_origin = level.missile_swarm_origin + ( 0, 0, 1000 );
100 if ( killstreak_id == -1 )
112 level endon(
"swarm_end" );
114 missiles = GetEntArray(
"swarm_missile",
"targetname" );
116 foreach( missile
in missiles )
118 if ( isdefined( missile ) )
125 if ( isdefined( level.missile_swarm_fx ) )
127 for ( i = 0; i < level.missile_swarm_fx.size; i++ )
129 if ( isdefined ( level.missile_swarm_fx[i] ) )
131 level.missile_swarm_fx[i]
delete();
136 level.missile_swarm_fx = undefined;
137 level.missile_swarm_team = owner.team;
138 level.missile_swarm_owner = owner;
141 owner AddWeaponStat( GetWeapon(
"missile_swarm" ),
"used", 1 );
152 level notify(
"swarm_end" );
162 missiles = GetEntArray(
"swarm_missile",
"targetname" );
166 for ( i=0; i<level.missile_swarm_fx.size; i++ )
168 if ( isdefined ( level.missile_swarm_fx[i] ) )
170 level.missile_swarm_fx[i]
delete();
173 foreach( missile
in missiles )
175 if ( isdefined( missile ) )
184 foreach( missile
in missiles )
186 if ( isdefined( missile ) )
188 yaw = RandomIntRange( 0, 360 );
189 angles = ( 0, yaw, 0 );
191 forward = AnglesToForward( angles );
193 if ( isdefined( missile.goal ) )
194 missile.goal.origin = missile.origin + forward * level.missile_swarm_flydist;
200 level.missile_swarm_sound StopLoopSound( 2 );
203 level.missile_swarm_sound
delete();
205 recordStreakIndex = level.killstreakindices[level.killstreaks[
"missile_swarm"].menuname];
206 if ( isdefined( recordStreakIndex ) && isdefined( owner ) )
211 level.missile_swarm_owner = undefined;
215 missiles = GetEntArray(
"swarm_missile",
"targetname" );
217 foreach( missile
in missiles )
219 if ( isdefined( missile ) )
228 for ( i=0; i<level.missile_swarm_fx.size; i++ )
230 if( isdefined( level.missile_swarm_fx[i] ) )
232 level.missile_swarm_fx[i]
delete();
239 level endon(
"swarm_end" );
241 owner
util::waittill_any(
"disconnect",
"joined_team",
"joined_spectators",
"emp_jammed" );
247 level endon(
"swarm_end" );
249 owner waittill(
"emp_destroyed_missile_swarm", attacker );
258 level endon(
"swarm_end" );
261 level.missile_swarm_fx = [];
263 yaw = RandomInt( 360 );
264 level.missile_swarm_fx[0] =
spawn(
"script_model", level.missile_swarm_origin );
265 level.missile_swarm_fx[0] SetModel(
"tag_origin" );
266 level.missile_swarm_fx[0].angles = ( -90, yaw, 0 );
268 level.missile_swarm_fx[1] =
spawn(
"script_model", level.missile_swarm_origin );
269 level.missile_swarm_fx[1] SetModel(
"tag_origin" );
270 level.missile_swarm_fx[1].angles = ( -90, yaw, 0 );
272 level.missile_swarm_fx[2] =
spawn(
"script_model", level.missile_swarm_origin );
273 level.missile_swarm_fx[2] SetModel(
"tag_origin" );
274 level.missile_swarm_fx[2].angles = ( -90, yaw, 0 );
276 level.missile_swarm_fx[3] =
spawn(
"script_model", level.missile_swarm_origin );
277 level.missile_swarm_fx[3] SetModel(
"tag_origin" );
278 level.missile_swarm_fx[3].angles = ( -90, yaw, 0 );
280 level.missile_swarm_fx[4] =
spawn(
"script_model", level.missile_swarm_origin );
281 level.missile_swarm_fx[4] SetModel(
"tag_origin" );
282 level.missile_swarm_fx[4].angles = ( -90, yaw, 0 );
284 level.missile_swarm_fx[5] =
spawn(
"script_model", level.missile_swarm_origin );
285 level.missile_swarm_fx[5] SetModel(
"tag_origin" );
286 level.missile_swarm_fx[5].angles = ( -90, yaw, 0 );
288 level.missile_swarm_fx[6] =
spawn(
"script_model", level.missile_swarm_origin );
289 level.missile_swarm_fx[6] SetModel(
"tag_origin" );
290 level.missile_swarm_fx[6].angles = ( -90, yaw, 0 );
292 level.missile_swarm_sound =
spawn(
"script_model", level.missile_swarm_origin );
293 level.missile_swarm_sound SetModel(
"tag_origin" );
294 level.missile_swarm_sound.angles = ( 0, 0, 0 );
298 PlayFXOnTag( level.swarm_fx[
"swarm" ], level.missile_swarm_fx[0],
"tag_origin" );
302 level.missile_swarm_sound PlayLoopSound(
"veh_harpy_drone_swarm_lp", 3 );
308 if( !isdefined( level.missile_swarm_fx[current] ) )
310 level.missile_swarm_fx[current] =
spawn(
"script_model", level.missile_swarm_origin );
311 level.missile_swarm_fx[current] SetModel(
"tag_origin" );
313 yaw = RandomInt( 360 );
315 if ( isdefined( level.missile_swarm_fx[current] ) )
317 level.missile_swarm_fx[current].angles = ( -90, yaw, 0 );
322 if ( isdefined( level.missile_swarm_fx[current] ) )
324 PlayFXOnTag( level.swarm_fx[
"swarm" ], level.missile_swarm_fx[current],
"tag_origin" );
327 current = (current+1) % 7;
334 level endon(
"swarm_end" );
336 lifetime = GetDvarFloat(
"scr_missile_swarm_lifetime" );
337 end_time = GetTime() + ( lifetime * 1000 );
338 level.missile_swarm_count = 0;
340 while ( GetTime() < end_time )
342 assert( level.missile_swarm_count >= 0 );
344 if ( level.missile_swarm_count >= level.missile_swarm_max )
351 level.missile_swarm_count += count;
353 for ( i = 0; i < count; i++ )
358 wait( ( level.missile_swarm_count / level.missile_swarm_max ) + 0.4 );
367 player.swarm_cam =
true;
370 forward = AnglesToForward(
self.angles );
371 cam =
spawn(
"script_model",
self.origin + ( 0, 0, 300 ) + forward * -200 );
372 cam SetModel(
"tag_origin" );
375 player CameraSetPosition( cam );
376 player CameraSetLookAt(
self );
377 player CameraActivate(
true );
379 self waittill(
"death" );
382 player CameraActivate(
false );
384 player.swarm_cam =
false;
390 self endon(
"death" );
396 if ( DistanceSquared(
self.origin,
self.goal.origin ) < 256 * 256 )
398 if ( DistanceSquared(
self.origin, level.missile_swarm_origin ) > level.missile_swarm_flydist * level.missile_swarm_flydist )
400 self.goal.origin = level.missile_swarm_origin;
406 if ( isdefined( enemy ) )
408 self.goal.origin = enemy.origin + ( 0, 0,
self.origin[2] );
412 pitch = RandomIntRange( -45, 45 );
413 yaw = RandomIntRange( 0, 360 );
414 angles = ( 0, yaw, 0 );
416 forward = AnglesToForward( angles );
418 self.goal.origin =
self.origin + forward * level.missile_swarm_flydist;
422 while ( isdefined(nfz) && tries > 0 )
425 pitch = RandomIntRange( -45, 45 );
426 yaw = RandomIntRange( 0, 360 );
427 angles = ( 0, yaw, 0 );
429 forward = AnglesToForward( angles );
431 self.goal.origin =
self.origin + forward * level.missile_swarm_flydist;
440 self endon(
"death" );
446 wait( RandomFloatRange( 0.5, 1.0 ) );
451 if ( isdefined( target ) )
453 self.swarm_target = target[
"entity" ];
454 target[
"entity" ].swarm =
self;
455 if ( allowPlayerOffset )
457 self Missile_SetTarget( target[
"entity" ], target[
"offset" ] );
458 self Missile_DroneSetVisible(
true );
462 self Missile_SetTarget( target[
"entity" ] );
463 self Missile_DroneSetVisible(
true );
466 self PlaySound(
"veh_harpy_drone_swarm_incomming" );
467 if ( !isdefined(target[
"entity" ].swarmSound) || target[
"entity" ].swarmSound ==
false)
471 self Missile_SetTarget(
self.goal );
472 self Missile_DroneSetVisible(
false );
481 targetent endon(
"death");
482 targetent endon(
"disconnect");
483 targetent endon(
"joined_team");
484 self endon(
"death" );
488 if ( isdefined(
self.warningSoundDist ) )
489 dist =
self.warningSoundDist;
490 while( DistanceSquared(
self.origin, targetent.origin ) > dist * dist )
494 if (isdefined(targetent.swarmSound) && targetent.swarmSound ==
true)
497 targetent.swarmSound =
true;
501 if ( isPlayer( targetent ) )
503 targetent PlayLocalSound( level.missileDroneSoundStart );
505 self PlaySound( level.missileDroneSoundStart );
513 if ( isdefined( targetent ) && isPlayer( targetent ) )
515 targetent StopLocalSound( level.missileDroneSoundStart );
522 if (isdefined(target))
523 target.swarmSound =
false;
528 level endon(
"swarm_end" );
530 upVector = ( 0, 0, RandomIntRange( level.missile_swarm_flyheight - 1500, level.missile_swarm_flyheight - 1000 ) );
532 yaw = RandomIntRange( 0, 360 );
533 angles = ( 0, yaw, 0 );
534 forward = AnglesToForward( angles );
536 origin = level.mapCenter + upVector + forward * level.missile_swarm_flydist * -1;
537 target = level.mapCenter + upVector + forward * level.missile_swarm_flydist;
541 if ( isdefined( enemy ) )
543 target = enemy.origin + upVector;
545 projectile =
projectile_spawn_utility( owner, target, origin, getweapon(
"missile_swarm_projectile" ),
"swarm_missile",
true );
553 if ( isdefined( projectile ) )
562 goal =
spawn(
"script_model", target );
563 goal SetModel(
"tag_origin" );
565 p = MagicBullet( weapon, origin, target, owner, goal );
570 p.targetname =
"swarm_missile";
573 if ( !
IS_TRUE( owner.swarm_cam ) && GetDvarInt(
"scr_swarm_cam" ) == 1 )
583 self waittill(
"death" );
584 level.missile_swarm_count--;
590 self endon(
"death" );
601 if ( isdefined( ks ) && !isdefined( player ) )
605 else if ( !isdefined( ks ) && isdefined( player ) )
609 else if ( isdefined( ks ) && isdefined( player ) )
625 ks[
"offset" ] = ( 0, 0, -10 );
627 targets = Target_GetArray();
628 rcbombs = GetEntArray(
"rcbomb",
"targetname" );
629 satellites = GetEntArray(
"satellite",
"targetname" );
632 targets = ArrayCombine( targets, rcbombs,
true,
false );
633 targets = ArrayCombine( targets, satellites,
true,
false );
634 targets = ArrayCombine( targets, dogs,
true,
false );
636 if ( targets.size <= 0 )
641 targets = ArraySort( targets,
self.origin );
643 foreach( target
in targets )
645 if ( isdefined( target.owner ) && target.owner ==
self.owner )
650 if ( isdefined( target.script_owner ) && target.script_owner ==
self.owner )
655 if ( level.teambased && isdefined( target.team ) )
657 if ( target.team ==
self.team )
664 if ( BulletTracePassed(
self.origin, target.origin,
false, target ) )
666 ks[
"entity" ] = target;
673 end = target.origin + ( 0, 0, 2048 );
674 if ( BulletTracePassed( target.origin,
end,
false, target ) )
676 ks[
"entity" ] = target;
690 players = GetPlayers();
691 players = ArraySort( players,
self.origin );
693 foreach( player
in players )
701 if ( BulletTracePassed(
self.origin, player.origin,
false, player ) )
703 target[
"entity" ] = player;
704 target[
"offset" ] = ( 0, 0, 0 );
710 if ( BulletTracePassed(
self.origin, player GetEye(),
false, player ) )
712 target[
"entity" ] = player;
713 target[
"offset" ] = ( 0, 0, 50 );
721 end = player.origin + ( 0, 0, 2048 );
722 if ( BulletTracePassed( player.origin,
end,
false, player ) )
724 target[
"entity" ] = player;
725 target[
"offset" ] = ( 0, 0, 30 );
737 level.playerTargetedTimes = [];
738 players = GetPlayers();
740 foreach( player
in players )
747 level.playerTargetedTimes[ player.clientid ] = 0;
754 players = GetPlayers();
758 foreach( player
in players )
765 if ( !isdefined(level.playerTargetedTimes[ player.clientID ]) )
767 level.playerTargetedTimes[ player.clientID ] = 0;
769 if ( level.playerTargetedTimes[ player.clientID ] < lowest || ( level.playerTargetedTimes[ player.clientID ] == lowest && RandomInt(100) > 50 ) )
772 lowest = level.playerTargetedTimes[ player.clientID ];
776 if ( isdefined( target ) )
778 level.playerTargetedTimes[ target.clientID ] = level.playerTargetedTimes[ target.clientID ] + 1;
787 if ( player.sessionstate !=
"playing" )
792 if ( !IsAlive( player ) )
797 if ( player == owner )
802 if ( level.teambased )
804 if ( team == player.team )
815 if ( isdefined( player.lastspawntime ) && GetTime() - player.lastspawntime < 3000 )
821 if ( player IsInMoveMode(
"ufo",
"noclip" ) )