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\flag_shared;
7 #using scripts\shared\hostmigration_shared;
8 #using scripts\shared\killstreaks_shared;
9 #using scripts\shared\popups_shared;
10 #using scripts\shared\scoreevents_shared;
11 #using scripts\shared\turret_shared;
12 #using scripts\shared\util_shared;
13 #using scripts\shared\vehicle_death_shared;
14 #using scripts\shared\vehicle_shared;
15 #using scripts\shared\weapons\_weaponobjects;
17 #using scripts\mp\_util;
18 #using scripts\mp\gametypes\_globallogic_audio;
19 #using scripts\mp\gametypes\_hostmigration;
20 #using scripts\mp\gametypes\_spawning;
21 #using scripts\mp\killstreaks\_airsupport;
22 #using scripts\mp\killstreaks\_airsupport;
23 #using scripts\mp\killstreaks\_emp;
24 #using scripts\mp\killstreaks\_killstreakrules;
25 #using scripts\mp\killstreaks\_killstreaks;
26 #using scripts\mp\killstreaks\_killstreak_bundles;
27 #using scripts\mp\killstreaks\_killstreak_hacking;
28 #using scripts\mp\killstreaks\_placeables;
29 #using scripts\mp\killstreaks\_remote_weapons;
30 #using scripts\mp\killstreaks\_turret;
31 #using scripts\mp\teams\_teams;
33 #insert scripts\mp\_hacker_tool.gsh;
34 #insert scripts\mp\killstreaks\_killstreaks.gsh;
35 #insert scripts\shared\shared.gsh;
36 #insert scripts\shared\version.gsh;
38 #precache( "string", "KILLSTREAK_EARNED_AUTO_TURRET" );
39 #precache( "string", "KILLSTREAK_AUTO_TURRET_NOT_AVAILABLE" );
41 #precache( "string", "KILLSTREAK_AUTO_TURRET_CRATE" );
42 #precache( "string", "KILLSTREAK_MICROWAVE_TURRET_CRATE" );
43 #precache( "string", "KILLSTREAK_EARNED_AUTO_TURRET" );
44 #precache( "string", "KILLSTREAK_AUTO_TURRET_NOT_AVAILABLE" );
45 #precache( "string", "KILLSTREAK_AIRSPACE_FULL" );
46 #precache( "string", "KILLSTREAK_EARNED_MICROWAVE_TURRET" );
47 #precache( "string", "KILLSTREAK_MICROWAVE_TURRET_NOT_AVAILABLE" );
48 #precache( "string", "KILLSTREAK_MICROWAVE_TURRET_HACKED" );
49 #precache( "string", "KILLSTREAK_MICROWAVE_TURRET_INBOUND" );
50 #precache( "string", "KILLSTREAK_DESTROYED_MICROWAVE_TURRET" );
51 #precache( "triggerstring", "KILLSTREAK_MICROWAVE_TURRET_PLACE_TURRET_HINT" );
52 #precache( "triggerstring", "KILLSTREAK_MICROWAVE_TURRET_INVALID_TURRET_LOCATION" );
53 #precache( "triggerstring", "KILLSTREAK_MICROWAVE_TURRET_PICKUP" );
54 #precache( "string", "mpl_killstreak_turret" );
55 #precache( "string", "mpl_killstreak_auto_turret" );
56 #precache( "fx", "killstreaks/fx_sentry_emp_stun" );
57 #precache( "fx", "killstreaks/fx_sentry_damage_state" );
58 #precache( "fx", "killstreaks/fx_sentry_death_state" );
59 #precache( "fx", "killstreaks/fx_sentry_exp" );
60 #precache( "fx", "killstreaks/fx_sentry_disabled_spark" );
61 #precache( "fx", "killstreaks/fx_sg_emp_stun" );
62 #precache( "fx", "killstreaks/fx_sg_damage_state" );
63 #precache( "fx", "killstreaks/fx_sg_death_state" );
64 #precache( "fx", "killstreaks/fx_sg_exp" );
65 #precache( "fx", "killstreaks/fx_sg_distortion_cone_ash" );
66 #precache( "fx", "killstreaks/fx_sg_distortion_cone_ash_sm" );
67 #precache( "fx", "explosions/fx_exp_equipment_lg" );
68 #precache( "model", MICROWAVE_TURRET_INVALID_PLACEMENT_MODEL );
69 #precache( "model", MICROWAVE_TURRET_VALID_PLACEMENT_MODEL );
70 #precache( "model", "wpn_t7_none_world" );
72 #using_animtree( "mp_microwaveturret" );
74 #define MICROWAVE_TURRET_NAME "microwave_turret"
75 #define MICROWAVE_TURRET_WEAPON_NAME "microwave_turret_deploy"
76 #define MICROWAVE_TURRET_ON_TARGET_ANGLE (15)
77 #define MICROWAVE_TURRET_DELETE_ON_DEATH_DELAY 0.1
79 #define MICROWAVE_TURRET_FX_SIZE ( 135 )
80 #define MICROWAVE_TURRET_FX_HALF_SIZE_THRESHOLD ( 68 )
81 #define MICROWAVE_TURRET_FX_START_OFFSET ( 68 + 34 )
82 #define MICROWAVE_TURRET_FX "killstreaks/fx_sg_distortion_cone_ash"
83 #define MICROWAVE_TURRET_FX_HALF "killstreaks/fx_sg_distortion_cone_ash_sm"
84 #define MICROWAVE_TURRET_STUN_FX "killstreaks/fx_sg_emp_stun"
85 #define MICROWAVE_TURRET_FX_TRACE_ANGLE ( 55 )
86 #define MICROWAVE_TURRET_FX_CHECK_TIME ( 1.0 )
88 #namespace microwave_turret;
94 killstreaks::register_dialog(
MICROWAVE_TURRET_NAME,
"mpl_killstreak_turret",
"microwaveTurretDialogBundle", undefined,
"friendlyMicrowaveTurret",
"enemyMicrowaveTurret",
"enemyMicrowaveTurretMultiple",
"friendlyMicrowaveTurretHacked",
"enemyMicrowaveTurretHacked",
"requestMicrowaveTurret",
"threatMicrowaveTurret" );
97 level.microwaveOpenAnim = %o_turret_guardian_open;
98 level.microwaveCloseAnim = %o_turret_guardian_close;
112 turretVehicle =
self;
116 turretVehicle.damageTaken = 0;
117 turretVehicle.deal_no_crush_damage =
true;
118 turretVehicle.health = turretVehicle.maxhealth;
123 turretVehicle.soundmod =
"hpm";
129 turretVehicle.aim_only_no_shooting =
true;
145 self.lastMicrowavedBy = undefined;
146 self.beingMicrowavedBy = undefined;
152 assert( IsPlayer( player ) );
166 bundle.ksPlaceableHint, bundle.ksPlaceableInvalidLocationHint );
168 turret.damageTaken = 0;
177 if( event !=
"placed" )
188 assert( IsPlayer( player ) );
190 if( isdefined( turret.vehicle ) )
192 turret.vehicle.origin = turret.origin;
193 turret.vehicle.angles = turret.angles;
200 turret.vehicle.owner = player;
201 turret.vehicle SetOwner( player );
202 turret.vehicle.ownerEntNum = player.entNum;
203 turret.vehicle.parentStruct = turret;
205 turret.vehicle.team = player.team;
206 turret.vehicle SetTeam( player.team );
208 turret.vehicle.ignore_vehicle_underneath_splash_scalar =
true;
209 turret.vehicle.use_non_teambased_enemy_selection =
true;
210 turret.vehicle.turret = turret;
223 Target_Set( turret.vehicle, ( 0, 0, 36 ) );
232 turretVehicle =
self;
233 turretvehicle.turret notify(
"hacker_delete_placeable_trigger" );
240 turretVehicle =
self;
246 turret notify(
"microwave_turret_shutdown" );
255 turret.vehicle LinkTo( turret );
256 Target_Remove( turret.vehicle );
265 self endon(
"death" );
277 function OnTurretDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal )
281 iDamage =
self killstreaks::OnDamagePerWeapon(
MICROWAVE_TURRET_NAME, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon,
self.maxhealth, undefined,
self.maxhealth*0.4, undefined, empDamage, undefined,
true, 1.0 );
282 self.damageTaken += iDamage;
286 function OnTurretDeath( eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime )
288 turretVehicle =
self;
290 eAttacker =
self [[ level.figure_out_attacker ]]( eAttacker );
292 if ( isdefined( turretVehicle.parentStruct ) )
296 if ( turretVehicle.parentStruct.killstreakTimedOut ===
true && isdefined( turretVehicle.owner ) )
302 if ( isdefined( eAttacker ) && IsPlayer( eAttacker ) && isdefined( turretVehicle.owner ) && ( eAttacker != turretVehicle.owner ) )
307 if( isdefined( eAttacker ) && IsPlayer( eAttacker ) && ( !isdefined(
self.owner ) ||
self.owner
util::IsEnemyPlayer( eAttacker ) ) )
312 eAttacker AddPlayerStat(
"destroy_turret", 1 );
313 eAttacker AddWeaponStat( weapon,
"destroy_turret", 1 );
314 LUINotifyEvent( &
"player_callout", 2, &
"KILLSTREAK_DESTROYED_MICROWAVE_TURRET", eAttacker.entnum );
317 if ( isdefined( turretVehicle.parentStruct ) )
319 turretVehicle.parentStruct notify(
"microwave_turret_shutdown" );
326 turretVehicle
delete();
331 turretVehicle =
self;
333 if ( isdefined( turretVehicle.parentStruct ) )
337 if ( isdefined( turretVehicle.parentStruct ) )
339 turretVehicle.parentStruct notify(
"microwave_turret_shutdown" );
346 turretVehicle
delete();
354 if ( isdefined( turret.vehicle ) )
356 turret.vehicle playsound (
"mpl_m_turret_exp");
357 turret.vehicle Kill();
360 turret notify(
"microwave_turret_shutdown" );
367 turret waittill(
"microwave_turret_shutdown" );
375 if ( isdefined( turret.trigger ) )
377 turret.trigger
delete();
385 if ( isdefined( turret.vehicle ))
403 if( isdefined( turret ) )
408 if ( isdefined( turret.vehicle ) )
413 turret playsound (
"mpl_microwave_beam_off");
415 if( isdefined( turret.microwaveFXEnt ) )
417 turret.microwaveFXEnt
delete();
422 if( isdefined( turret.trigger ) )
424 turret.trigger notify(
"microwave_end_fx" );
425 turret.trigger Delete();
429 turret notify(
"stop_turret_debug" );
437 turret endon(
"stop_turret_debug" );
441 if ( GetDvarInt(
"scr_microwave_turret_debug" ) != 0 )
458 debug_line_frames = 3;
460 angles = turret.vehicle GetTagAngles(
"tag_flash" );
461 origin = turret.vehicle GetTagOrigin(
"tag_flash" );
464 forward = AnglesToForward( angles ) ;
474 turret endon(
"microwave_turret_shutdown" );
476 turret.trigger endon(
"death" );
477 turret.trigger endon(
"delete" );
479 turret.turret_vehicle_entnum = turret.vehicle GetEntityNumber();
483 turret.trigger waittill(
"trigger", ent );
488 if ( !isdefined( ent.beingMicrowavedBy ) )
490 ent.beingMicrowavedBy = [];
493 if( !isdefined( ent.beingMicrowavedBy[ turret.turret_vehicle_entnum ] ) )
502 entity endon(
"disconnect" );
503 entity endon(
"end_MicrowaveEntityPostShutdownCleanup" );
507 turret_vehicle_entnum = turret.turret_vehicle_entnum;
509 turret waittill(
"microwave_turret_shutdown" );
511 if ( isdefined(entity) )
513 if ( isdefined( entity.beingMicrowavedBy ) && isdefined( entity.beingMicrowavedBy[ turret_vehicle_entnum ] ) )
515 entity.beingMicrowavedBy[ turret_vehicle_entnum ] = undefined;
524 turret endon(
"microwave_turret_shutdown" );
525 entity endon(
"disconnect" );
526 entity endon(
"death" );
528 if ( IsPlayer( entity ) )
530 entity endon(
"joined_team" );
531 entity endon(
"joined_spectators" );
536 entity.beingMicrowavedBy[ turret.turret_vehicle_entnum ] = turret.owner;
537 entity.microwaveDamageInitialDelay =
true;
538 entity.microwaveEffect = 0;
540 shellShockScalar = 1;
544 if ( IsPlayer( entity ) && entity hasPerk(
"specialty_microwaveprotection" ) )
546 shellShockScalar = getDvarFloat(
"specialty_microwaveprotection_shellshock_scalar", 0.5 );
547 viewKickScalar = getDvarFloat(
"specialty_microwaveprotection_viewkick_scalar", 0.5 );
548 damageScalar = getDvarFloat(
"specialty_microwaveprotection_damage_scalar", 0.5 );
551 turretWeapon = GetWeapon(
"microwave_turret" );
557 if( !isdefined(entity))
562 entity.beingMicrowavedBy[ turret.turret_vehicle_entnum ] = undefined;
564 if( isdefined( entity.microwavePoisoning ) && entity.microwavePoisoning )
566 entity.microwavePoisoning =
false;
569 entity notify(
"end_MicrowaveEntityPostShutdownCleanup" );
576 if ( level.hardcoreMode )
583 if ( !isdefined( entity.microwavePoisoning ) || !entity.microwavePoisoning )
585 entity.microwavePoisoning =
true;
586 entity.microwaveEffect = 0;
591 if ( isdefined( entity.microwaveDamageInitialDelay ) )
594 entity.microwaveDamageInitialDelay = undefined;
606 entity.microwaveEffect++;
607 entity.lastMicrowavedBy = turret.owner;
610 if( IsPlayer(entity) && !(entity IsRemoteControlling() ) )
612 if ( time -
VAL( entity.microwaveShellshockAndViewKickTime, 0 ) > 950 )
614 if( entity.microwaveEffect % 2 == 1 )
618 entity shellshock(
"mp_radiation_low", 1.5 * shellShockScalar );
619 entity ViewKick(
int( 25 * viewKickScalar ), turret.origin );
623 entity shellshock(
"mp_radiation_med", 1.5 * shellShockScalar );
624 entity ViewKick(
int( 50 * viewKickScalar ), turret.origin );
628 entity shellshock(
"mp_radiation_high", 1.5 * shellShockScalar );
629 entity ViewKick(
int( 75 * viewKickScalar ), turret.origin );
632 entity.microwaveShellshockAndViewKickTime = time;
637 if( IsPlayer( entity ) && entity.microwaveEffect % 3 == 2 )
650 if( !IsAlive( entity ) )
655 if( !IsPlayer( entity ) && !IsAi( entity ) )
660 if ( entity.ignoreme ===
true )
666 if( isdefined( turret.carried ) && turret.carried )
676 if( isdefined( turret.owner ) && entity == turret.owner )
691 angles = turret.vehicle GetTagAngles(
"tag_flash" );
692 origin = turret.vehicle GetTagOrigin(
"tag_flash" );
694 shoot_at_pos = entity GetShootAtPos( turret );
696 entDirection = vectornormalize( shoot_at_pos - origin );
697 forward = AnglesToForward( angles ) ;
698 dot = vectorDot( entDirection, forward );
704 if( entity damageConeTrace( origin, turret, forward ) <= 0 )