1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\killstreaks_shared;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\util_shared;
7 #using scripts\shared\clientfield_shared;
9 #insert scripts\shared\shared.gsh;
10 #insert scripts\shared\version.gsh;
12 #define EMP_RADIUS 425
13 #define EMP_MIN_TIME 3
14 #define EMP_MAX_TIME 6
16 #namespace empgrenade;
18 #precache( "lui_menu", "EmpRebootIndicator" );
19 #precache( "lui_menu_data", "startTime" );
20 #precache( "lui_menu_data", "endTime" );
21 #precache( "lui_menu_data", "duration" );
38 self endon(
"disconnect");
50 self endon(
"disconnect" );
51 self endon(
"death" );
52 self endon (
"killEMPMonitor");
58 self waittill(
"emp_grenaded", attacker, explosionPoint );
60 if ( !isalive(
self )||
self hasPerk(
"specialty_immuneemp" ) )
70 assert(isdefined(
self.team));
72 if (level.teamBased && isdefined(attacker) && isdefined(attacker.team) && attacker.team ==
self.team && attacker !=
self)
74 friendlyfire = [[ level.figure_out_friendly_fire]]( self );
76 if ( friendlyfire == 0 )
80 else if ( friendlyfire == 1 )
85 else if ( friendlyfire == 2 )
90 else if ( friendlyfire == 3 )
97 if ( hurtvictim && isdefined(
self))
99 self thread
applyEMP( attacker, explosionpoint );
101 if ( hurtattacker && isdefined(attacker))
103 attacker thread
applyEMP( attacker, explosionpoint );
114 self notify(
"applyEmp" );
115 self endon(
"applyEmp" );
117 self endon(
"disconnect" );
118 self endon(
"death" );
122 if ( !( isdefined(
self ) && isalive(
self ) ) )
127 if (
self == attacker )
129 currentEmpDuration = 1;
133 distanceToExplosion = Distance(
self.origin, explosionPoint );
139 if ( isdefined(
self.empEndTime ))
141 emp_time_left_ms =
self.empEndTime - GetTime();
143 if( emp_time_left_ms > currentEmpDuration * 1000 )
145 self.empDuration = emp_time_left_ms / 1000;
149 self.empDuration = currentEmpDuration;
154 self.empDuration = currentEmpDuration;
158 self.empGrenaded =
true;
159 self shellshock(
"emp_shock", 1 );
167 self.empStartTime = getTime();
168 self.empEndTime =
self.empStartTime + (
self.empDuration * 1000);
169 self.empedBy = attacker;
173 empRebootMenu =
self OpenLUIMenu(
"EmpRebootIndicator" );
174 self SetLuiMenuData( empRebootMenu,
"endTime",
int(
self.empEndTime ) );
175 self SetLuiMenuData( empRebootMenu,
"startTime",
int(
self.empStartTime ) );
178 self setEMPJammed(
true );
184 if (
self.empDuration > 0 )
186 wait (
self.empDuration );
189 if ( isdefined(
self ) )
191 self notify(
"empGrenadeTimedOut" );
202 self notify(
"empGrenadeDeathWaiter" );
203 self endon(
"empGrenadeDeathWaiter" );
205 self endon(
"empGrenadeTimedOut" );
207 self waittill(
"death" );
209 if ( isdefined(
self ) )
221 self notify(
"empGrenadeCleanseWaiter" );
222 self endon(
"empGrenadeCleanseWaiter" );
224 self endon(
"empGrenadeTimedOut" );
226 self waittill(
"gadget_cleanse_on" );
228 if ( isdefined(
self ) )
240 if ( isdefined(
self ) )
242 self.empGrenaded =
false;
252 self setEMPJammed(
false );
259 empRebootMenu =
self GetLUIMenu(
"EmpRebootIndicator" );
260 if( isdefined( empRebootMenu ) )
262 self CloseLuiMenu( empRebootMenu );
272 self endon(
"emp_rumble_loop");
273 self notify(
"emp_rumble_loop");
275 goalTime = getTime() + duration * 1000;
277 while ( getTime() < goalTime )
279 self PlayRumbleOnEntity(
"damage_heavy" );
290 owner endon (
"disconnect" );
291 owner endon (
"team_changed" );
293 self endon(
"trophy_destroyed" );
295 owner AddWeaponStat( weapon,
"used", 1 );
297 self waittill(
"explode", origin, surface );
304 ents = GetDamageableEntArray( origin, radius );
306 if ( !isdefined( damagePlayers ) )
308 damagePlayers =
true;
311 foreach( ent
in ents )
313 if ( !damagePlayers && IsPlayer(ent) )
318 ent DoDamage( 1, origin, owner, owner,
"none",
"MOD_GRENADE_SPLASH", 0, weapon );
328 self endon(
"death" );
329 self endon(
"disconnect" );
331 self notify(
"empTrackingStart" );
332 self endon(
"empTrackingStart" );
336 self waittill (
"grenade_fire", grenade, weapon, cookTime );