‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_zm_weap_thundergun.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\array_shared;
4 #using scripts\shared\callbacks_shared;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\util_shared;
7 
8 #insert scripts\shared\shared.gsh;
9 
10 #using scripts\shared\ai\zombie_death;
11 #using scripts\shared\ai\zombie_shared;
12 #using scripts\shared\ai\zombie_utility;
13 
14 #using scripts\zm\_util;
15 #using scripts\zm\_zm_audio;
16 #using scripts\zm\_zm_score;
17 #using scripts\zm\_zm_utility;
18 #using scripts\zm\_zm_weapons;
19 
20 #insert scripts\zm\_zm_weap_thundergun.gsh;
21 
22 #precache( "fx", STR_KNOCKBACK_GROUND );
23 #precache( "fx", STR_SMOKE_CLOUD );
24 
25 #namespace zm_weap_thundergun;
26 
27 ‪REGISTER_SYSTEM_EX( "zm_weap_thundergun", &‪__init__, &‪__main__, undefined )
28 
29 function ‪__init__()
30 {
31  level.weaponZMThunderGun = GetWeapon( "thundergun" );
32  level.weaponZMThunderGunUpgraded = GetWeapon( "thundergun_upgraded" );
33 }
34 
35 function ‪__main__()
36 {
37  // precache the clientside effects
38  level._effect["thundergun_knockdown_ground"] = ‪STR_KNOCKBACK_GROUND;
39  level._effect["thundergun_smoke_cloud"] = ‪STR_SMOKE_CLOUD;
40 
41  ‪zombie_utility::set_zombie_var( "thundergun_cylinder_radius", 180 );
42  ‪zombie_utility::set_zombie_var( "thundergun_fling_range", 480 ); // 40 feet
43  ‪zombie_utility::set_zombie_var( "thundergun_gib_range", 900 ); // 75 feet
44  ‪zombie_utility::set_zombie_var( "thundergun_gib_damage", 75 );
45  ‪zombie_utility::set_zombie_var( "thundergun_knockdown_range", 1200 ); // 100 feet
46  ‪zombie_utility::set_zombie_var( "thundergun_knockdown_damage", 15 );
47 
48  level.thundergun_gib_refs = [];
49  level.thundergun_gib_refs[level.thundergun_gib_refs.size] = "guts";
50  level.thundergun_gib_refs[level.thundergun_gib_refs.size] = "right_arm";
51  level.thundergun_gib_refs[level.thundergun_gib_refs.size] = "left_arm";
52 
53  level.basic_zombie_thundergun_knockdown = &‪zombie_knockdown;
54 
55 
56  ‪DEFAULT(level.override_thundergun_damage_func, &‪override_thundergun_damage_func);
57 
59 }
60 
61 
63 {
64  self thread ‪wait_for_thundergun_fired();
65 }
66 
67 
69 {
70  self endon( "disconnect" );
71  self waittill( "spawned_player" );
72 
73  for( ;; )
74  {
75  self waittill( "weapon_fired" );
76  currentweapon = self GetCurrentWeapon();
77  if( ( currentweapon == level.weaponZMThunderGun ) || ( currentweapon == level.weaponZMThunderGunUpgraded ) )
78  {
79  self thread ‪thundergun_fired();
80 
81  view_pos = self GetTagOrigin( "tag_flash" ) - self GetPlayerViewHeight();
82  view_angles = self GetTagAngles( "tag_flash" );
83 
84  ‪PlayFx( level._effect["thundergun_smoke_cloud"], view_pos, AnglesToForward( view_angles ), AnglesToUp( view_angles ) );
85  }
86  }
87 }
88 
89 
91 {
92  level.thundergun_network_choke_count++;
93 
94  if ( !(level.thundergun_network_choke_count % 10) )
95  {
99  }
100 }
101 
102 
104 {
105  // ww: physics hit when firing
106  PhysicsExplosionCylinder( self.origin, 600, 240, 1 );
107 
108  self thread ‪thundergun_affect_ais();
109 }
110 
112 {
113  if ( !IsDefined( level.thundergun_knockdown_enemies ) )
114  {
115  level.thundergun_knockdown_enemies = [];
116  level.thundergun_knockdown_gib = [];
117  level.thundergun_fling_enemies = [];
118  level.thundergun_fling_vecs = [];
119  }
120 
122 
123  level.thundergun_network_choke_count = 0;
124  for ( i = 0; i < level.thundergun_fling_enemies.size; i++ )
125  {
126  level.thundergun_fling_enemies[i] thread ‪thundergun_fling_zombie( self, level.thundergun_fling_vecs[i], i );
127  }
128 
129  for ( i = 0; i < level.thundergun_knockdown_enemies.size; i++ )
130  {
131  level.thundergun_knockdown_enemies[i] thread ‪thundergun_knockdown_zombie( self, level.thundergun_knockdown_gib[i] );
132  }
133 
134  level.thundergun_knockdown_enemies = [];
135  level.thundergun_knockdown_gib = [];
136  level.thundergun_fling_enemies = [];
137  level.thundergun_fling_vecs = [];
138 }
139 
140 
142 {
143  view_pos = self GetWeaponMuzzlePoint();
144  zombies = array::get_all_closest( view_pos, GetAITeamArray( level.zombie_team ), undefined, undefined, level.zombie_vars["thundergun_knockdown_range"] );
145  if ( !isDefined( zombies ) )
146  {
147  return;
148  }
149 
150  knockdown_range_squared = level.zombie_vars["thundergun_knockdown_range"] * level.zombie_vars["thundergun_knockdown_range"];
151  gib_range_squared = level.zombie_vars["thundergun_gib_range"] * level.zombie_vars["thundergun_gib_range"];
152  fling_range_squared = level.zombie_vars["thundergun_fling_range"] * level.zombie_vars["thundergun_fling_range"];
153  cylinder_radius_squared = level.zombie_vars["thundergun_cylinder_radius"] * level.zombie_vars["thundergun_cylinder_radius"];
154 
155  forward_view_angles = self GetWeaponForwardDir();
156  end_pos = view_pos + VectorScale( forward_view_angles, level.zombie_vars["thundergun_knockdown_range"] );
157 
158  for ( i = 0; i < zombies.size; i++ )
159  {
160  if ( !IsDefined( zombies[i] ) || !IsAlive( zombies[i] ) )
161  {
162  // guy died on us
163  continue;
164  }
165 
166  test_origin = zombies[i] getcentroid();
167  test_range_squared = DistanceSquared( view_pos, test_origin );
168  if ( test_range_squared > knockdown_range_squared )
169  {
170  zombies[i] ‪thundergun_debug_print( "range", (1, 0, 0) );
171  return; // everything else in the list will be out of range
172  }
173 
174  normal = VectorNormalize( test_origin - view_pos );
175  dot = VectorDot( forward_view_angles, normal );
176  if ( 0 > dot )
177  {
178  // guy's behind us
179  zombies[i] ‪thundergun_debug_print( "dot", (1, 0, 0) );
180  continue;
181  }
182 
183  radial_origin = PointOnSegmentNearestToPoint( view_pos, end_pos, test_origin );
184  if ( DistanceSquared( test_origin, radial_origin ) > cylinder_radius_squared )
185  {
186  // guy's outside the range of the cylinder of effect
187  zombies[i] ‪thundergun_debug_print( "cylinder", (1, 0, 0) );
188  continue;
189  }
190 
191  if ( 0 == zombies[i] DamageConeTrace( view_pos, self ) )
192  {
193  // guy can't actually be hit from where we are
194  zombies[i] ‪thundergun_debug_print( "cone", (1, 0, 0) );
195  continue;
196  }
197 
198  if ( test_range_squared < fling_range_squared )
199  {
200  level.thundergun_fling_enemies[level.thundergun_fling_enemies.size] = zombies[i];
201 
202  // the closer they are, the harder they get flung
203  dist_mult = (fling_range_squared - test_range_squared) / fling_range_squared;
204  fling_vec = VectorNormalize( test_origin - view_pos );
205 
206  // within 6 feet, just push them straight away from the player, ignoring radial motion
207  if ( 5000 < test_range_squared )
208  {
209  fling_vec = fling_vec + VectorNormalize( test_origin - radial_origin );
210  }
211  fling_vec = (fling_vec[0], fling_vec[1], abs( fling_vec[2] ));
212  fling_vec = VectorScale( fling_vec, 100 + 100 * dist_mult );
213  level.thundergun_fling_vecs[level.thundergun_fling_vecs.size] = fling_vec;
214 
215  zombies[i] thread ‪setup_thundergun_vox( self, true, false, false );
216  }
217  else if ( test_range_squared < gib_range_squared )
218  {
219  level.thundergun_knockdown_enemies[level.thundergun_knockdown_enemies.size] = zombies[i];
220  level.thundergun_knockdown_gib[level.thundergun_knockdown_gib.size] = true;
221 
222  zombies[i] thread ‪setup_thundergun_vox( self, false, true, false );
223  }
224  else
225  {
226  level.thundergun_knockdown_enemies[level.thundergun_knockdown_enemies.size] = zombies[i];
227  level.thundergun_knockdown_gib[level.thundergun_knockdown_gib.size] = false;
228 
229  zombies[i] thread ‪setup_thundergun_vox( self, false, false, true );
230  }
231  }
232 }
233 
234 
235 function ‪thundergun_debug_print( msg, color )
236 {
237 }
238 
239 
240 function ‪thundergun_fling_zombie( player, fling_vec, index )
241 {
242  if( !IsDefined( self ) || !IsAlive( self ) )
243  {
244  // guy died on us
245  return;
246  }
247 
248  if ( IsDefined( self.thundergun_fling_func ) )
249  {
250  self [[ self.thundergun_fling_func ]]( player );
251  return;
252  }
253 
254  self.deathpoints_already_given = true;
255 
256  self DoDamage( self.health + 666, player.origin, player );
257 
258  if ( self.health <= 0 )
259  {
260  if( isdefined(player) && isdefined(level.hero_power_update))
261  {
262  level thread [[level.hero_power_update]](player, self);
263  }
264 
265  points = 10;
266  if ( !index )
267  {
269  }
270  else if ( 1 == index )
271  {
272  points = 30;
273  }
274  player ‪zm_score::player_add_points( "thundergun_fling", points );
275 
276  self StartRagdoll();
277  self LaunchRagdoll( fling_vec );
278 
279  self.thundergun_death = true;
280  }
281 }
282 
283 
284 function ‪zombie_knockdown( player, ‪gib )
285 {
286  if ( ‪gib && !self.gibbed )
287  {
288  self.a.gib_ref = array::random( level.thundergun_gib_refs );
289  self thread ‪zombie_death::do_gib();
290  }
291 
292  if(isDefined(level.override_thundergun_damage_func))
293  {
294  self[[level.override_thundergun_damage_func]](player,‪gib);
295  }
296  else
297  {
298  ‪damage = level.zombie_vars["thundergun_knockdown_damage"];
299  self playsound( "fly_thundergun_forcehit" );
300  self.thundergun_handle_pain_notetracks = &‪handle_thundergun_pain_notetracks;
301  self DoDamage( ‪damage, player.origin, player );
302  self AnimCustom( &‪playThundergunPainAnim );
303  }
304 }
305 
307 {
308  self notify( "end_play_thundergun_pain_anim" );
309  self endon( "killanimscript" );
310  self endon( "death" );
311  self endon( "end_play_thundergun_pain_anim" );
312 
313  if( isDefined( self.marked_for_death ) && self.marked_for_death )
314  {
315  return;
316  }
317 
318  if ( self.damageYaw <= -135 || self.damageYaw >= 135 )
319  {
320  if ( self.missingLegs )
321  {
322  fallAnim = "zm_thundergun_fall_front_crawl";
323  }
324  else
325  {
326  fallAnim = "zm_thundergun_fall_front";
327  }
328 
329  getupAnim = "zm_thundergun_getup_belly_early";
330  }
331  else if ( self.damageYaw > -135 && self.damageYaw < -45 )
332  {
333  fallAnim = "zm_thundergun_fall_left";
334  getupAnim = "zm_thundergun_getup_belly_early";
335  }
336  else if ( self.damageYaw > 45 && self.damageYaw < 135 )
337  {
338  fallAnim = "zm_thundergun_fall_right";
339  getupAnim = "zm_thundergun_getup_belly_early";
340  }
341  else
342  {
343  fallAnim = "zm_thundergun_fall_back";
344 
345  if( RandomInt(100) < 50 )
346  {
347  getupAnim = "zm_thundergun_getup_back_early";
348  }
349  else
350  {
351  getupAnim = "zm_thundergun_getup_back_late";
352  }
353  }
354 
355  self SetAnimStateFromASD( fallAnim );
356  self ‪zombie_shared::DoNoteTracks( "thundergun_fall_anim", self.thundergun_handle_pain_notetracks );
357 
358  if( !IsDefined( self ) || !IsAlive( self ) || self.missingLegs || (isDefined( self.marked_for_death ) && self.marked_for_death) )
359  {
360  // guy died on us , or can't get up
361  return;
362  }
363 
364  self SetAnimStateFromASD( getupAnim );
365  self ‪zombie_shared::DoNoteTracks( "thundergun_getup_anim" );
366 }
367 
369 {
370  self endon( "death" );
371  //playsoundatposition ("vox_thundergun_forcehit", self.origin); removing old vox calls
372  playsoundatposition ("wpn_thundergun_proj_impact", self.origin);
373 
374 
375  if( !IsDefined( self ) || !IsAlive( self ) )
376  {
377  // guy died on us
378  return;
379  }
380 
381  if ( IsDefined( self.thundergun_knockdown_func ) )
382  {
383  self [[ self.thundergun_knockdown_func ]]( player, ‪gib );
384  }
385 }
386 
387 
389 {
390  if ( note == "zombie_knockdown_ground_impact" )
391  {
392  ‪PlayFx( level._effect["thundergun_knockdown_ground"], self.origin, AnglesToForward( self.angles ), AnglesToUp( self.angles ) );
393  self playsound( "fly_thundergun_forcehit" );
394  }
395 }
396 
397 
399 {
400  return (self.damageweapon == level.weaponZMThunderGun || self.damageweapon == level.weaponZMThunderGunUpgraded) && (self.damagemod != "MOD_GRENADE" && self.damagemod != "MOD_GRENADE_SPLASH");
401 }
402 
403 
405 {
406  return ‪IS_TRUE( self.thundergun_death );
407 }
408 
409 
411 {
412  self endon( "disconnect" );
413  self waittill( "spawned_player" );
414 
415 
416  for( ;; )
417  {
418  ‪result = self ‪util::waittill_any_return( "grenade_fire", "death", "player_downed", "weapon_change", "grenade_pullback", "disconnect" );
419 
420  if ( !IsDefined( ‪result ) )
421  {
422  continue;
423  }
424 
425  if( ( ‪result == "weapon_change" || ‪result == "grenade_fire" ) && self GetCurrentWeapon() == level.weaponZMThunderGun )
426  {
427  self PlayLoopSound( "tesla_idle", 0.25 );
428 
429  }
430  else
431  {
432  self notify ("weap_away");
433  self StopLoopSound(0.25);
434 
435 
436  }
437  }
438 }
439 
440 //SELF = Zombie Being Hit With Thundergun
441 function ‪setup_thundergun_vox( player, fling, ‪gib, knockdown )
442 {
443  if( !IsDefined( self ) || !IsAlive( self ) )
444  {
445  return;
446  }
447 
448  if( !fling && ( ‪gib || knockdown ) )
449  {
450  if( 25 > RandomIntRange( 1, 100 ) )
451  {
452  //IPrintLnBold( "HAHA, You Knocked Down Some Zombies!" );
453  }
454  }
455 
456  if( fling )
457  {
458  if( 30 > RandomIntRange( 1, 100 ) )
459  {
460  //IPrintLnBold( "WAY TO DISINTEGRATE THEM!!" );
461  player ‪zm_audio::create_and_play_dialog( "kill", "thundergun" );
462  }
463  }
464 }
465 
467 {
469 }
‪setup_thundergun_vox
‪function setup_thundergun_vox(player, fling, gib, knockdown)
Definition: _zm_weap_thundergun.gsc:441
‪playThundergunPainAnim
‪function playThundergunPainAnim()
Definition: _zm_weap_thundergun.gsc:306
‪thundergun_knockdown_zombie
‪function thundergun_knockdown_zombie(player, gib)
Definition: _zm_weap_thundergun.gsc:368
‪__init__
‪function __init__()
Definition: _zm_weap_thundergun.gsc:29
‪player_add_points
‪function player_add_points(event, mod, hit_location, is_dog, zombie_team, damage_weapon)
Definition: _zm_score.gsc:129
‪get_zombie_death_player_points
‪function get_zombie_death_player_points()
Definition: _zm_score.gsc:361
‪is_thundergun_damage
‪function is_thundergun_damage()
Definition: _zm_weap_thundergun.gsc:398
‪STR_SMOKE_CLOUD
‪#define STR_SMOKE_CLOUD
Definition: _zm_weap_thundergun.gsh:2
‪thundergun_debug_print
‪function thundergun_debug_print(msg, color)
Definition: _zm_weap_thundergun.gsc:235
‪waittill_any_return
‪function waittill_any_return(string1, string2, string3, string4, string5, string6, string7)
Definition: util_shared.csc:212
‪set_zombie_var
‪function set_zombie_var(zvar, value, is_float=false, column=1, is_team_based=false)
Definition: zombie_utility.gsc:1434
‪thundergun_on_player_connect
‪function thundergun_on_player_connect()
Definition: _zm_weap_thundergun.gsc:62
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪do_gib
‪function do_gib()
Definition: zombie_death.gsc:245
‪gib
‪function gib(attacker)
Definition: _amws.gsc:1072
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪thundergun_network_choke
‪function thundergun_network_choke()
Definition: _zm_weap_thundergun.gsc:90
‪DoNoteTracks
‪function DoNoteTracks(flagName, customFunction, debugIdentifier, var1)
Definition: shared.gsc:387
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪__main__
‪function __main__()
Definition: _zm_weap_thundergun.gsc:35
‪thundergun_fired
‪function thundergun_fired()
Definition: _zm_weap_thundergun.gsc:103
‪STR_KNOCKBACK_GROUND
‪#define STR_KNOCKBACK_GROUND
Definition: _zm_weap_thundergun.gsh:1
‪wait_network_frame
‪function wait_network_frame(n_count=1)
Definition: util_shared.gsc:64
‪REGISTER_SYSTEM_EX
‪#define REGISTER_SYSTEM_EX(__sys, __func_init_preload, __func_init_postload, __reqs)
Definition: shared.gsh:209
‪thundergun_sound_thread
‪function thundergun_sound_thread()
Definition: _zm_weap_thundergun.gsc:410
‪thundergun_affect_ais
‪function thundergun_affect_ais()
Definition: _zm_weap_thundergun.gsc:111
‪enemy_killed_by_thundergun
‪function enemy_killed_by_thundergun()
Definition: _zm_weap_thundergun.gsc:404
‪thundergun_get_enemies_in_range
‪function thundergun_get_enemies_in_range()
Definition: _zm_weap_thundergun.gsc:141
‪zombie_knockdown
‪function zombie_knockdown(player, gib)
Definition: _zm_weap_thundergun.gsc:284
‪override_thundergun_damage_func
‪function override_thundergun_damage_func(player, gib)
Definition: _zm_weap_thundergun.gsc:466
‪handle_thundergun_pain_notetracks
‪function handle_thundergun_pain_notetracks(note)
Definition: _zm_weap_thundergun.gsc:388
‪thundergun_fling_zombie
‪function thundergun_fling_zombie(player, fling_vec, index)
Definition: _zm_weap_thundergun.gsc:240
‪create_and_play_dialog
‪function create_and_play_dialog(category, subcategory, force_variant)
Definition: _zm_audio.gsc:603
‪on_connect
‪function on_connect()
Definition: _arena.gsc:20
‪result
‪function result(death, attacker, mod, weapon)
Definition: _zm_aat_blast_furnace.gsc:46
‪wait_for_thundergun_fired
‪function wait_for_thundergun_fired()
Definition: _zm_weap_thundergun.gsc:68
‪setup_zombie_knockdown
‪function setup_zombie_knockdown(entity)
Definition: zombie_utility.gsc:2204
‪PlayFx
‪function PlayFx(name)
Definition: _counteruav.gsc:390