‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_tabun.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 #using scripts\shared\sound_shared;
3 #using scripts\shared\util_shared;
4 
5 #insert scripts\shared\shared.gsh;
6 
7 #namespace tabun;
8 
9 function ‪init_shared()
10 {
11  level.tabunInitialGasShockDuration = GetDvarInt( "scr_tabunInitialGasShockDuration", "7");
12  level.tabunWalkInGasShockDuration = GetDvarInt( "scr_tabunWalkInGasShockDuration", "4");
13  level.tabunGasShockRadius = GetDvarInt( "scr_tabun_shock_radius", "185" );
14  level.tabunGasShockHeight = GetDvarInt( "scr_tabun_shock_height", "20" );
15  level.tabunGasPoisonRadius = GetDvarInt( "scr_tabun_effect_radius", "185" );
16  level.tabunGasPoisonHeight = GetDvarInt( "scr_tabun_shock_height", "20" );
17  level.tabunGasDuration = GetDvarInt( "scr_tabunGasDuration", "8" ); // in seconds, after initial shock if you enter, you will get cough, blurred vision if you stay in this length
18  level.poisonDuration = GetDvarInt( "scr_poisonDuration", "8" ); // in seconds you will get poison full screen effect for
19  level.poisonDamage = GetDvarInt( "scr_poisonDamage", "13" ); // how much damage will the poison do each tick
20  level.poisonDamageHardcore = GetDvarInt( "scr_poisonDamageHardcore", "5" ); // how much damage will the poison do each tick
21 
22 
23  level.fx_tabun_0 = "tabun_tiny_mp";
24  level.fx_tabun_1 = "tabun_small_mp";
25  level.fx_tabun_2 = "tabun_medium_mp";
26  level.fx_tabun_3 = "tabun_large_mp";
27  level.fx_tabun_single = "tabun_center_mp";
28 
29  level.fx_tabun_radius0 = GetDvarInt( "scr_fx_tabun_radius0", 55 );
30  level.fx_tabun_radius1 = GetDvarInt( "scr_fx_tabun_radius1", 55 );
31  level.fx_tabun_radius2 = GetDvarInt( "scr_fx_tabun_radius2", 50 );
32  level.fx_tabun_radius3 = GetDvarInt( "scr_fx_tabun_radius3", 25 );
33 
34  level.sound_tabun_start = "wpn_gas_hiss_start";
35  level.sound_tabun_loop = "wpn_gas_hiss_lp";
36  level.sound_tabun_stop = "wpn_gas_hiss_end";
37 
38  level.sound_shock_tabun_start = "";
39  level.sound_shock_tabun_loop = "";
40  level.sound_shock_tabun_stop = "";
41 
42 
43  /#
44  level thread ‪checkDvarUpdates();
45  #/
46 }
47 
48 
50 {
51  while(true)
52  {
53  level.tabunGasPoisonRadius = GetDvarInt( "scr_tabun_effect_radius", level.tabunGasPoisonRadius );
54  level.tabunGasPoisonHeight = GetDvarInt( "scr_tabun_shock_height", level.tabunGasPoisonHeight );
55  level.tabunGasShockRadius = GetDvarInt( "scr_tabun_shock_radius", level.tabunGasShockRadius );
56  level.tabunGasShockHeight = GetDvarInt( "scr_tabun_shock_height", level.tabunGasShockHeight );
57  level.tabunInitialGasShockDuration = GetDvarInt( "scr_tabunInitialGasShockDuration", level.tabunInitialGasShockDuration);
58  level.tabunWalkInGasShockDuration = GetDvarInt( "scr_tabunWalkInGasShockDuration", level.tabunWalkInGasShockDuration);
59  level.tabunGasDuration = GetDvarInt( "scr_tabunGasDuration", level.tabunGasDuration);
60  level.poisonDuration = GetDvarInt( "scr_poisonDuration", level.poisonDuration );
61  level.poisonDamage = GetDvarInt( "scr_poisonDamage", level.poisonDamage );
62  level.poisonDamageHardcore = GetDvarInt( "scr_poisonDamageHardcore", level.poisonDamageHardcore );
63 
64  level.fx_tabun_radius0 = GetDvarInt( "scr_fx_tabun_radius0", level.fx_tabun_radius0 );
65  level.fx_tabun_radius1 = GetDvarInt( "scr_fx_tabun_radius1", level.fx_tabun_radius1 );
66  level.fx_tabun_radius2 = GetDvarInt( "scr_fx_tabun_radius2", level.fx_tabun_radius2 );
67  level.fx_tabun_radius3 = GetDvarInt( "scr_fx_tabun_radius3", level.fx_tabun_radius3 );
68  wait(1.0);
69  }
70 }
71 
73 {
74  self endon( "trophy_destroyed" );
75 
76  self waittill( "explode", position, surface );
77 
78  // AE 10-27-09: if it's in water then no need to continue
79  if( !isdefined(level.water_duds) || level.water_duds == true)
80  {
81  if( isdefined(surface) && surface == "water" )
82  {
83  return;
84  }
85  }
86 
87  //level thread sound::play_in_space( "wpn_tabun_explode", position );
88 
89  if ( GetDvarInt ( "scr_enable_new_tabun", 1 ) )
90  ‪generateLocations( position, owner );
91  else
92  ‪singleLocation( position, owner );
93 }
94 
95 
96 function ‪damageEffectArea ( owner, position, radius, height, killCamEnt )
97 {
98  // AE 10-27-09: rewritting this so it makes more sense and is more effecient
99  // this fixed a bug where if you stood on the tabun it would kill you instantly
100 
101  // spawn trigger radius for the effect areas
102  shockEffectArea = ‪spawn( "trigger_radius", position, 0, radius, height );
103  gasEffectArea = ‪spawn( "trigger_radius", position, 0, radius, height );
104 
105  /#
106  if( GetDvarint( "scr_draw_triggers" ) )
107  level thread ‪util::drawcylinder( position, radius, height, undefined, "tabun_draw_cylinder_stop" );
108  #/
109 
110  // dog stuff
111  if ( isdefined( level.dogsOnFlashDogs ) )
112  {
113  owner thread [[level.dogsOnFlashDogs]]( shockEffectArea );
114  owner thread [[level.dogsOnFlashDogs]]( gasEffectArea );
115  }
116 
117  // loop variables
118  loopWaitTime = 0.5;
119  durationOfTabun = level.tabunGasDuration;
120 
121  // loop for the duration of the effect
122  while (durationOfTabun > 0)
123  {
124  players = GetPlayers();
125  for (i = 0; i < players.size; i++)
126  {
127  // if this is not hardcore then don't affect teammates
128  if ( level.friendlyfire == 0 )
129  {
130  if ( players[i] != owner )
131  {
132  if (!isdefined (owner) || !isdefined(owner.team) )
133  continue;
134  if( level.teambased && players[i].team == owner.team )
135  continue;
136  }
137  }
138 
139  // see if we're not in the poison area
140  if ((!isdefined (players[i].inPoisonArea)) || (players[i].inPoisonArea == false) )
141  {
142  // since we're not in the pioson area, now see if we're in the poison area
143  if (players[i] istouching(gasEffectArea) && players[i].sessionstate == "playing")
144  {
145  // check for the gas mask perk
146  if ( ! ( players[i] hasPerk ("specialty_proximityprotection") ) )
147  {
148  ‪trace = bullettrace( position, players[i].origin + (0,0,12), false, players[i] );
149 
150  if ( ‪trace["fraction"] == 1 )
151  {
152  players[i].lastPoisonedBy = owner;
153  players[i] thread ‪damageInPoisonArea( shockEffectArea, killcament, ‪trace, position );
154  }
155  }
156  // battle chatter for gas
157  // players[i] thread battlechatter::incoming_special_grenade_tracking( "gas" );
158  }
159  }
160  }
161 
162  wait (loopWaitTime);
163  durationOfTabun -= loopWaitTime;
164  }
165 
166  // if the durations are different, wait for the difference
167  if ( level.tabunGasDuration < level.poisonDuration )
168  wait ( level.poisonDuration - level.tabunGasDuration );
169 
170  // clean up
171  shockEffectArea delete();
172  gasEffectArea delete();
173 
174  /#
175  if( GetDvarint( "scr_draw_triggers" ) )
176  level notify( "tabun_draw_cylinder_stop" );
177  #/
178 }
179 
180 function ‪damageInPoisonArea( gasEffectArea, killcament, ‪trace, position ) // self == player in poison area
181 {
182  self endon( "disconnect" );
183  self endon( "death" );
184 
185  self thread ‪watch_death();
186  self.inPoisonArea = true;
187 
188  self startPoisoning();
189 
190  tabunShockSound = ‪spawn ("script_origin",(0,0,1));
191  tabunShockSound thread ‪deleteEntOnOwnerDeath( self );
192  tabunShockSound.origin = position;
193  tabunShockSound playsound( level.sound_shock_tabun_start );
194 
195  tabunShockSound playLoopSound ( level.sound_shock_tabun_loop );
196 
197  ‪timer = 0;
198  while ( (‪trace["fraction"] == 1 ) && (isdefined (gasEffectArea) ) && self istouching(gasEffectArea) && self.sessionstate == "playing"&& isdefined (self.lastPoisonedBy) )
199  {
200  // NOTE: DoDamage( <health>, <source position>, <attacker>, <inflictor>, <hitloc>, <mod>, <dflags>, <weapon> )
201  ‪damage = level.poisonDamage;
202  if( level.hardcoreMode )
203  {
204  ‪damage = level.poisonDamageHardcore;
205  }
206  self DoDamage( ‪damage, gasEffectArea.origin, self.lastPoisonedBy, killCamEnt, "none", "MOD_GAS", 0, GetWeapon( "tabun_gas" ) );
207 
208  if ( self ‪util::mayApplyScreenEffect() )
209  {
210  // try to do a stumble effect by having one shellshock slow and the other speed up slightly
211  switch( ‪timer )
212  {
213  case 0:
214  self ShellShock( "tabun_gas_mp", 1.0 );
215  break;
216  case 1:
217  self ShellShock( "tabun_gas_nokick_mp", 1.0 );
218  break;
219  default:
220  break;
221  }
222  ‪timer++;
223  if( ‪timer >= 2 )
224  {
225  ‪timer = 0;
226  }
227 
228  self ‪hide_hud();
229  }
230  wait(1.0);
231  ‪trace = bullettrace( position, self.origin + (0,0,12), false, self );
232  }
233  tabunShockSound StopLoopSound( 0.5 );
234  wait( 0.5 );
235  thread ‪sound::play_in_space( level.sound_shock_tabun_stop, position );
236  // have a little delay before we give back
237  wait( 0.5 );
238  tabunShockSound notify( "delete" );
239  tabunShockSound delete();
240  self ‪show_hud();
241  self stopPoisoning();
242 
243  self.inPoisonArea = false;
244 }
245 
246 function ‪deleteEntOnOwnerDeath( owner )
247 {
248  self endon( "delete" );
249  owner waittill( "death" );
250  self delete();
251 }
252 
253 function ‪watch_death() // self == player
254 {
255  // fail safe stuff for if the player dies
256  self waittill("death");
257  self ‪show_hud();
258 }
259 
260 function ‪hide_hud() // self == player
261 {
262  self ‪util::show_hud( 0 );
263 }
264 function ‪show_hud() // self == player
265 {
266  self ‪util::show_hud( 1 );
267 }
268 
269 function ‪generateLocations( position, owner )
270 {
271  oneFoot = ( 0, 0, 12 );
272  startPos = position + oneFoot;
273 
274 
275  /#
276  level.tabun_debug = GetDvarInt( "scr_tabun_debug", 0 );
277  if ( level.tabun_debug )
278  {
279  black = ( 0.2, 0.2, 0.2 );
280  debugstar(startPos, 2 * 1000, black);
281  }
282  #/
283 
284  ‪spawnAllLocs( owner, startPos );
285 }
286 
287 function ‪singleLocation( position, owner )
288 {
289  SpawnTimedFX( level.fx_tabun_single, position );
290  killCamEnt = ‪spawn( "script_model", position + (0,0,60) );
291  killCamEnt ‪util::deleteAfterTime( 15.0 );
292  killCamEnt.startTime = gettime();
293 
294  ‪damageEffectArea ( owner, position, level.tabunGasPoisonRadius, level.tabunGasPoisonHeight, killcament );
295 }
296 
297 
298 
299 function ‪hitPos( start, ‪end, color )
300 {
301  ‪trace = bullettrace( start, ‪end, false, undefined );
302 
303  /#
304  level.tabun_debug = GetDvarInt( "scr_tabun_debug", 0 );
305  if ( level.tabun_debug )
306  {
307  debugstar(‪trace["position"], 2 * 1000, color);
308  }
309 
310  thread ‪tabun_debug_line( start, ‪trace["position"], color, true, 80 );
311  #/
312 
313  return ‪trace["position"];
314 }
315 
316 function ‪spawnAllLocs( owner, startPos )
317 {
318  defaultDistance = GetDvarInt( "scr_defaultDistanceTabun", 220 );
319  cos45 = .707;
320  negCos45 = -.707;
321 
322  red = ( 0.9, 0.2, 0.2 );
323  blue = ( 0.2, 0.2, 0.9 );
324  green = ( 0.2, 0.9, 0.2 );
325  white = ( 0.9, 0.9, 0.9 );
326 
327  north = startPos + ( defaultDistance, 0, 0 );
328  south = startPos - ( defaultDistance, 0, 0 );
329  east = startPos + ( 0, defaultDistance, 0 );
330  west = startPos - ( 0, defaultDistance, 0 );
331  nw = startPos + ( cos45 * defaultDistance, negCos45 * defaultDistance, 0 );
332  ne = startPos + ( cos45 * defaultDistance, cos45 * defaultDistance, 0 );
333  sw = startPos + ( negCos45 * defaultDistance, negCos45 * defaultDistance, 0 );
334  se = startPos + ( negCos45 * defaultDistance, cos45 * defaultDistance, 0 );
335 
336  locations = [];
337  locations["color"] = [];
338  locations["loc"] = [];
339  locations["tracePos"] = [];
340  locations["distSqrd"] = [];
341  locations["fxtoplay"] = [];
342  locations["radius"] = [];
343 
344 
345  locations["color"][0] = red;
346  locations["color"][1] = red;
347  locations["color"][2] = blue;
348  locations["color"][3] = blue;
349  locations["color"][4] = green;
350  locations["color"][5] = green;
351  locations["color"][6] = white;
352  locations["color"][7] = white;
353 
354  locations["point"][0] = north;
355  locations["point"][1] = ne;
356  locations["point"][2] = east;
357  locations["point"][3] = se;
358  locations["point"][4] = south;
359  locations["point"][5] = sw;
360  locations["point"][6] = west;
361  locations["point"][7] = nw;
362 
363  for ( count = 0; count < 8; count++ )
364  {
365  ‪trace = ‪hitPos( startPos, locations["point"][count], locations["color"][count] );
366  locations["tracePos"][count] = ‪trace;
367  locations["loc"][count] = startPos/2 + ‪trace/2;
368  locations["loc"][count] = locations["loc"][count] - ( 0, 0, 12 );
369  locations["distSqrd"][count] = distancesquared( startPos, ‪trace );
370  }
371 
372  centroid = ‪getCenterOfLocations( locations );
373  killCamEnt = ‪spawn( "script_model", centroid + (0,0,60) );
374  killCamEnt ‪util::deleteAfterTime( 15.0 );
375  killCamEnt.startTime = gettime();
376 
377  center = ‪getcenter( locations );
378 
379  for ( i = 0; i < 8; i++ )
380  {
381  fxToPlay = ‪setUpTabunFx( owner, locations, i);
382  switch ( fxToPlay )
383  {
384  case 0:
385  {
386  locations["fxtoplay"][i] = level.fx_tabun_0;
387  locations["radius"][i] = level.fx_tabun_radius0;
388  }
389  break;
390  case 1:
391  {
392  locations["fxtoplay"][i] = level.fx_tabun_1;
393  locations["radius"][i] = level.fx_tabun_radius1;
394  }
395  break;
396  case 2:
397  {
398  locations["fxtoplay"][i] = level.fx_tabun_2;
399  locations["radius"][i] = level.fx_tabun_radius2;
400  }
401  break;
402  case 3:
403  {
404  locations["fxtoplay"][i] = level.fx_tabun_3;
405  locations["radius"][i] = level.fx_tabun_radius3;
406  }
407  break;
408  default:
409  {
410  locations["fxtoplay"][i] = undefined;
411  locations["radius"][i] = 0;
412  }
413  }
414  }
415 
416  singleEffect = true;
417  freepassUsed = false;
418  // check can we just play one large effect
419  for ( i = 0; i < 8; i++ )
420  {
421  if ( locations["radius"][i] != level.fx_tabun_radius0 )
422  {
423  if (freePassUsed == false && locations["radius"][i] == level.fx_tabun_radius1 )
424  {
425  freePassUsed = true;
426  }
427  else
428  {
429  singleEffect = false;
430  }
431  }
432  }
433  oneFoot = ( 0, 0, 12 );
434  startPos = startPos - oneFoot;
435 
436  thread ‪playTabunSound( startPos );
437  if ( singleEffect == true )
438  {
439  ‪singleLocation( startPos, owner );
440  }
441  else
442  {
443  SpawnTimedFX( level.fx_tabun_3, startPos );
444  for ( count = 0; count < 8; count++ )
445  {
446  if ( isdefined ( locations["fxtoplay"][count] ) )
447  {
448  SpawnTimedFX( locations["fxtoplay"][count], locations["loc"][count] );
449  thread ‪damageEffectArea ( owner, locations["loc"][count], locations["radius"][count], locations["radius"][count], killCamEnt );
450  }
451  }
452  }
453 }
454 
455 function ‪playTabunSound( position )
456 {
457  tabunSound = ‪spawn ("script_origin",(0,0,1));
458  tabunSound.origin = position;
459 
460  tabunSound playsound( level.sound_tabun_start );
461  tabunSound playLoopSound ( level.sound_tabun_loop );
462  wait( level.tabunGasDuration );
463  thread ‪sound::play_in_space( level.sound_tabun_stop, position );
464  tabunSound StopLoopSound( .5);
465  wait(.5);
466  tabunSound delete();
467 }
468 
469 function ‪setUpTabunFx( owner, locations, count )
470 {
471  fxToPlay = undefined;
472 
473  previous = count - 1;
474  if ( previous < 0 )
475  previous = previous + locations["loc"].size;
476  next = count + 1;
477  if ( next >= locations["loc"].size )
478  next = next - locations["loc"].size;
479 
480 
481  effect0Dist = level.fx_tabun_radius0 * level.fx_tabun_radius0;
482  effect1Dist = level.fx_tabun_radius1 * level.fx_tabun_radius1;
483  effect2Dist = level.fx_tabun_radius2 * level.fx_tabun_radius2;
484  effect3Dist = level.fx_tabun_radius3 * level.fx_tabun_radius3;
485  effect4Dist = level.fx_tabun_radius3;
486 
487  fxToPlay = -1;
488  if ( locations["distSqrd"][count] > effect0Dist && locations["distSqrd"][previous] > effect1Dist && locations["distSqrd"][next] > effect1Dist )
489  {
490  fxToPlay = 0;
491  }
492  else if ( locations["distSqrd"][count] > effect1Dist && locations["distSqrd"][previous] > effect2Dist && locations["distSqrd"][next] > effect2Dist )
493  {
494  fxToPlay = 1;
495  }
496  else if ( locations["distSqrd"][count] > effect2Dist && locations["distSqrd"][previous] > effect3Dist && locations["distSqrd"][next] > effect3Dist )
497  {
498  fxToPlay = 2;
499  }
500  else if ( locations["distSqrd"][count] > effect3Dist && locations["distSqrd"][previous] > effect4Dist && locations["distSqrd"][next] > effect4Dist )
501  {
502  fxToPlay = 3;
503  }
504 
505  return fxToPlay;
506 }
507 
508 function ‪getCenterOfLocations( locations )
509 {
510  centroid = ( 0, 0, 0 );
511 
512  for ( i = 0; i < locations["loc"].size; i++ )
513  {
514  centroid = centroid + ( locations["loc"][i] / locations["loc"].size );
515  }
516 
517 
518  /#
519  level.tabun_debug = GetDvarInt( "scr_tabun_debug", 0 );
520  if ( level.tabun_debug )
521  {
522  purple = ( 0.9, 0.2, 0.9 );
523  debugstar(centroid, 2 * 1000, purple);
524  }
525  #/
526 
527  return centroid;
528 }
529 
530 function ‪getcenter( locations )
531 {
532  center = ( 0, 0, 0 );
533  curX = locations["tracePos"][0][0];
534  curY = locations["tracePos"][0][1];
535  minX = curX;
536  maxX = curX;
537  minY = curY;
538  maxY = curY;
539  for ( i = 1; i < locations["tracePos"].size; i++ )
540  {
541  curX = locations["tracePos"][i][0];
542  curY = locations["tracePos"][i][1];
543 
544  if ( curX > maxX )
545  maxX = curX;
546  else if ( curX < minX )
547  minX = curX;
548 
549  if ( curY > maxY )
550  maxY = curY;
551  else if ( curY < minY )
552  minY = curY;
553  }
554 
555  avgX = ( maxX + minX ) / 2;
556  avgY = ( maxY + minY ) / 2;
557 
558 
559  center = ( avgX, avgY, locations["tracePos"][0][2] );
560 
561  /#
562  level.tabun_debug = GetDvarInt( "scr_tabun_debug", 0 );
563  if ( level.tabun_debug )
564  {
565  cyan = ( 0.2, 0.9, 0.9 );
566  debugstar(center, 2 * 1000, cyan);
567  }
568  #/
569 
570  //fxToPlay = level.fx_tabun_1;
571  //SpawnTimedFX( fxToPlay, center );
572 
573  return center;
574 }
575 
576 /#
577 function ‪tabun_debug_line( from, to, color, depthTest, time )
578 {
579  debug_rcbomb = GetDvarInt( "scr_tabun_debug", 0 );
580  if ( debug_rcbomb == "1" )
581  {
582  if ( !isdefined(time) )
583  {
584  time = 100;
585  }
586  if ( !isdefined(depthTest) )
587  {
588  depthTest = true;
589  }
590  Line( from, to, color, 1, depthTest, time);
591  }
592 }
593 #/
‪watchTabunGrenadeDetonation
‪function watchTabunGrenadeDetonation(owner)
Definition: _tabun.gsc:72
‪getCenterOfLocations
‪function getCenterOfLocations(locations)
Definition: _tabun.gsc:508
‪watch_death
‪function watch_death()
Definition: _tabun.gsc:253
‪timer
‪function timer(n_time, str_endon, x, y, height)
Definition: lui_shared.gsc:163
‪hide_hud
‪function hide_hud()
Definition: _tabun.gsc:260
‪show_hud
‪function show_hud()
Definition: _tabun.gsc:264
‪play_in_space
‪function play_in_space(localClientNum, alias, origin)
Definition: sound_shared.csc:30
‪deleteAfterTime
‪function deleteAfterTime(time)
Definition: util_shared.gsc:2710
‪damageEffectArea
‪function damageEffectArea(owner, position, radius, height, killCamEnt)
Definition: _tabun.gsc:96
‪trace
‪function trace(from, to, target)
Definition: grapple.gsc:369
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪getcenter
‪function getcenter(locations)
Definition: _tabun.gsc:530
‪hitPos
‪function hitPos(start, end, color)
Definition: _tabun.gsc:299
‪checkDvarUpdates
‪function checkDvarUpdates()
Definition: _tabun.gsc:49
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪tabun_debug_line
‪function tabun_debug_line(from, to, color, depthTest, time)
Definition: _tabun.gsc:577
‪spawnAllLocs
‪function spawnAllLocs(owner, startPos)
Definition: _tabun.gsc:316
‪end
‪function end(final)
Definition: _killcam.gsc:511
‪generateLocations
‪function generateLocations(position, owner)
Definition: _tabun.gsc:269
‪damageInPoisonArea
‪function damageInPoisonArea(gasEffectArea, killcament, trace, position)
Definition: _tabun.gsc:180
‪setUpTabunFx
‪function setUpTabunFx(owner, locations, count)
Definition: _tabun.gsc:469
‪singleLocation
‪function singleLocation(position, owner)
Definition: _tabun.gsc:287
‪playTabunSound
‪function playTabunSound(position)
Definition: _tabun.gsc:455
‪drawcylinder
‪function drawcylinder(pos, rad, height)
Definition: laststand_shared.gsc:170
‪deleteEntOnOwnerDeath
‪function deleteEntOnOwnerDeath(owner)
Definition: _tabun.gsc:246
‪mayApplyScreenEffect
‪function mayApplyScreenEffect()
Definition: util_shared.gsc:2613
‪init_shared
‪function init_shared()
Definition: _tabun.gsc:9