1 #using scripts\codescripts\struct;
3 #using scripts\mp\_util;
4 #using scripts\mp\gametypes\_hostmigration;
5 #using scripts\mp\killstreaks\_airsupport;
6 #using scripts\mp\killstreaks\_emp;
7 #using scripts\mp\killstreaks\_killstreakrules;
8 #using scripts\mp\killstreaks\_killstreak_bundles;
9 #using scripts\mp\killstreaks\_killstreak_hacking;
10 #using scripts\mp\killstreaks\_killstreaks;
11 #using scripts\mp\killstreaks\_placeables;
12 #using scripts\mp\teams\_teams;
13 #using scripts\mp\teams\_teams;
15 #using scripts\shared\callbacks_shared;
16 #using scripts\shared\challenges_shared;
17 #using scripts\shared\clientfield_shared;
18 #using scripts\shared\hostmigration_shared;
19 #using scripts\shared\killstreaks_shared;
20 #using scripts\shared\killstreaks_shared;
21 #using scripts\shared\popups_shared;
22 #using scripts\shared\turret_shared;
23 #using scripts\shared\util_shared;
24 #using scripts\shared\vehicle_shared;
25 #using scripts\shared\weapons\_weaponobjects;
26 #using scripts\shared\scoreevents_shared;
28 #insert scripts\mp\_hacker_tool.gsh;
29 #insert scripts\mp\killstreaks\_killstreaks.gsh;
30 #insert scripts\shared\shared.gsh;
31 #insert scripts\shared\version.gsh;
33 #using_animtree ( "mp_emp_power_core" );
35 #precache( "string", "KILLSTREAK_EARNED_EMP" );
36 #precache( "string", "KILLSTREAK_EMP_NOT_AVAILABLE" );
37 #precache( "string", "KILLSTREAK_EMP_INBOUND" );
38 #precache( "string", "KILLSTREAK_EMP_HACKED" );
39 #precache( "string", "KILLSTREAK_DESTROYED_EMP" );
40 #precache( "triggerstring", "KILLSTREAK_EMP_PLACE_TURRET_HINT" );
41 #precache( "triggerstring", "KILLSTREAK_EMP_INVALID_TURRET_LOCATION" );
42 #precache( "triggerstring", "KILLSTREAK_EMP_TURRET_PICKUP" );
43 #precache( "string", "mpl_killstreak_emp_activate" );
45 #precache( "fx", "killstreaks/fx_emp_exp_death" );
47 #define EMP_NAME "emp"
48 #define EMP_VEHICLE_NAME "emp_turret"
55 level.empKillstreakBundle = bundle;
57 level.ActivePlayerEMPs = [];
58 level.ActiveEMPs = [];
59 foreach( team
in level.teams )
61 level.ActiveEMPs[ team ] =
false;
70 killstreaks::register_dialog(
EMP_NAME,
"mpl_killstreak_emp_activate",
"empDialogBundle", undefined,
"friendlyEmp",
"enemyEmp",
"enemyEmpMultiple",
"friendlyEmpHacked",
"enemyEmpHacked",
"requestEmp",
"threatEmp" );
75 spinAnim = %o_turret_emp_core_spin;
76 deployAnim = %o_turret_emp_core_deploy;
88 turretVehicle.damageTaken = 0;
89 turretVehicle.health = turretVehicle.maxhealth;
92 turretVehicle.soundmod =
"drone_land";
97 Target_Set( turretVehicle, ( 0, 0, 36 ) );
102 self endon(
"disconnect" );
109 self.entNum =
self getEntityNumber();
110 level.ActivePlayerEMPs[
self.entNum ] =
false;
123 bundle = level.empKillstreakBundle;
127 bundle.ksPlaceableHint, bundle.ksPlaceableInvalidLocationHint );
135 if( event !=
"placed" )
146 assert( IsPlayer( player ) );
147 assert( !isdefined( emp.vehicle ) );
152 emp.vehicle.killstreakType = emp.killstreakType;
154 emp.vehicle.owner = player;
155 emp.vehicle SetOwner( player );
156 emp.vehicle.ownerEntNum = player.entNum;
157 emp.vehicle.parentStruct = emp;
159 player.EMPTime = GetTime();
161 player AddWeaponStat( GetWeapon(
EMP_NAME ),
"used", 1 );
166 if ( IsSentient( emp.vehicle ) ==
false )
167 emp.vehicle MakeSentient();
180 player endon(
"disconnect" );
181 player endon(
"joined_team" );
182 player endon(
"joined_spectators" );
184 emp endon(
"death" );
187 emp.vehicle UseAnimTree( #animtree );
188 emp.vehicle SetAnim( %o_turret_emp_core_deploy, 1.0 );
189 length = GetAnimLength( %o_turret_emp_core_deploy );
195 emp.vehicle playsound(
"mpl_emp_turret_activate" );
196 emp.vehicle SetAnim( %o_turret_emp_core_spin, 1.0 );
202 emp.vehicle ClearAnim( %o_turret_emp_core_deploy, 0 );
220 PlayFx(
"killstreaks/fx_emp_exp_death", fxTagOrigin );
221 playsoundatposition(
"mpl_emp_turret_deactivate", fxTagOrigin );
227 emp_vehicle playloopsound(
"mpl_emp_turret_loop_close" );
236 if ( isdefined( emp.vehicle ) )
238 fxTagOrigin = emp.vehicle GetTagorigin(
EMP_FX_TAG );
246 StopEMP( emp.team, emp.ownerEntNum, emp.originalTeam, emp.killstreakId );
249 function OnTurretDamage( eInflictor, attacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal )
253 iDamage =
self killstreaks::OnDamagePerWeapon(
EMP_NAME, attacker, iDamage, iDFlags, sMeansOfDeath, weapon,
self.maxhealth, undefined,
self.maxhealth*0.4, undefined, empDamage, undefined,
true, 1.0 );
254 self.damageTaken += iDamage;
257 if (
self.damageTaken >
self.maxHealth && !isdefined(
self.will_die ) )
259 self.will_die =
true;
266 function OnTurretDeath( inflictor, attacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime )
276 if ( isdefined(
self ) )
288 if ( isdefined( attacker ) && IsPlayer( attacker ) && ( !isdefined( emp_vehicle.owner ) || emp_vehicle.owner
util::IsEnemyPlayer( attacker ) ) )
292 attacker AddPlayerStat(
"destroy_turret", 1 );
293 attacker AddWeaponStat( weapon,
"destroy_turret", 1 );
295 LUINotifyEvent( &
"player_callout", 2, &
"KILLSTREAK_DESTROYED_EMP", attacker.entnum );
298 if ( isdefined( attacker ) && isdefined( emp_vehicle.owner ) && ( attacker != emp_vehicle.owner ) )
311 if (!isdefined( emp ) )
314 if ( isdefined( emp.already_shutdown ) )
317 emp.already_shutdown =
true;
319 if ( isdefined( emp.vehicle ) )
322 StopEMP( emp.team, emp.OwnerEntNum, emp.originalTeam, emp.killstreakId );
324 if ( isdefined( emp.otherModel ) )
326 emp.otherModel
delete();
329 if ( isdefined( emp.vehicle ) )
331 emp.vehicle
delete();
337 function StopEMP( currentTeam, currentOwnerEntNum, originalTeam, killstreakID )
345 level.ActiveEMPs[ team ] =
false;
346 level.ActivePlayerEMPs[ ownerEntNum ] =
false;
347 level notify (
"emp_updated" );
357 return ( level.ActivePlayerEMPs[
self.entNum ] );
362 return ( level.ActiveEMPs[ team ] > 0 );
367 if( level.teamBased )
369 foreach( team
in level.teams )
380 foreach( player
in enemies )
395 foreach( player
in enemies )
408 level endon (
"game_ended" );
409 self endon(
"killstreak_hacked" );
411 if( level.teamBased )
415 level.ActiveEMPs[ empEnt.OriginalTeam ] =
false;
417 level.ActiveEMPs[
self.team ] =
true;
422 level.ActivePlayerEMPs[ empEnt.originalOwnerEntNum ] =
false;
424 level.ActivePlayerEMPs[
self.entNum ] =
true;
425 level notify(
"emp_updated" );
426 level notify(
"emp_deployed" );
428 VisionSetNaked(
"flash_grenade", 1.5 );
430 VisionSetNaked(
"flash_grenade", 0 );
431 VisionSetNaked( GetDvarString(
"mapname" ), 5.0 );
433 empKillstreakWeapon = GetWeapon(
"emp" );
434 empKillstreakWeapon.isEmpKillstreak =
true;
442 level endon (
"game_ended" );
446 level waittill(
"emp_updated" );
448 foreach ( player
in level.players )
460 player setEMPJammed( enemy_emp_active );
462 emped = player isEMPJammed();
467 player notify(
"emp_jammed" );