‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_empgrenade.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
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;
8 
9 #insert scripts\shared\shared.gsh;
10 #insert scripts\shared\version.gsh;
11 
12 #define EMP_RADIUS 425
13 #define EMP_MIN_TIME 3
14 #define EMP_MAX_TIME 6
15 
16 #namespace empgrenade;
17 
18 #precache( "lui_menu", "EmpRebootIndicator" );
19 #precache( "lui_menu_data", "startTime" );
20 #precache( "lui_menu_data", "endTime" );
21 #precache( "lui_menu_data", "duration" );
22 
23 ‪REGISTER_SYSTEM( "empgrenade", &‪__init__, undefined )
24 
25 function ‪__init__()
26 {
27  ‪clientfield::register( "toplayer", "empd", ‪VERSION_SHIP, 1, "int" );
28  ‪clientfield::register( "toplayer", "empd_monitor_distance", ‪VERSION_SHIP, 1, "int" );
30 }
31 
32 //******************************************************************
33 // *
34 // *
35 //******************************************************************
37 {
38  self endon("disconnect");
39 
40  self thread ‪monitorEMPGrenade();
41  self thread ‪begin_other_grenade_tracking();
42 }
43 
44 //******************************************************************
45 // *
46 // *
47 //******************************************************************
49 {
50  self endon( "disconnect" );
51  self endon( "death" );
52  self endon ("killEMPMonitor");
53 
54  self.empEndTime = 0;
55 
56  while(1)
57  {
58  self waittill( "emp_grenaded", attacker, explosionPoint );
59 
60  if ( !isalive( self )|| self hasPerk( "specialty_immuneemp" ) )
61  continue;
62 
63  //MW3 emp resistance perk
64  //if ( self _hasPerk( "specialty_spygame" ) )
65  // continue;
66 
67  hurtVictim = true;
68  hurtAttacker = false;
69 
70  assert(isdefined(self.team));
71 
72  if (level.teamBased && isdefined(attacker) && isdefined(attacker.team) && attacker.team == self.team && attacker != self)
73  {
74  friendlyfire = [[ level.figure_out_friendly_fire]]( self );
75 
76  if ( friendlyfire == 0 ) // no FF
77  {
78  continue;
79  }
80  else if ( friendlyfire == 1 ) // FF
81  {
82  hurtattacker = false;
83  hurtvictim = true;
84  }
85  else if ( friendlyfire == 2 ) // reflect
86  {
87  hurtvictim = false;
88  hurtattacker = true;
89  }
90  else if ( friendlyfire == 3 ) // share
91  {
92  hurtattacker = true;
93  hurtvictim = true;
94  }
95  }
96 
97  if ( hurtvictim && isdefined(self))
98  {
99  self thread ‪applyEMP( attacker, explosionpoint );
100  }
101  if ( hurtattacker && isdefined(attacker))
102  {
103  attacker thread ‪applyEMP( attacker, explosionpoint );
104  }
105  }
106 }
107 
108 //******************************************************************
109 // *
110 // *
111 //******************************************************************
112 function ‪applyEMP( attacker, explosionpoint )
113 {
114  self notify( "applyEmp" );
115  self endon( "applyEmp" );
116 
117  self endon( "disconnect" );
118  self endon( "death" );
119 
120  wait .05;
121 
122  if ( !( isdefined( self ) && isalive( self ) ) )
123  {
124  return;
125  }
126 
127  if ( self == attacker )
128  {
129  currentEmpDuration = 1;
130  }
131  else
132  {
133  distanceToExplosion = Distance( self.origin, explosionPoint );
134  ratio = 1 - ( distanceToExplosion / ‪EMP_RADIUS );
135 
136  currentEmpDuration = ‪EMP_MIN_TIME + ( ( ‪EMP_MAX_TIME - ‪EMP_MIN_TIME ) * ratio );
137  }
138 
139  if ( isdefined( self.empEndTime ))
140  {
141  emp_time_left_ms = self.empEndTime - GetTime();
142 
143  if( emp_time_left_ms > currentEmpDuration * 1000 )
144  {
145  self.empDuration = emp_time_left_ms / 1000;
146  }
147  else
148  {
149  self.empDuration = currentEmpDuration;
150  }
151  }
152  else
153  {
154  self.empDuration = currentEmpDuration;
155  }
156 
157 
158  self.empGrenaded = true;
159  self shellshock( "emp_shock", 1 );
160  self ‪clientfield::set_to_player( "empd", 1 );
161 
162 // if ( self != attacker )
163 // {
164 // self PlaySoundToPlayer( "chr_emp_static", self );
165 // }
166 
167  self.empStartTime = getTime();
168  self.empEndTime = self.empStartTime + (self.empDuration * 1000);
169  self.empedBy = attacker;
170 
172 
173  empRebootMenu = self OpenLUIMenu( "EmpRebootIndicator" );
174  self SetLuiMenuData( empRebootMenu, "endTime", int( self.empEndTime ) );
175  self SetLuiMenuData( empRebootMenu, "startTime", int( self.empStartTime ) );
176 
177  self thread ‪empRumbleLoop( .75 );
178  self setEMPJammed( true );
179 
180  self thread ‪empGrenadeDeathWaiter();
181  self thread ‪empGrenadeCleanseWaiter();
182 
183 
184  if ( self.empDuration > 0 )
185  {
186  wait ( self.empDuration );
187  }
188 
189  if ( isdefined( self ) )
190  {
191  self notify( "empGrenadeTimedOut" );
192  self ‪checkToTurnOffEmp();
193  }
194 }
195 
196 //******************************************************************
197 // *
198 // *
199 //******************************************************************
201 {
202  self notify( "empGrenadeDeathWaiter" );
203  self endon( "empGrenadeDeathWaiter" );
204 
205  self endon( "empGrenadeTimedOut" );
206 
207  self waittill( "death" );
208 
209  if ( isdefined( self ) )
210  {
211  self ‪checkToTurnOffEmp();
212  }
213 }
214 
215 //******************************************************************
216 // *
217 // *
218 //******************************************************************
220 {
221  self notify( "empGrenadeCleanseWaiter" );
222  self endon( "empGrenadeCleanseWaiter" );
223 
224  self endon( "empGrenadeTimedOut" );
225 
226  self waittill( "gadget_cleanse_on" );
227 
228  if ( isdefined( self ) )
229  {
230  self ‪checkToTurnOffEmp();
231  }
232 }
233 
234 //******************************************************************
235 // *
236 // *
237 //******************************************************************
239 {
240  if ( isdefined( self ) )
241  {
242  self.empGrenaded = false;
243 
245 
246  //dont shut off emp because the team is emp'd
247  if( self ‪killstreaks::EMP_IsEMPd() )
248  {
249  return;
250  }
251 
252  self setEMPJammed( false );
253  self ‪clientfield::set_to_player( "empd", 0 );
254  }
255 }
256 
258 {
259  empRebootMenu = self GetLUIMenu( "EmpRebootIndicator" );
260  if( isdefined( empRebootMenu ) )
261  {
262  self CloseLuiMenu( empRebootMenu );
263  }
264 }
265 
266 //******************************************************************
267 // *
268 // *
269 //******************************************************************
270 function ‪empRumbleLoop( duration )
271 {
272  self endon("emp_rumble_loop");
273  self notify("emp_rumble_loop");
274 
275  goalTime = getTime() + duration * 1000;
276 
277  while ( getTime() < goalTime )
278  {
279  self PlayRumbleOnEntity( "damage_heavy" );
281  }
282 }
283 
284 //******************************************************************
285 // *
286 // *
287 //******************************************************************
288 function ‪watchEMPExplosion( owner, weapon ) // self == grenade
289 {
290  owner endon ( "disconnect" );
291  owner endon ( "team_changed" );
292 
293  self endon( "trophy_destroyed" );
294 
295  owner AddWeaponStat( weapon, "used", 1 );
296 
297  self waittill( "explode", origin, surface );
298 
299  level ‪empExplosionDamageEnts( owner, weapon, origin, ‪EMP_RADIUS, true );
300 }
301 
302 function ‪empExplosionDamageEnts( owner, weapon, origin, radius, damagePlayers )
303 {
304  ents = GetDamageableEntArray( origin, radius );
305 
306  if ( !isdefined( damagePlayers ) )
307  {
308  damagePlayers = true;
309  }
310 
311  foreach( ent in ents )
312  {
313  if ( !damagePlayers && IsPlayer(ent) )
314  {
315  continue;
316  }
317 
318  ent DoDamage( 1, origin, owner, owner, "none", "MOD_GRENADE_SPLASH", 0, weapon );
319  }
320 }
321 
322 //******************************************************************
323 // *
324 // *
325 //******************************************************************
327 {
328  self endon( "death" );
329  self endon( "disconnect" );
330 
331  self notify( "empTrackingStart" );
332  self endon( "empTrackingStart" );
333 
334  for (;;)
335  {
336  self waittill ( "grenade_fire", grenade, weapon, cookTime );
337 
338  if ( grenade ‪util::isHacked() )
339  {
340  continue;
341  }
342 
343  if ( weapon.isEmp )
344  {
345  grenade thread ‪watchEMPExplosion( self, weapon );
346  }
347  }
348 }
‪applyEMP
‪function applyEMP(attacker, explosionpoint)
Definition: _empgrenade.gsc:112
‪EMP_MIN_TIME
‪#define EMP_MIN_TIME
Definition: _empgrenade.gsc:13
‪set_to_player
‪function set_to_player(str_field_name, n_value)
Definition: clientfield_shared.gsc:58
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪on_player_spawned
‪function on_player_spawned()
Definition: _empgrenade.gsc:36
‪empExplosionDamageEnts
‪function empExplosionDamageEnts(owner, weapon, origin, radius, damagePlayers)
Definition: _empgrenade.gsc:302
‪empGrenadeCleanseWaiter
‪function empGrenadeCleanseWaiter()
Definition: _empgrenade.gsc:219
‪watchEMPExplosion
‪function watchEMPExplosion(owner, weapon)
Definition: _empgrenade.gsc:288
‪on_spawned
‪function on_spawned(func, obj)
Definition: callbacks_shared.csc:245
‪__init__
‪function __init__()
Definition: _empgrenade.gsc:25
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪ShutdownEmpRebootIndicatorMenu
‪function ShutdownEmpRebootIndicatorMenu()
Definition: _empgrenade.gsc:257
‪empRumbleLoop
‪function empRumbleLoop(duration)
Definition: _empgrenade.gsc:270
‪EMP_IsEMPd
‪function EMP_IsEMPd()
Definition: killstreaks_shared.gsc:147
‪empGrenadeDeathWaiter
‪function empGrenadeDeathWaiter()
Definition: _empgrenade.gsc:200
‪EMP_MAX_TIME
‪#define EMP_MAX_TIME
Definition: _empgrenade.gsc:14
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪begin_other_grenade_tracking
‪function begin_other_grenade_tracking()
Definition: _empgrenade.gsc:326
‪EMP_RADIUS
‪#define EMP_RADIUS
Definition: _empgrenade.gsc:12
‪checkToTurnOffEmp
‪function checkToTurnOffEmp()
Definition: _empgrenade.gsc:238
‪monitorEMPGrenade
‪function monitorEMPGrenade()
Definition: _empgrenade.gsc:48
‪isHacked
‪function isHacked()
Definition: util_shared.gsc:2493
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265