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 )