‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
exploder_shared.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\fx_shared;
4 #using scripts\shared\sound_shared;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\trigger_shared;
7 #using scripts\shared\util_shared;
8 
9 #insert scripts\shared\shared.gsh;
10 
11 #namespace exploder;
12 
13 ‪REGISTER_SYSTEM_EX( "exploder", &‪__init__, &‪__main__, undefined )
14 
15 //TODO T7 make another pass when the system becomes string id only
16 //TODO T7 delete all server side functions that are now run on the client
17 function ‪__init__()
18 {
19  level._client_exploders = [];
20  level._client_exploder_ids = [];
21 }
22 
23 function ‪__main__()
24 {
25  level.exploders = [];
26 
27  // Hide exploder models.
28  ents = GetEntArray( "script_brushmodel", "classname" );
29  smodels = GetEntArray( "script_model", "classname" );
30  for ( i = 0; i < smodels.size; i++ )
31  {
32  ents[ents.size] = smodels[i];
33  }
34 
35  for ( i = 0; i < ents.size; i++ )
36  {
37  if ( isdefined( ents[i].script_prefab_exploder ) )
38  {
39  ents[i].script_exploder = ents[i].script_prefab_exploder;
40  }
41 
42  if ( isdefined( ents[i].script_exploder ) )
43  {
44  if ( ents[i].script_exploder < 10000 )
45  {
46  level.exploders[ents[i].script_exploder] = true; // nate. I wanted a list
47  }
48 
49  if ( ( ents[i].model == "fx" ) &&( ( !isdefined( ents[i].targetname ) ) || ( ents[i].targetname != "exploderchunk" ) ) )
50  {
51  ents[i] Hide();
52  }
53  else if ( ( isdefined( ents[i].targetname ) ) &&( ents[i].targetname == "exploder" ) )
54  {
55  ents[i] Hide();
56  ents[i] NotSolid();
57 
58  if( isdefined( ents[i].script_disconnectpaths ) )
59  {
60  ents[i] ConnectPaths();
61  }
62  }
63  else if ( ( isdefined( ents[i].targetname ) ) &&( ents[i].targetname == "exploderchunk" ) )
64  {
65  ents[i] Hide();
66  ents[i] NotSolid();
67 
69  {
70  ents[i] ConnectPaths();
71  }
72  }
73  }
74  }
75 
76  script_exploders = [];
77 
78  potentialExploders = GetEntArray( "script_brushmodel", "classname" );
79  for ( i = 0; i < potentialExploders.size; i++ )
80  {
81  if( isdefined( potentialExploders[i].script_prefab_exploder ) )
82  {
83  potentialExploders[i].script_exploder = potentialExploders[i].script_prefab_exploder;
84  }
85 
86  if( isdefined( potentialExploders[i].script_exploder ) )
87  {
88  script_exploders[script_exploders.size] = potentialExploders[i];
89  }
90  }
91 
92  /#println("Server : Potential exploders from brushmodels " + potentialExploders.size);#/
93 
94  potentialExploders = GetEntArray( "script_model", "classname" );
95  for ( i = 0; i < potentialExploders.size; i++ )
96  {
97  if( isdefined( potentialExploders[i].script_prefab_exploder ) )
98  {
99  potentialExploders[i].script_exploder = potentialExploders[i].script_prefab_exploder;
100  }
101 
102  if( isdefined( potentialExploders[i].script_exploder ) )
103  {
104  script_exploders[script_exploders.size] = potentialExploders[i];
105  }
106  }
107 
108  /#println("Server : Potential exploders from script_model " + potentialExploders.size);#/
109 
110  potentialExploders = GetEntArray( "item_health", "classname" );
111  for ( i = 0; i < potentialExploders.size; i++ )
112  {
113  if( isdefined( potentialExploders[i].script_prefab_exploder ) )
114  {
115  potentialExploders[i].script_exploder = potentialExploders[i].script_prefab_exploder;
116  }
117 
118  if( isdefined( potentialExploders[i].script_exploder ) )
119  {
120  script_exploders[script_exploders.size] = potentialExploders[i];
121  }
122  }
123 
124  /#println("Server : Potential exploders from item_health " + potentialExploders.size);#/
125 
126 
127  if( !isdefined( level.createFXent ) )
128  {
129  level.createFXent = [];
130  }
131 
132  acceptableTargetnames = [];
133  acceptableTargetnames["exploderchunk visible"] = true;
134  acceptableTargetnames["exploderchunk"] = true;
135  acceptableTargetnames["exploder"] = true;
136 
137  for ( i = 0; i < script_exploders.size; i ++ )
138  {
139  ‪exploder = script_exploders[ i ];
140  ent = ‪createExploder( ‪exploder.script_fxid );
141  ent.v = [];
142  ent.v[ "origin" ] = ‪exploder.origin;
143  ent.v[ "angles" ] = ‪exploder.angles;
144  ent.v[ "delay" ] = ‪exploder.script_delay;
145  ent.v[ "firefx" ] = ‪exploder.script_firefx;
146  ent.v[ "firefxdelay" ] = ‪exploder.script_firefxdelay;
147  ent.v[ "firefxsound" ] = ‪exploder.script_firefxsound;
148  ent.v[ "firefxtimeout" ] = ‪exploder.script_firefxtimeout;
149  ent.v[ "earthquake" ] = ‪exploder.script_earthquake;
150  ent.v[ "damage" ] = ‪exploder.script_damage;
151  ent.v[ "damage_radius" ] = ‪exploder.script_radius;
152  ent.v[ "soundalias" ] = ‪exploder.script_soundalias;
153  ent.v[ "repeat" ] = ‪exploder.script_repeat;
154  ent.v[ "delay_min" ] = ‪exploder.script_delay_min;
155  ent.v[ "delay_max" ] = ‪exploder.script_delay_max;
156  ent.v[ "target" ] = ‪exploder.target;
157  ent.v[ "ender" ] = ‪exploder.script_ender;
158  ent.v[ "type" ] = "exploder";
159 // ent.v[ "worldfx" ] = true;
160 
161  if ( !isdefined( ‪exploder.script_fxid ) )
162  {
163  ent.v[ "fxid" ] = "No FX";
164  }
165  else
166  {
167  ent.v[ "fxid" ] = ‪exploder.script_fxid;
168  }
169 
170  ent.v[ "exploder" ] = ‪exploder.script_exploder;
171  assert( isdefined( ‪exploder.script_exploder ), "Exploder at origin " + ‪exploder.origin + " has no script_exploder" );
172 
173  if ( !isdefined( ent.v[ "delay" ] ) )
174  {
175  ent.v[ "delay" ] = 0;
176  }
177 
178  if ( isdefined( ‪exploder.target ) )
179  {
180  // BJoyal (1/12/12) - Added a check to see if the GetEnt returns undefined, in which case, use struct::get
181  ‪e_target = GetEnt( ent.v[ "target" ], "targetname" );
182  if( !isdefined( ‪e_target ) )
183  {
184  ‪e_target = ‪struct::get( ent.v[ "target" ], "targetname" );
185  }
186 
187  org = ‪e_target.origin;
188  ent.v[ "angles" ] = vectortoangles( org - ent.v[ "origin" ] );
189 // forward = anglestoforward( angles );
190 // up = anglestoup( angles );
191  }
192 
193  // this basically determines if its a brush / model exploder or not
194  if ( ‪exploder.classname == "script_brushmodel" || isdefined( ‪exploder.model ) )
195  {
196  ent.model = ‪exploder;
197  ent.model.disconnect_paths = ‪exploder.script_disconnectpaths;
198  }
199 
200  if ( isdefined( ‪exploder.targetname ) && isdefined( acceptableTargetnames[ ‪exploder.targetname ] ) )
201  {
202  ent.v[ "exploder_type" ] = ‪exploder.targetname;
203  }
204  else
205  {
206  ent.v[ "exploder_type" ] = "normal";
207  }
208  }
209 
210  level.createFXexploders = [];
211 
212  for (i = 0; i < level.createFXent.size;i ++ )
213  {
214  ent = level.createFXent[i];
215 
216  if(ent.v["type"] != "exploder")
217  {
218  continue;
219  }
220 
221  ent.v["exploder_id"] = ‪getExploderId( ent );
222 
223  if (!isdefined(level.createFXexploders[ent.v["exploder"]]))
224  {
225  level.createFXexploders[ent.v["exploder"]] = [];
226  }
227 
228  level.createFXexploders[ent.v["exploder"]][level.createFXexploders[ent.v["exploder"]].size] = ent;
229 
230  }
231 
232  level.radiantExploders = [];
233 
234 
236 
237  foreach ( trig in ‪trigger::get_all() )
238  {
239  if ( isdefined( trig.script_prefab_exploder ) )
240  {
241  trig.script_exploder = trig.script_prefab_exploder;
242  }
243 
244  if ( isdefined( trig.script_exploder ) )
245  {
246  level thread ‪exploder_trigger( trig, trig.script_exploder );
247  }
248 
249  if ( isdefined( trig.script_exploder_radiant ) )
250  {
251  level thread ‪exploder_trigger( trig, trig.script_exploder_radiant );
252  }
253 
254  if ( isdefined( trig.script_stop_exploder ) )
255  {
256  level ‪trigger::add_function( trig, undefined, &‪stop_exploder, trig.script_stop_exploder );
257  }
258 
259  if ( isdefined( trig.script_stop_exploder_radiant ) )
260  {
261  level ‪trigger::add_function( trig, undefined, &‪stop_exploder, trig.script_stop_exploder_radiant );
262  }
263  }
264 }
265 
266 function ‪exploder_before_load( num )
267 {
268  // gotta wait twice because the createfx_init function waits once then inits all exploders. This guarentees
269  // that if an exploder is run on the first frame, it happens after the fx are init.
270  waittillframeend;
271  waittillframeend;
272  ‪exploder( num );
273 }
274 
275 function ‪exploder( exploder_id )
276 {
277  if( IsInt( exploder_id ) )
278  {
279  ‪activate_exploder( exploder_id );
280  }
281  else//This is a radiant exploder
282  {
283  ‪activate_radiant_exploder( exploder_id );
284  }
285 }
286 
287 function ‪exploder_stop( num )
288 {
289  ‪stop_exploder( num );
290 }
291 
293 {
294  if(isdefined(self.‪script_delay))
295  {
296  wait self.script_delay;
297  }
298 
299  self playSound(level.scr_sound[self.script_sound]);
300 }
301 
303 {
304  if( isdefined( self.v[ "repeat" ] ) )
305  {
306  for( i = 0;i < self.v[ "repeat" ];i ++ )
307  {
308  playfx( level._effect[ self.v[ "fxid" ] ], self.v[ "origin" ], self.v[ "forward" ], self.v[ "up" ] );
309  //exploder_playSound();
310  self ‪exploder_delay();
311  }
312  return;
313  }
314 
315  self ‪exploder_delay();
316 
317 // playfx( level._effect[ self.v[ "fxid" ] ], self.v[ "origin" ], self.v[ "forward" ], self.v[ "up" ] );
318  if ( isdefined( self.looper ) )
319  {
320  self.looper delete();
321  }
322 
323  self.looper = spawnFx( ‪fx::get( self.v[ "fxid" ] ), self.v[ "origin" ], self.v[ "forward" ], self.v[ "up" ] );
324  triggerFx( self.looper );
326 }
327 
328 function ‪fire_effect()
329 {
330  forward = self.v[ "forward" ];
331  up = self.v[ "up" ];
332 
333 // org = undefined;
334 
335  firefxSound = self.v[ "firefxsound" ];
336  origin = self.v[ "origin" ];
337  firefx = self.v[ "firefx" ];
338  ender = self.v[ "ender" ];
339  if( !isdefined( ender ) )
340  {
341  ender = "createfx_effectStopper";
342  }
343 
344  fireFxDelay = 0.5;
345  if( isdefined( self.v[ "firefxdelay" ] ) )
346  {
347  fireFxDelay = self.v[ "firefxdelay" ];
348  }
349 
350  self ‪exploder_delay();
351 
352  if( isdefined( firefxSound ) )
353  {
354  level thread ‪sound::loop_fx_sound( firefxSound, origin, ender );
355  }
356 
357  playfx( level._effect[ firefx ], self.v[ "origin" ], forward, up );
358 }
359 
360 function ‪sound_effect()
361 {
362  self ‪effect_soundalias();
363 }
364 
366 {
367  // save off this info in case we delete the effect
368  origin = self.v[ "origin" ];
369  alias = self.v[ "soundalias" ];
370  self ‪exploder_delay();
371  ‪sound::play_in_space( alias, origin );
372 }
373 
374 function ‪trail_effect()
375 {
376  self ‪exploder_delay();
377 
378 // self.trailfx_looper = _utility::PlayLoopedFX( level._effect[self.v["trailfx"]], self.v["trailfxdelay"], self.v["origin"], 0, self.v["forward"], self.v["up"]);
379 
380  if( !isdefined( self.v["trailfxtag"] ) )
381  {
382  self.v["trailfxtag"] = "tag_origin";
383  }
384 
385  temp_ent = undefined;
386 
387 
388  if(self.v["trailfxtag"] == "tag_origin")
389  {
390  PlayFxOnTag( level._effect[self.v["trailfx"]], self.model, self.v["trailfxtag"] );
391  }
392  else
393  {
394  temp_ent = ‪Spawn( "script_model", self.model.origin );
395  temp_ent SetModel( "tag_origin" );
396  temp_ent LinkTo( self.model, self.v[ "trailfxtag" ] ); // TravisJ 2/16/2011 - temporary solution to playing FX off of tags; previously wouldn't work unless using tag_origin
397  PlayFxOnTag( level._effect[self.v["trailfx"]], temp_ent, "tag_origin" );
398  }
399 // self.trailfx_looper LinkTo( self, self.v["trailfxtag"] );
400 
401  if( isdefined( self.v["trailfxsound"] ) )
402  {
403 // self.trailfx_looper PlayLoopSound( self.v["trailfxsound"] );
404 // self PlayLoopSound( self.v["trailfxsound"] );
405  if(!isdefined(temp_ent))
406  {
407  self.model PlayLoopSound( self.v["trailfxsound"] );
408  }
409  else
410  {
411  temp_ent PlayLoopSound( self.v["trailfxsound"] );
412  }
413  }
414 
415  // TravisJ 2/16/2011 - allow deletion of temp fx ent for endon condition
416  if( isdefined( self.v[ "ender" ] ) && isdefined( temp_ent ) )
417  {
418  level thread ‪trail_effect_ender( temp_ent, self.v[ "ender" ] );
419  }
420 
421  if( !isdefined( self.v["trailfxtimeout"] ) )
422  {
423  return;
424  }
425 
426  wait( self.v["trailfxtimeout"] );
427 // self.trailfx_looper Delete();
428 
429  if(isdefined(temp_ent))
430  {
431  temp_ent Delete();
432  }
433 }
434 
435 function ‪trail_effect_ender( ent, ender )
436 {
437  ent endon( "death" );
438  self waittill( ender );
439  ent Delete();
440 }
441 
443 {
444  if( !isdefined( self.v[ "delay" ] ) )
445  {
446  self.v[ "delay" ] = 0;
447  }
448 
449  min_delay = self.v[ "delay" ];
450  max_delay = self.v[ "delay" ] + 0.001;// cant randomfloatrange on the same #
451  if( isdefined( self.v[ "delay_min" ] ) )
452  {
453  min_delay = self.v[ "delay_min" ];
454  }
455 
456  if( isdefined( self.v[ "delay_max" ] ) )
457  {
458  max_delay = self.v[ "delay_max" ];
459  }
460 
461  if( min_delay > 0 )
462  {
463  wait( randomfloatrange( min_delay, max_delay ) );
464  }
465 }
466 
468 {
469  if( !isdefined( self.v[ "soundalias" ] ) || self.v[ "soundalias" ] == "nil" )
470  {
471  return;
472  }
473 
474  ‪sound::play_in_space( self.v[ "soundalias" ], self.v[ "origin" ] );
475 }
476 
477 function ‪brush_delete()
478 {
479  num = self.v[ "exploder" ];
480 
481  if( isdefined( self.v[ "delay" ] ) )
482  {
483  wait( self.v[ "delay" ] );
484  }
485  else
486  {
487  wait( .05 );// so it disappears after the replacement appears
488  }
489 
490  if( !isdefined( self.model ) )
491  {
492  return;
493  }
494 
495 
496  assert( isdefined( self.model ) );
497 
498  if( !isdefined( self.v[ "fxid" ] ) || self.v[ "fxid" ] == "No FX" )
499  {
500  self.v[ "exploder" ] = undefined;
501  }
502 
503  waittillframeend;// so it hides stuff after it shows the new stuff
504  self.model delete();
505 }
506 
507 function ‪brush_show()
508 {
509  if( isdefined( self.v[ "delay" ] ) )
510  {
511  wait( self.v[ "delay" ] );
512  }
513 
514  assert( isdefined( self.model ) );
515 
516  self.model show();
517  self.model solid();
518 }
519 
520 function ‪brush_throw()
521 {
522  if( isdefined( self.v[ "delay" ] ) )
523  {
524  wait( self.v[ "delay" ] );
525  }
526 
527  ent = undefined;
528 
529  if( isdefined( self.v[ "target" ] ) )
530  {
531  ent = getent( self.v[ "target" ], "targetname" );
532  }
533 
534  if( !isdefined( ent ) )
535  {
536  self.model delete();
537  return;
538  }
539 
540  self.model show();
541 
542  startorg = self.v[ "origin" ];
543  startang = self.v[ "angles" ];
544  org = ent.origin;
545 
546 
547  temp_vec = ( org - self.v[ "origin" ] );
548  x = temp_vec[ 0 ];
549  y = temp_vec[ 1 ];
550  z = temp_vec[ 2 ];
551 
552  self.model rotateVelocity( ( x, y, z ), 12 );
553 
554  self.model moveGravity( ( x, y, z ), 12 );
555 
556  self.v[ "exploder" ] = undefined;
557  wait( 6 );
558  self.model delete();
559 }
560 
561 function ‪exploder_trigger( trigger, script_value )
562 {
563  trigger endon( "death" );
564 
565  level endon( "killexplodertridgers" + script_value );
566 
567  trigger ‪trigger::wait_till();
568 
569  if( isdefined( trigger.script_chance ) && RandomFloat( 1 ) > trigger.script_chance )
570  {
571  if ( isdefined( trigger.script_delay ) )
572  {
573  wait( trigger.script_delay );
574  }
575  else
576  {
577  wait 4;
578  }
579  level thread ‪exploder_trigger( trigger, script_value );
580  return;
581  }
582 
583  ‪exploder( script_value );
584  level notify( "killexplodertridgers" + script_value );
585 }
586 
588 {
589  if(!isdefined(level._exploder_ids))
590  {
591  return;
592  }
593 
594  keys = GetArrayKeys( level._exploder_ids );
595 
596  /#
597  println("Server Exploder dictionary : ");
598 
599  for( i = 0; i < keys.size; i++ )
600  {
601  println(keys[i] + " : " + level._exploder_ids[keys[i]]);
602  }
603  #/
604 }
605 
606 function ‪getExploderId( ent )
607 {
608  if(!isdefined(level._exploder_ids))
609  {
610  level._exploder_ids = [];
611  level._exploder_id = 1;
612  }
613 
614  if(!isdefined(level._exploder_ids[ent.v["exploder"]]))
615  {
616  level._exploder_ids[ent.v["exploder"]] = level._exploder_id;
617  level._exploder_id ++;
618  }
619 
620  return level._exploder_ids[ent.v["exploder"]];
621 }
622 
623 function ‪createExploder( fxid )
624 {
625  ent = ‪fx::create_effect( "exploder", fxid );
626  ent.v[ "delay" ] = 0;
627  ent.v[ "exploder" ] = 1;
628  ent.v[ "exploder_type" ] = "normal";
629 
630  return ent;
631 }
632 
633 function ‪activate_exploder( num )
634 {
635  num = int( num );
636  level notify( "exploder" + num );
637 
638  client_send = true;
639 
640  if(IsDefined(level.createFXexploders[num]))
641  {
642  for(i = 0; i < level.createFXexploders[num].size; i ++)
643  {
644  if(client_send && IsDefined(level.createFXexploders[num][i].v["exploder_server"]))
645  {
646  client_send = false;
647  }
648 
649  level.createFXexploders[num][i] ‪activate_individual_exploder( num );
650  }
651  }
652 
653  if(level.clientScripts)
654  {
655  if(client_send == true)
656  {
658  }
659  }
660 }
661 
662 //TODO T7 - update this if other functionality comes online for the new system
664 {
665  level notify( "exploder" + string );
666 
667  ActivateClientRadiantExploder( string );
668 }
669 
681 {
682  level notify("exploder" + self.v["exploder"]);
683 
684  // CODER_MOD : DSL - Contents of if statement created on client.
685  // GLocke (12/8/2008) - checking for self.v["exploder_server"] instead of self.exploder_server
686  if(!level.clientScripts || !isdefined(level._exploder_ids[int(self.v["exploder"])] ) || isdefined(self.v["exploder_server"]))
687  {
688  /#
689  println("Exploder " + self.v["exploder"] + " created on server.");
690  #/
691  if( isdefined( self.v[ "firefx" ] ) )
692  {
693  self thread ‪fire_effect();
694  }
695 
696  if( isdefined( self.v[ "fxid" ] ) && self.v[ "fxid" ] != "No FX" )
697  {
698  self thread ‪cannon_effect();
699  }
700  else if( isdefined( self.v[ "soundalias" ] ) )
701  {
702  self thread ‪sound_effect();
703  }
704 
705  if( isdefined( self.v[ "earthquake" ] ) )
706  {
707  self thread ‪exploder::earthquake();
708  }
709 
710  if( isdefined( self.v[ "rumble" ] ) )
711  {
712  self thread ‪exploder::rumble();
713  }
714  }
715 
716  // CODER_MOD : DSL - Stuff below here happens on the server.
717 
718  if( isdefined( self.v[ "trailfx" ] ) )
719  {
720  self thread ‪trail_effect();
721  }
722 
723  if( isdefined( self.v[ "damage" ] ) )
724  {
725  self thread ‪exploder_damage();
726  }
727 
728  if( self.v[ "exploder_type" ] == "exploder" )
729  {
730  self thread ‪brush_show();
731  }
732  else if( ( self.v[ "exploder_type" ] == "exploderchunk" ) || ( self.v[ "exploder_type" ] == "exploderchunk visible" ) )
733  {
734  self thread ‪brush_throw();
735  }
736  else
737  {
738  self thread ‪brush_delete();
739  }
740 }
741 
743 {
744 
745  if(!isdefined(level._exploder_ids[num]))
746  {
747  return;
748  }
749 
750  if(!isdefined(level._client_exploders[num]))
751  {
752  level._client_exploders[num] = 1;
753  }
754 
755  if(!isdefined(level._client_exploder_ids[num]))
756  {
757  level._client_exploder_ids[num] = 1;
758  }
759 
760  ActivateClientExploder(level._exploder_ids[num]);
761 }
762 
763 function ‪stop_exploder( num )
764 {
765  if(level.clientScripts)
766  {
768  }
769 
770  if(isdefined(level.createFXexploders[num]))
771  {
772  for(i = 0; i < level.createFXexploders[num].size; i ++)
773  {
774 
775  if ( !isdefined( level.createFXexploders[num][i].looper ) )
776  {
777  continue;
778  }
779 
780  level.createFXexploders[num][i].looper delete();
781  }
782  }
783 }
784 
785 function ‪delete_exploder_on_clients( exploder_id )
786 {
787  //Check if this is a radiant exploder first
788  if( IsString( exploder_id ) )
789  {
790  DeactivateClientRadiantExploder( exploder_id );
791  return;
792  }
793 
794  if(!isdefined(level._exploder_ids[exploder_id]))
795  {
796  return;
797  }
798 
799  if(!isdefined(level._client_exploders[exploder_id]))
800  {
801  return;
802  }
803 
804  level._client_exploders[exploder_id] = undefined;
805 
806  level._client_exploder_ids[exploder_id] = undefined;
807 
808  DeactivateClientExploder(level._exploder_ids[exploder_id]);
809 }
810 
811 function ‪kill_exploder( exploder_string )
812 {
813  if( IsString( exploder_string ) )
814  {
815  KillClientRadiantExploder( exploder_string );
816  return;
817  }
818 
819  assertmsg( "unhandled exploder type, only radiant exploders are handled" );
820 }
821 
823 {
824  if( isdefined( self.v[ "delay" ] ) )
825  {
826  ‪delay = self.v[ "delay" ];
827  }
828  else
829  {
830  ‪delay = 0;
831  }
832 
833  if( isdefined( self.v[ "damage_radius" ] ) )
834  {
835  radius = self.v[ "damage_radius" ];
836  }
837  else
838  {
839  radius = 128;
840  }
841 
842  ‪damage = self.v[ "damage" ];
843  origin = self.v[ "origin" ];
844 
845  wait( ‪delay );
846  // Range, max damage, min damage
847  self.model RadiusDamage( origin, radius, ‪damage, ‪damage / 3 );
848 }
849 
850 function ‪earthquake()
851 {
852  earthquake_name = self.v[ "earthquake" ];
853 
854  assert(isdefined(level.earthquake) && isdefined(level.earthquake[earthquake_name]),
855  "No earthquake '" + earthquake_name + "' defined for exploder - call add_earthquake() in your level script.");
856 
858  eq = level.earthquake[earthquake_name];
859  ‪earthquake( eq[ "magnitude" ], eq[ "duration" ], self.v[ "origin" ], eq[ "radius" ] );
860 }
861 
862 function ‪rumble()
863 {
864  self ‪exploder_delay();
865 
866  // TravisJ (2/14/2011) - replaced level.player reference with get_players loop, and added distance check
867  a_players = GetPlayers();
868 
869  if( isdefined( self.v[ "damage_radius" ] ) )
870  {
871  n_rumble_threshold_squared = self.v[ "damage_radius" ] * self.v[ "damage_radius" ];
872  }
873  else
874  {
875  /#println( "exploder #" + self.v[ "exploder" ] + " missing script_radius KVP, using default." );#/
876  n_rumble_threshold_squared = 128 * 128; // default distance of exploder_damage is 128
877  }
878 
879  for( i = 0; i < a_players.size; i++ )
880  {
881  n_player_dist_squared = distancesquared( a_players[ i ].origin, self.v[ "origin" ] );
882 
883  if( n_player_dist_squared < n_rumble_threshold_squared )
884  {
885  a_players[ i ] PlayRumbleonentity( self.v[ "rumble" ] );
886  }
887  }
888 }
889 
890 
891 function ‪stop_after_duration( ‪name, duration )
892 {
893  wait( duration );
895 }
896 
897 
898 function ‪exploder_duration( ‪name, duration )
899 {
900  if ( !‪IS_TRUE( duration ) )
901  {
902  return;
903  }
904 
905  ‪exploder( ‪name );
906 
907  level thread ‪stop_after_duration( ‪name, duration );
908 }
909 
‪script_delay
‪function script_delay()
Definition: util_shared.gsc:970
‪brush_delete
‪function brush_delete()
Definition: exploder_shared.gsc:477
‪__init__
‪function __init__()
Definition: exploder_shared.gsc:17
‪e_target
‪var e_target
Definition: traps_shared.gsc:2029
‪exploder_duration
‪function exploder_duration(name, duration)
Definition: exploder_shared.gsc:898
‪SPAWNFLAG_MODEL_DYNAMIC_PATH
‪#define SPAWNFLAG_MODEL_DYNAMIC_PATH
Definition: shared.gsh:27
‪loop_fx_sound
‪function loop_fx_sound(clientNum, alias, origin, ender)
Definition: sound_shared.csc:5
‪createExploder
‪function createExploder(fxid)
Definition: exploder_shared.gsc:623
‪play_in_space
‪function play_in_space(localClientNum, alias, origin)
Definition: sound_shared.csc:30
‪activate_individual_exploder
‪function activate_individual_exploder(num)
Definition: exploder_shared.gsc:680
‪activate_radiant_exploder
‪function activate_radiant_exploder(string)
Definition: exploder_shared.gsc:663
‪trail_effect
‪function trail_effect()
Definition: exploder_shared.gsc:374
‪rumble
‪function rumble()
Definition: exploder_shared.gsc:862
‪cannon_effect
‪function cannon_effect()
Definition: exploder_shared.gsc:302
‪activate_exploder_on_clients
‪function activate_exploder_on_clients(num)
Definition: exploder_shared.gsc:742
‪stop_exploder
‪function stop_exploder(num)
Definition: exploder_shared.gsc:763
‪stop_after_duration
‪function stop_after_duration(name, duration)
Definition: exploder_shared.gsc:891
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪exploder_playSound
‪function exploder_playSound()
Definition: exploder_shared.gsc:467
‪delay
‪function delay(time_or_notify, str_endon, func, arg1, arg2, arg3, arg4, arg5, arg6)
Definition: util_shared.csc:784
‪reportExploderIds
‪function reportExploderIds()
Definition: exploder_shared.gsc:587
‪exploder_delay
‪function exploder_delay()
Definition: exploder_shared.gsc:442
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪brush_throw
‪function brush_throw()
Definition: exploder_shared.gsc:520
‪sound_effect
‪function sound_effect()
Definition: exploder_shared.gsc:360
‪exploder
‪function exploder(exploder_id)
Definition: exploder_shared.gsc:275
‪activate_exploder
‪function activate_exploder(num)
Definition: exploder_shared.gsc:633
‪REGISTER_SYSTEM_EX
‪#define REGISTER_SYSTEM_EX(__sys, __func_init_preload, __func_init_postload, __reqs)
Definition: shared.gsh:209
‪create_effect
‪function create_effect(type, fxid)
Definition: fx_shared.csc:104
‪SPAWNFLAG
‪#define SPAWNFLAG(__e, __f)
Definition: shared.gsh:95
‪wait_till
‪function wait_till(str_flag)
Definition: flag_shared.csc:189
‪kill_exploder
‪function kill_exploder(exploder_string)
Definition: exploder_shared.gsc:811
‪exploder_before_load
‪function exploder_before_load(num)
Definition: exploder_shared.gsc:266
‪exploder_sound
‪function exploder_sound()
Definition: exploder_shared.gsc:292
‪earthquake
‪function earthquake()
Definition: exploder_shared.gsc:850
‪Spawn
‪function Spawn(parent, onDeathCallback)
Definition: _flak_drone.gsc:427
‪get_all
‪function get_all(type1, type2, type3, type4, type5, type6, type7, type8, type9)
Definition: trigger_shared.gsc:802
‪add_function
‪function add_function(trigger, str_remove_on, func, param_1, param_2, param_3, param_4, param_5, param_6)
Definition: trigger_shared.gsc:1281
‪brush_show
‪function brush_show()
Definition: exploder_shared.gsc:507
‪getExploderId
‪function getExploderId(ent)
Definition: exploder_shared.gsc:606
‪exploder_stop
‪function exploder_stop(num)
Definition: exploder_shared.gsc:287
‪effect_soundalias
‪function effect_soundalias()
Definition: exploder_shared.gsc:365
‪exploder_damage
‪function exploder_damage()
Definition: exploder_shared.gsc:822
‪__main__
‪function __main__()
Definition: exploder_shared.gsc:23
‪name
‪class GroundFx name
‪delete_exploder_on_clients
‪function delete_exploder_on_clients(exploder_id)
Definition: exploder_shared.gsc:785
‪fire_effect
‪function fire_effect()
Definition: exploder_shared.gsc:328
‪exploder_trigger
‪function exploder_trigger(trigger, script_value)
Definition: exploder_shared.gsc:561
‪trail_effect_ender
‪function trail_effect_ender(ent, ender)
Definition: exploder_shared.gsc:435