1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\challenges_shared;
5 #using scripts\shared\clientfield_shared;
6 #using scripts\shared\hostmigration_shared;
7 #using scripts\shared\killstreaks_shared;
8 #using scripts\shared\popups_shared;
9 #using scripts\shared\util_shared;
10 #using scripts\shared\vehicle_shared;
11 #using scripts\shared\vehicle_death_shared;
12 #using scripts\shared\weapons\_hacker_tool;
13 #using scripts\shared\scoreevents_shared;
14 #using scripts\shared\math_shared;
15 #using scripts\shared\weapons\_heatseekingmissile;
16 #using scripts\mp\killstreaks\_qrdrone;
17 #using scripts\mp\killstreaks\_airsupport;
18 #using scripts\shared\vehicle_ai_shared;
20 #using scripts\mp\_util;
21 #using scripts\mp\gametypes\_shellshock;
22 #using scripts\mp\killstreaks\_killstreak_bundles;
23 #using scripts\mp\killstreaks\_killstreak_detect;
24 #using scripts\mp\killstreaks\_killstreak_hacking;
25 #using scripts\mp\killstreaks\_killstreakrules;
26 #using scripts\mp\killstreaks\_killstreaks;
27 #using scripts\mp\killstreaks\_remote_weapons;
29 #insert scripts\mp\_hacker_tool.gsh;
30 #insert scripts\mp\killstreaks\_killstreaks.gsh;
31 #insert scripts\shared\clientfields.gsh;
32 #insert scripts\shared\shared.gsh;
33 #insert scripts\shared\version.gsh;
34 #using scripts\shared\visionset_mgr_shared;
37 #define DART_NAME "dart"
38 #define DART_KILLSTREAK_NAME "killstreak_dart"
39 #define DART_STAT_NAME "dart_used"
41 #precache( "string", "KILLSTREAK_DART_HACKED" );
42 #precache( "string", "KILLSTREAK_DART_EARNED" );
43 #precache( "string", "KILLSTREAK_DART_NOT_AVAILABLE" );
44 #precache( "string", "KILLSTREAK_DART_INBOUND" );
45 #precache( "string", "KILLSTREAK_DART_HACKED" );
46 #precache( "string", "KILLSTREAK_DESTROYED_DART" );
47 #precache( "string", "mpl_killstreak_dart_strt" );
53 killstreaks::register_dialog(
DART_NAME,
"mpl_killstreak_dart_strt",
"dartDialogBundle",
"dartPilotDialogBundle",
"friendlyDart",
"enemyDart",
"enemyDartMultiple",
"friendlyDartHacked",
"enemyDartHacked",
"requestDart",
"threatDart" );
70 self endon(
"disconnect" );
71 self endon(
"death" );
72 self endon(
"dart_throw_failed" );
73 self endon(
"dart_entered" );
77 self notify(
"dart_throw_timed_out" );
84 notifyString =
self util::waittill_any_return(
"death",
"disconnect",
"dart_entered",
"dart_throw_timed_out",
"dart_throw_failed" );
86 if ( notifyString ==
"dart_entered" || notifyString ==
"death" )
96 assert( IsPlayer( player ) );
101 player DisableOffhandWeapons();
103 missileWeapon = player GetCurrentWeapon();
104 if( !( isdefined( missileWeapon ) && ( ( missileWeapon.name ==
"dart" ) || ( missileWeapon.name ==
"inventory_dart" ) ) ) )
109 notifyString = player
util::waittill_any_return(
"weapon_change",
"grenade_fire",
"death",
"disconnect",
"joined_team",
"emp_jammed",
"emp_grenaded" );
111 if( notifyString ==
"death" || notifyString ==
"emp_jammed" || notifyString ==
"emp_grenaded" )
113 if( player.waitingOnDartThrow )
114 player notify(
"dart_putaway" );
116 player EnableOffhandWeapons();
120 if( notifyString ==
"grenade_fire" )
126 if( notifyString ==
"weapon_change" )
128 if( player.waitingOnDartThrow )
129 player notify(
"dart_putaway" );
131 player EnableOffhandWeapons();
141 self.origin =
self.origin + ( 0, 0, 1000 );
146 assert( IsPlayer(
self ) );
148 playerEntNum = player.entNum;
150 player endon(
"disconnect" );
151 player endon(
"joined_team" );
153 player endon(
"dart_putaway" );
155 level endon(
"game_ended" );
157 player.waitingOnDartThrow = 1;
158 player waittill(
"grenade_fire", grenade, weapon );
159 player.waitingOnDartThrow = 0;
161 if( weapon != missileWeapon )
163 self notify(
"dart_throw_failed");
169 if (
trace[
"fraction"] < 1.0 )
171 self iprintlnbold( &
"KILLSTREAK_DART_NOT_AVAILABLE" );
173 self notify(
"dart_throw_failed");
181 self notify(
"dart_throw_failed");
185 player.dart_thrown_time = GetTime();
187 player TakeWeapon( missileWeapon );
192 player AddWeaponStat( GetWeapon(
"dart" ),
"used", 1 );
196 if( isdefined( dart ) )
230 if ( dart.health > dart.hackedhealth )
232 dart.health = dart.hackedhealth;
238 player_angles =
self getPlayerAngles();
239 forward = AnglesToForward( player_angles );
240 spawn_origin = origin + VectorScale( forward, 50 );
243 return physicstrace( origin, spawn_origin, ( -radius, -radius, 0 ), ( radius, radius, 2 * radius ),
self,
PHYSICS_TRACE_MASK_PHYSICS );
249 assert( IsPlayer( player ) );
250 playerEntNum = player.entNum;
251 player_angles = player getPlayerAngles();
257 DEFAULT( params.ksDartVehicle,
"veh_dart_mp" );
258 DEFAULT( params.ksDartInitialSpeed, 35 );
259 DEFAULT( params.ksDartAcceleration, 35 );
261 dart = SpawnVehicle( params.ksDartVehicle, spawn_origin, player_angles,
"dynamic_spawn_ai" );
263 dart.is_shutting_down = 0;
264 dart.team = player.team;
265 dart SetSpeedImmediate( params.ksDartInitialSpeed, params.ksDartAcceleration );
267 dart.health = dart.maxhealth;
275 dart.killstreak_id = killstreak_id;
281 dart.do_scripted_crash =
false;
282 dart.delete_on_death =
true;
283 dart.one_remote_use =
true;
284 dart.vehcheckforpredictedcrash =
true;
285 dart.predictedCollisionTime = 0.2;
286 dart.glasscollision_alt =
true;
287 dart.damageTaken = 0;
301 dart.forceWaitRemoteControl =
true;
307 player notify(
"dart_entered" );
316 remote_controlled =
IS_TRUE( dart.control_initiated ) ||
IS_TRUE( dart.controlled );
318 if( remote_controlled )
321 if ( isdefined( notifyString ) )
323 if( notifyString ==
"remote_weapon_end" )
324 dart waittill(
"dart_left" );
326 dart waittill(
"remote_weapon_end" );
330 dart waittill(
"dart_left" );
336 assert( IsPlayer( player ) );
338 if( !dart.is_shutting_down )
340 player.dart_thrown_time = undefined;
342 dart UseVehicle( player, 0 );
343 player.resurrect_not_allowed_by = undefined;
350 player.no_fade2black =
true;
352 dart.inHeliProximity =
false;
354 minHeightOverride = undefined;
355 minz_struct =
struct::get(
"vehicle_oob_minz",
"targetname");
356 if( isdefined( minz_struct ) )
357 minHeightOverride = minz_struct.origin[2];
382 dart.DetonateViaEMP = undefined;
384 attacker =
self [[ level.figure_out_attacker ]]( attacker );
385 if ( isdefined( attacker ) && ( !isdefined( dart.owner ) || dart.owner
util::IsEnemyPlayer( attacker ) ) )
390 LUINotifyEvent( &
"player_callout", 2, &
"KILLSTREAK_DESTROYED_DART", attacker.entnum );
393 if( isdefined( attacker ) && attacker != dart.owner )
401 function dartDamageOverride( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal )
405 if( ( sMeansOfDeath ==
"MOD_TRIGGER_HURT" ) ||
IS_TRUE( dart.is_shutting_down ) )
410 iDamage =
killstreaks::OnDamagePerWeapon(
DART_NAME, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon,
self.maxhealth, &
stop_remote_weapon,
self.maxhealth*0.4, undefined,
424 self endon(
"death" );
428 self waittill(
"veh_predictedcollision", velocity, normal, ent, stype );
429 self notify(
"veh_collision", velocity, normal, ent, stype );
431 if( stype ==
"glass" )
441 dart endon(
"death" );
442 dart.owner endon(
"disconnect" );
449 dart waittill(
"veh_collision", velocity, normal, ent, stype );
451 if( stype ===
"glass" )
454 dart SetSpeedImmediate( 0 );
467 player endon(
"dart_entered" );
468 dart endon(
"delete" );
470 dart waittill(
"death" );
481 player endon(
"dart_entered" );
482 dart endon(
"death" );
486 player
util::waittill_any(
"joined_team",
"disconnect",
"joined_spectators",
"emp_jammed" );
494 dart endon(
"death" );
496 level waittill(
"game_ended" );
504 dart endon(
"death" );
508 player endon(
"disconnect" );
514 DEFAULT( params.ksDartShotCount, 3 );
515 DEFAULT( params.ksDartBladeCount, 6 );
516 DEFAULT( params.ksDartWaitTimeAfterLastShot, 1 );
518 DEFAULT( params.ksBladeStartDistance, 0 );
519 DEFAULT( params.ksBladeEndDistance, 10000 );
520 DEFAULT( params.ksBladeStartSpreadRadius, 50 );
521 DEFAULT( params.ksBladeEndSpreadRadius, 1 );
527 dart waittill(
"weapon_fired" );
532 if( shotCount >= params.ksDartShotCount )
534 dart DisableDriverFiring(
true );
535 wait( params.ksDartWaitTimeAfterLastShot );
546 if( isdefined( owner ) )
553 if( isdefined( dart ) && ( dart.is_shutting_down == 1 ) )
556 dart.is_shutting_down = 1;
563 dart_original_team = dart.originalteam;
564 dart_killstreak_id = dart.killstreak_id;
566 if( Target_IsTarget( dart ) )
567 Target_Remove( dart );
569 iF( isalive( dart ) )
570 dart notify(
"death" );
574 DEFAULT( params.ksDartExplosionOuterRadius, 200 );
575 DEFAULT( params.ksDartExplosionInnerRadius, 1 );
576 DEFAULT( params.ksDartExplosionOuterDamage, 25 );
577 DEFAULT( params.ksDartExplosionInnerDamage, 350 );
578 DEFAULT( params.ksDartExplosionMagnitude, 1 );
580 PhysicsExplosionSphere( dart.origin,
581 params.ksDartExplosionOuterRadius,
582 params.ksDartExplosionInnerRadius,
583 params.ksDartExplosionMagnitude,
584 params.ksDartExplosionOuterDamage,
585 params.ksDartExplosionInnerDamage );
587 if( isdefined( owner ) )
591 dart RadiusDamage( dart.origin,
592 params.ksDartExplosionOuterRadius,
593 params.ksDartExplosionInnerDamage,
594 params.ksDartExplosionOuterDamage,
597 GetWeapon(
"dart" ) );
603 owner SetClientUIVisibilityFlag(
"hud_visible", 0 );
607 if( isdefined( params.ksExplosionRumble ) )
608 owner PlayRumbleOnEntity( params.ksExplosionRumble );
617 forward = AnglesToForward( dart.angles );
618 DEFAULT( params.ksDartCameraWatchDistance, 350 );
619 moveAmount = VectorScale( forward, -( params.ksDartCameraWatchDistance ) );
625 cam SetModel(
"tag_origin" );
627 dart SetSpeedImmediate( 0 );
629 owner CameraSetPosition( cam.origin );
630 owner CameraSetLookAt( dart.origin );
631 owner CameraActivate(
true );
633 DEFAULT( params.ksDartCameraWatchDuration, 2 );
634 wait( params.ksDartCameraWatchDuration );
636 if ( isdefined( owner ) )
638 owner CameraActivate(
false );
643 if( isdefined( owner ) )
645 if( !level.gameEnded )
648 owner SetClientUIVisibilityFlag(
"hud_visible", 1 );
652 if ( isdefined( owner ) )
660 if ( isdefined( dart ) )
662 dart notify(
"dart_left" );
669 dart endon(
"delete" );
671 if( isdefined( condition ) )
672 dart waittill( condition );
674 dart notify(
"delete" );
680 self endon(
"delete" );
681 self endon(
"death" );
688 self endon(
"game_ended" );
692 if ( !isdefined(
self.dartBda ) ||
self.dartBda == 0 )
694 bdaDialog =
"killNone";
696 else if (
self.dartBda == 1 )
700 else if (
self.dartBda == 2 )
704 else if (
self.dartBda == 3 )
708 else if (
self.dartBda > 3 )
710 bdaDialog =
"killMultiple";
715 self.dartBda = undefined;
722 weapon = dart SeatGetWeapon( 0 );
727 player.dart_killstreak_weapon = weapon;
736 player.get_stinger_target_override = undefined;
737 player.is_still_valid_target_for_stinger_override = undefined;
738 player.is_valid_target_for_stinger_override = undefined;
739 player.dart_killstreak_weapon = undefined;
741 player notify(
"stinger_IRT_off" );
747 targets = ArrayCombine( target_getArray(), level.MissileEntities,
false,
false );
748 targets = ArrayCombine( targets, level.players,
false,
false );
757 if ( !isdefined( ent ) )
760 entIsPlayer = IsPlayer( ent );
762 if ( entIsPlayer && !IsAlive( ent ) )
765 if ( ent.ignoreme ===
true )
768 dart = player GetVehicleOccupied();
769 if ( !isdefined( dart ) )
772 if ( DistanceSquared( dart.origin, ent.origin ) >
SQR( player.dart_killstreak_weapon.lockOnMaxRange ) )
775 if ( entIsPlayer && ent HasPerk(
"specialty_nokillstreakreticle" ) )
785 if ( !( target_isTarget( ent ) || IsPlayer( ent ) ) && !( isdefined( ent.allowContinuedLockonAfterInvis ) && ent.allowContinuedLockonAfterInvis ) )
788 dart = player GetVehicleOccupied();
789 if ( !isdefined( dart ) )
792 entIsPlayer = IsPlayer( ent );
794 if ( entIsPlayer && !IsAlive( ent ) )
797 if ( ent.ignoreme ===
true )
800 if ( DistanceSquared( dart.origin, ent.origin ) >
SQR( player.dart_killstreak_weapon.lockOnMaxRange ) )
803 if ( entIsPlayer && ent HasPerk(
"specialty_nokillstreakreticle" ) )