‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
All Data Structures Files Functions Variables Macros
end_game_taunts.csc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 #using scripts\shared\animation_shared;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\duplicaterender_mgr;
6 #using scripts\shared\scene_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\util_shared;
9 #using scripts\shared\audio_shared;
10 
11 #using scripts\shared\abilities\gadgets\_gadget_camo_render;
12 #using scripts\shared\abilities\gadgets\_gadget_clone_render;
13 #using scripts\shared\ai\systems\fx_character;
14 
15 #insert scripts\shared\shared.gsh;
16 #insert scripts\shared\version.gsh;
17 #insert scripts\shared\ai\archetype_robot.gsh;
18 #insert scripts\shared\weapons\weapon_group_anims.gsh;
19 
20 #using_animtree("all_player");
21 
22 #define TAUNT_FIRST_PLACE 0
23 
24 #define GESTURE_TYPE_GOOD_GAME 0
25 #define GESTURE_TYPE_THREATEN 1
26 #define GESTURE_TYPE_BOAST 2
27 
28 #define FROM_IDLE_BLEND_TIME 0.4
29 #define TO_IDLE_BLEND_TIME 0.4
30 
31 #define TO_TAUNT_BLEND_TIME 0
32 #define FROM_TAUNT_BLEND_TIME 0.4
33 
34 #define TO_GESTURE_BLEND_TIME 0.4
35 #define FROM_GESTURE_BLEND_TIME 0.4
36 
37 #define CAMERA_GLASS "gfx_p7_zm_asc_data_recorder_glass"
38 #define MINIGUN_PROP "wpn_t7_hero_reaper_minigun_prop"
39 #define MINIGUN_PROP_3 "wpn_t7_loot_hero_reaper3_minigun_prop"
40 #define GI_UNIT_BODY "c_zsf_robot_grunt_body"
41 #define GI_UNIT_HEAD "c_zsf_robot_grunt_head"
42 #define RAP_FRIENDLY "veh_t7_drone_raps_mp_lite"
43 #define RAP_ENEMY "veh_t7_drone_raps_mp_dark"
44 #define TALON_FRIENDLY "veh_t7_drone_attack_gun_litecolor"
45 #define TALON_ENEMY "veh_t7_drone_attack_gun_darkcolor"
46 
47 #precache( "client_fx", "player/fx_loot_taunt_e_reaper_main_03" );
48 
49 #define TALON_LIGHT_FX "player/fx_loot_taunt_outrider_talon_lights"
50 #precache( "client_fx", TALON_LIGHT_FX );
51 
52 #namespace end_game_taunts;
53 
54 ‪REGISTER_SYSTEM( "end_game_taunts", &‪__init__, undefined )
55 
56 function ‪__init__()
57 {
60 
61  ‪animation::add_notetrack_func( "taunts::cloneshaderon", &‪cloneShaderOn );
62  ‪animation::add_notetrack_func( "taunts::cloneshaderoff", &‪cloneShaderOff );
63 
64  ‪animation::add_notetrack_func( "taunts::camoshaderon", &‪camoShaderOn );
65  ‪animation::add_notetrack_func( "taunts::camoshaderoff", &‪camoShaderOff );
66 
67  ‪animation::add_notetrack_func( "taunts::spawncameraglass", &‪spawnCameraGlass );
68  ‪animation::add_notetrack_func( "taunts::deletecameraglass", &‪deleteCameraGlass );
69 
70  ‪animation::add_notetrack_func( "taunts::reaperbulletglass", &‪reaperBulletGlass );
71  ‪animation::add_notetrack_func( "taunts::centerbulletglass", &‪centerBulletGlass );
72 
73  ‪animation::add_notetrack_func( "taunts::talonbulletglassleft", &‪talonBulletGlassLeft );
74  ‪animation::add_notetrack_func( "taunts::talonbulletglassright", &‪talonBulletGlassRight );
75 
76  ‪animation::add_notetrack_func( "taunts::fireweapon", &‪fireWeapon );
77  ‪animation::add_notetrack_func( "taunts::stopfireweapon", &‪stopFireWeapon );
78 
79  ‪animation::add_notetrack_func( "taunts::firebeam", &‪fireBeam );
80  ‪animation::add_notetrack_func( "taunts::stopfirebeam", &‪stopFireBeam );
81 
82  ‪animation::add_notetrack_func( "taunts::playwinnerteamfx", &‪playWinnerTeamFx );
83  ‪animation::add_notetrack_func( "taunts::playlocalteamfx", &‪playLocalTeamFx );
84 
85  level.epicTauntXModels = ‪array(
86  // Models used in script
96 
97  // Notetrack and Scriptbundle models
98  "wpn_t7_arm_blade_prop",
99  "wpn_t7_hero_annihilator_prop",
100  "wpn_t7_hero_bow_prop",
101  "wpn_t7_hero_electro_prop_animate",
102  "wpn_t7_hero_flamethrower_world",
103  "wpn_t7_hero_mgl_world",
104  "wpn_t7_hero_mgl_prop",
105  "wpn_t7_hero_spike_prop",
106  "wpn_t7_hero_seraph_machete_prop",
107  "wpn_t7_loot_crowbar_world",
108  "wpn_t7_spider_mine_world",
109  "wpn_t7_zmb_katana_prop"
110  );
111 
112  // Stop streaming epic models whenever we start up a new VM
114 }
115 
116 /#
118 {
119  while ( 1 )
120  {
121  SetDvar( "forceTaunt", "" );
122 
124 
125  taunt = GetDvarString( "forceTaunt" );
126 
127  if ( taunt == "" )
128  continue;
129 
130  model = level.topPlayerCharacters[ 0 ];
131 
132  if ( !isdefined( model ) ||
133  isdefined( model.playingTaunt ) ||
134  ‪IS_TRUE( model.playingGesture ) )
135  continue;
136 
137  bodyType = GetDvarInt( "forceTauntBodyType", -1 );
138  SetDvar( "forceTauntBodyType", -1 );
139 
140  if ( bodyType >= 0 )
141  {
142  tauntModel = ‪spawn_temp_specialist_model( model.localClientNum, bodyType, model.origin, model.angles, model.showcaseWeapon );
143  model Hide();
144  }
145  else
146  {
147  tauntModel = model;
148  }
149 
150  idleAnimName = ‪getIdleAnimName( model.localClientNum, model, 0 );
151  ‪playTaunt( model.localClientNum, tauntModel, 0, idleAnimName, taunt );
152 
153  if ( tauntModel != model )
154  {
155  tauntModel Delete();
156  model Show();
157  }
158  }
159 }
160 
162 {
163  while ( 1 )
164  {
165  SetDvar( "forceGesture", "" );
166 
168 
169  gesture = GetDvarString( "forceGesture" );
170 
171  if ( gesture == "" )
172  continue;
173 
174  model = level.topPlayerCharacters[ 0 ];
175 
176  if ( !isdefined( model ) ||
177  isdefined( model.playingTaunt ) ||
178  ‪IS_TRUE( model.playingGesture ) )
179  continue;
180 
181  idleAnimName = ‪getIdleAnimName( model.localClientNum, model, 0 );
182  ‪playGesture( model.localClientNum, model, 0, idleAnimName, gesture, true );
183  }
184 }
185 
187 {
188  while( 1 )
189  {
191 
192  if ( !GetDvarInt( "runnerupboxes", 0 ) )
193  continue;
194 
195  for ( i = 1; i < 3; i++ )
196  {
197  model = level.topPlayerCharacters[i];
198  Box( model.origin, ( -15, -15, 0 ), ( 15, 15, 72 ), model.angles[1], ( 0, 0, 1 ), false, 1 );
199  }
200  }
201 }
202 
203 function ‪spawn_temp_specialist_model( localClientNum, characterIndex, origin, angles, showcaseWeapon )
204 {
205  tempModel = ‪Spawn( localClientNum, origin, "script_model" );
206  tempModel.angles = angles;
207  tempModel.showcaseWeapon = showcaseWeapon;
208 
209  tempModel.bodyModel = GetCharacterBodyModel( characterIndex, 0, CurrentSessionMode() );
210  tempModel.helmetModel = GetCharacterHelmetModel( characterIndex, 0, CurrentSessionMode() );
211 
212  tempModel SetModel( tempModel.bodyModel );
213  tempModel Attach( tempModel.helmetModel, "" );
214 
215  tempModel.modeRenderOptions = GetCharacterModeRenderOptions( CurrentSessionMode() );
216 
217  tempModel.bodyRenderOptions = GetCharacterBodyRenderOptions( characterIndex, 0, 0, 0, 0 );
218  tempModel.helmetRenderOptions = GetCharacterHelmetRenderOptions( characterIndex, 0, 0, 0, 0 );
219 
220  tempModel SetBodyRenderOptions( tempModel.modeRenderOptions,
221  tempModel.bodyRenderOptions,
222  tempModel.helmetRenderOptions,
223  tempModel.helmetRenderOptions );
224 
225  return tempModel;
226 }
227 
228 #/
229 
230 function ‪playCurrentTaunt( localClientNum, characterModel, topPlayerIndex )
231 {
232  tauntAnimName = GetTopPlayersTaunt( localClientNum, topPlayerIndex, ‪TAUNT_FIRST_PLACE );
233 
234  idleAnimName = ‪getIdleAnimName( localClientNum, characterModel, topPlayerIndex );
235 
236  ‪playTaunt( localClientNum, characterModel, topPlayerIndex, idleAnimName, tauntAnimName );
237 }
238 
239 function ‪previewTaunt( localClientNum, characterModel, idleAnimName, tauntAnimName )
240 {
241  ‪cancelGesture( characterModel );
242 
243  ‪deleteCameraGlass( undefined );
244 
245  ‪playTaunt( localClientNum, characterModel, 0, idleAnimName, tauntAnimName, ‪TO_TAUNT_BLEND_TIME, false );
246 }
247 
248 function ‪playTaunt( localClientNum, characterModel, topPlayerIndex, idleAnimName, tauntAnimName, toTauntBlendTime = 0, playTransitions = true )
249 {
250  if ( !isdefined( tauntAnimName ) || tauntAnimName == "" )
251  {
252  return;
253  }
254 
255  ‪cancelTaunt( localClientNum, characterModel );
256  characterModel StopSounds();
257  characterModel endon( "cancelTaunt" );
258 
259  characterModel ‪util::waittill_dobj( localClientNum );
260 
261  if( !characterModel HasAnimTree() )
262  {
263  characterModel UseAnimTree( #animtree );
264  }
265 
266  characterModel.playingTaunt = tauntAnimName;
267  characterModel notify( "tauntStarted" );
268 
269  // Clear the idle
270  characterModel ClearAnim( idleAnimName, toTauntBlendTime );
271 
272  // Get the transition anim, dependent on the weapon
273  idleInAnimName = ‪getIdleInAnimName( characterModel, topPlayerIndex );
274 
275  // Hide the weapon
276  ‪hideWeapon( characterModel );
277 
278  characterModel thread ‪playEpicTauntScene( localClientNum, tauntAnimName );
279 
280  // Play taunt anim, VO is hooked up in the exported notetracks
281  characterModel ‪animation::play( tauntAnimName, undefined, undefined, 1, toTauntBlendTime, ‪FROM_TAUNT_BLEND_TIME );
282 
283  // Play transition to idle anim
284  if ( ‪IS_TRUE( playTransitions ) )
285  {
286  self thread ‪waitAppearWeapon( characterModel );
287  ‪playTransitionAnim( characterModel, idleInAnimName, ‪FROM_TAUNT_BLEND_TIME, ‪TO_IDLE_BLEND_TIME );
288  }
289 
290  // Reattach the weapon
291  ‪showWeapon( characterModel );
292 
293  // Play idle anim
294  characterModel thread ‪animation::play( idleAnimName, undefined, undefined, 1, ‪TO_IDLE_BLEND_TIME, 0 );
295 
296  characterModel.playingTaunt = undefined;
297  characterModel notify( "tauntFinished" );
298  characterModel ‪shutdownEpicTauntModels();
299 }
300 
301 function ‪cancelTaunt( localClientNum, characterModel )
302 {
303  if ( isdefined( characterModel.playingTaunt ) )
304  {
305  characterModel ‪cloneShaderOff();
306  characterModel ‪shutdownEpicTauntModels();
307  characterModel ‪stopEpicTauntScene( localClientNum, characterModel.playingTaunt );
308  characterModel StopSounds();
309  }
310 
311  characterModel notify( "cancelTaunt" );
312  characterModel.playingTaunt = undefined;
313  characterModel.epicTauntModels = undefined;
314 }
315 
316 function ‪playGestureType( localClientNum, characterModel, topPlayerIndex, gestureType )
317 {
318  idleAnimName = ‪getIdleAnimName( localClientNum, characterModel, topPlayerIndex );
319 
320  gestureAnimName = GetTopPlayersGesture( localClientNum, topPlayerIndex, gestureType );
321 
322  ‪playGesture( localClientNum, characterModel, topPlayerIndex, idleAnimName, gestureAnimName );
323 }
324 
325 function ‪previewGesture( localClientNum, characterModel, idleAnimName, gestureAnimName )
326 {
327  ‪cancelTaunt( localClientNum, characterModel );
328 
329  ‪deleteCameraGlass( undefined );
330 
331  ‪playGesture( localClientNum, characterModel, 0, idleAnimName, gestureAnimName, false );
332 }
333 
334 function ‪playGesture( localClientNum, characterModel, topPlayerIndex, idleAnimName, gestureAnimName, playTransitions = true )
335 {
336  if ( !isdefined( gestureAnimName ) || gestureAnimName == "" )
337  {
338  return;
339  }
340 
341  ‪cancelGesture( characterModel );
342  characterModel endon( "cancelGesture" );
343 
344  characterModel ‪util::waittill_dobj( localClientNum );
345 
346  if( !characterModel HasAnimTree() )
347  {
348  characterModel UseAnimTree( #animtree );
349  }
350 
351  characterModel.playingGesture = true;
352  characterModel notify( "gestureStarted" );
353 
354  // Get and clear the idle
355  characterModel ClearAnim( idleAnimName, ‪FROM_IDLE_BLEND_TIME );
356 
357  // Get transition anims, dependent on the weapon
358  idleOutAnimName = ‪getIdleOutAnimName( characterModel, topPlayerIndex );
359  idleInAnimName = ‪getIdleInAnimName( characterModel, topPlayerIndex );
360 
361  // Play transition out of idle anim
362  if ( ‪IS_TRUE( playTransitions ) )
363  {
364  self thread ‪waitRemoveWeapon( characterModel );
365  ‪playTransitionAnim( characterModel, idleOutAnimName, ‪FROM_IDLE_BLEND_TIME, ‪TO_GESTURE_BLEND_TIME );
366  }
367 
368  // Get and hide the weapon
369  ‪hideWeapon( characterModel );
370 
371  // Play gesture anim
372  characterModel ‪animation::play( gestureAnimName, undefined, undefined, 1, ‪TO_GESTURE_BLEND_TIME, ‪FROM_GESTURE_BLEND_TIME );
373 
374  // Play transition to idle anim
375  if ( ‪IS_TRUE( playTransitions ) )
376  {
377  self thread ‪waitAppearWeapon( characterModel );
378  ‪playTransitionAnim( characterModel, idleInAnimName, ‪FROM_GESTURE_BLEND_TIME, ‪TO_IDLE_BLEND_TIME );
379  }
380 
381  // Reattach the weapon
382  ‪showWeapon( characterModel );
383 
384  // Play idle anim
385  characterModel thread ‪animation::play( idleAnimName, undefined, undefined, 1, ‪TO_IDLE_BLEND_TIME, 0 );
386 
387  characterModel.playingGesture = false;
388  characterModel notify( "gestureFinished" );
389 }
390 
391 function ‪cancelGesture( characterModel )
392 {
393  characterModel notify( "cancelGesture" );
394  characterModel.playingGesture = false;
395 }
396 
397 function ‪playTransitionAnim( characterModel, transitionAnimName, blendInTime = 0, blendOutTime = 0 )
398 {
399  characterModel endon( "cancelTaunt" );
400 
401  // This should go away when all the transitions are in
402  if ( !isdefined( transitionAnimName ) || transitionAnimName == "" )
403  {
404  return;
405  }
406 
407  characterModel ‪animation::play( transitionAnimName, undefined, undefined, 1, blendInTime, blendOutTime );
408 }
409 
410 function ‪waitRemoveWeapon( characterModel )
411 {
412  characterModel endon( "weaponHidden" );
413 
414  while( 1 )
415  {
416  characterModel waittill( "_anim_notify_", param1 );
417 
418  if ( param1 == "remove_from_hand" )
419  {
420  ‪hideWeapon( characterModel );
421  return;
422  }
423  }
424 }
425 
426 function ‪waitAppearWeapon( characterModel )
427 {
428  characterModel endon( "weaponShown" );
429 
430  while( 1 )
431  {
432  characterModel waittill( "_anim_notify_", param1 );
433 
434  if ( param1 == "appear_in_hand" )
435  {
436  ‪showWeapon( characterModel );
437  return;
438  }
439  }
440 }
441 
442 function ‪hideWeapon( characterModel )
443 {
444  if ( characterModel.weapon == level.weaponNone )
445  {
446  return;
447  }
448 
449  MarkAsDirty( characterModel );
450  characterModel AttachWeapon( level.weaponNone );
451  characterModel UseWeaponHideTags( level.weaponNone );
452 
453  characterModel notify ( "weaponHidden" );
454 }
455 
456 function ‪showWeapon( characterModel )
457 {
458  if ( !isdefined( characterModel.showcaseWeapon ) || characterModel.weapon != level.weaponNone )
459  {
460  return;
461  }
462 
463  MarkAsDirty( characterModel );
464 
465  if ( isdefined( characterModel.showcaseWeaponRenderOptions ) )
466  {
467  characterModel AttachWeapon( characterModel.showcaseWeapon, characterModel.showcaseWeaponRenderOptions, characterModel.showcaseWeaponACVI );
468  characterModel UseWeaponHideTags( characterModel.showcaseWeapon );
469  }
470  else
471  {
472  characterModel AttachWeapon( characterModel.showcaseWeapon );
473  }
474 
475  characterModel notify ( "weaponShown" );
476 }
477 
478 function ‪getIdleAnimName( localClientNum, characterModel, topPlayerIndex )
479 {
480  if ( isdefined( characterModel.weapon ) )
481  {
482  weapon_group = GetItemGroupForWeaponName( characterModel.weapon.rootWeapon.name );
483  if ( weapon_group == "weapon_launcher" )
484  {
485  if ( characterModel.weapon.rootWeapon.name == "launcher_lockonly" ||
486  characterModel.weapon.rootWeapon.name == "launcher_multi" )
487  {
488  weapon_group = "weapon_launcher_alt";
489  }
490  else if ( characterModel.weapon.rootWeapon.name == "launcher_ex41" )
491  {
492  weapon_group = "weapon_smg_ppsh";
493  }
494  }
495  else if ( weapon_group == "weapon_pistol" && characterModel.weapon.isdualwield )
496  {
497  weapon_group = "weapon_pistol_dw";
498  }
499  else if ( weapon_group == "weapon_smg")
500  {
501  if ( characterModel.weapon.rootWeapon.name == "smg_ppsh" )
502  {
503  weapon_group = "weapon_smg_ppsh";
504  }
505  }
506  else if ( weapon_group == "weapon_cqb")
507  {
508  if ( characterModel.weapon.rootWeapon.name == "shotgun_olympia" )
509  {
510  weapon_group = "weapon_smg_ppsh";
511  }
512  }
513  else if ( weapon_group == "weapon_special" )
514  {
515  if ( characterModel.weapon.rootWeapon.name == "special_crossbow" ||
516  characterModel.weapon.rootWeapon.name == "special_discgun" )
517  {
518  weapon_group = "weapon_smg";
519  }
520  else if( characterModel.weapon.rootWeapon.name == "special_crossbow_dw" )
521  {
522  weapon_group = "weapon_pistol_dw";
523  }
524  else if( characterModel.weapon.rootWeapon.name == "knife_ballistic" )
525  {
526  weapon_group = "weapon_knife_ballistic";
527  }
528  }
529  else if ( weapon_group == "weapon_knife" )
530  {
531  if ( characterModel.weapon.rootWeapon.name == "melee_wrench" ||
532  characterModel.weapon.rootWeapon.name == "melee_crowbar" ||
533  characterModel.weapon.rootWeapon.name == "melee_improvise" ||
534  characterModel.weapon.rootWeapon.name == "melee_shockbaton" ||
535  characterModel.weapon.rootWeapon.name == "melee_shovel" )
536  {
537  return ‪WRENCH_ENDGAME_ARRAY[ topPlayerIndex ];
538  }
539  else if ( characterModel.weapon.rootWeapon.name == "melee_knuckles" )
540  {
541  return ‪KNUCKLES_ENDGAME_ARRAY[ topPlayerIndex ];
542  }
543  else if ( characterModel.weapon.rootWeapon.name == "melee_chainsaw" ||
544  characterModel.weapon.rootWeapon.name == "melee_boneglass" ||
545  characterModel.weapon.rootWeapon.name == "melee_crescent" )
546  {
547  return ‪CHAINSAW_ENDGAME_ARRAY[ topPlayerIndex ];
548  }
549  else if ( characterModel.weapon.rootWeapon.name == "melee_boxing" )
550  {
551  return ‪BOXING_ENDGAME_ARRAY[ topPlayerIndex ];
552  }
553  else if ( characterModel.weapon.rootWeapon.name == "melee_sword" ||
554  characterModel.weapon.rootWeapon.name == "melee_katana")
555  {
556  return ‪SWORD_ENDGAME_ARRAY[ topPlayerIndex ];
557  }
558  else if ( characterModel.weapon.rootWeapon.name == "melee_nunchuks" )
559  {
560  return ‪NUNCHUCKS_ENDGAME_ARRAY[ topPlayerIndex ];
561  }
562  else if ( characterModel.weapon.rootWeapon.name == "melee_bat" ||
563  characterModel.weapon.rootWeapon.name == "melee_fireaxe" ||
564  characterModel.weapon.rootWeapon.name == "melee_mace" )
565  {
566  return ‪MACE_ENDGAME_ARRAY[ topPlayerIndex ];
567  }
568  else if ( characterModel.weapon.rootWeapon.name == "melee_prosthetic" )
569  {
570  return ‪PROSTHETIC_ENDGAME_ARRAY[ topPlayerIndex ];
571  }
572  }
573  else if ( weapon_group == "miscweapon" )
574  {
575  if ( characterModel.weapon.rootWeapon.name == "blackjack_coin" )
576  {
577  return ‪BRAWLER_ENDGAME_ARRAY[ topPlayerIndex ];
578  }
579  else if ( characterModel.weapon.rootWeapon.name == "blackjack_cards" )
580  {
581  return ‪BRAWLER_ENDGAME_ARRAY[ topPlayerIndex ];
582  }
583  }
584 
585  if ( isdefined( ‪WEAPON_GROUP_TOP_3_ANIMS[ weapon_group ] ) )
586  {
587  anim_name = ‪WEAPON_GROUP_TOP_3_ANIMS[ weapon_group ][ topPlayerIndex ];
588  }
589  }
590 
591  if ( !isdefined( anim_name ) )
592  {
593  anim_name = ‪BRAWLER_ENDGAME_ARRAY[ topPlayerIndex ];
594  }
595 
596  return anim_name;
597 }
598 
599 function ‪getIdleOutAnimName( characterModel, topPlayerIndex )
600 {
601  weapon_group = ‪getWeaponGroup( characterModel );
602 
603  switch( weapon_group )
604  {
605  case "weapon_smg":
606  return ‪array( "pb_smg_endgame_1stplace_out", "pb_smg_endgame_2ndplace_out", "pb_smg_endgame_3rdplace_out" )[ topPlayerIndex ];
607  case "weapon_assault":
608  return ‪array( "pb_rifle_endgame_1stplace_out", "pb_rifle_endgame_2ndplace_out", "pb_rifle_endgame_3rdplace_out" )[ topPlayerIndex ];
609  case"weapon_cqb":
610  return ‪array( "pb_shotgun_endgame_1stplace_out", "pb_shotgun_endgame_2ndplace_out", "pb_shotgun_endgame_3rdplace_out" )[ topPlayerIndex ];
611  case"weapon_lmg":
612  return ‪array( "pb_lmg_endgame_1stplace_out", "pb_lmg_endgame_2ndplace_out", "pb_lmg_endgame_3rdplace_out" )[ topPlayerIndex ];
613  case"weapon_sniper":
614  return ‪array( "pb_sniper_endgame_1stplace_out", "pb_sniper_endgame_2ndplace_out", "pb_sniper_endgame_3rdplace_out" )[ topPlayerIndex ];
615  case"weapon_pistol":
616  return ‪array( "pb_pistol_endgame_1stplace_out", "pb_pistol_endgame_2ndplace_out", "pb_pistol_endgame_3rdplace_out" )[ topPlayerIndex ];
617  case"weapon_pistol_dw":
618  return ‪array( "pb_pistol_dw_endgame_1stplace_out", "pb_pistol_dw_endgame_2ndplace_out", "pb_pistol_dw_endgame_3rdplace_out" )[ topPlayerIndex ];
619  case"weapon_launcher":
620  return ‪array( "pb_launcher_endgame_1stplace_out", "pb_launcher_endgame_2ndplace_out", "pb_launcher_endgame_3rdplace_out" )[ topPlayerIndex ];
621  case"weapon_launcher_alt":
622  return ‪array( "pb_launcher_alt_endgame_1stplace_out", "pb_launcher_alt_endgame_2ndplace_out", "pb_launcher_alt_endgame_3rdplace_out" )[ topPlayerIndex ];
623  case"weapon_knife":
624  return ‪array( "pb_knife_endgame_1stplace_out", "pb_knife_endgame_2ndplace_out", "pb_knife_endgame_3rdplace_out" )[ topPlayerIndex ];
625  case"weapon_knuckles":
626  return ‪array( "pb_brass_knuckles_endgame_1stplace_out", "pb_brass_knuckles_endgame_2ndplace_out", "pb_brass_knuckles_endgame_3rdplace_out" )[ topPlayerIndex ];
627  case"weapon_boxing":
628  return ‪array( "pb_boxing_gloves_endgame_1stplace_out", "pb_boxing_gloves_endgame_2ndplace_out", "pb_boxing_gloves_endgame_3rdplace_out" )[ topPlayerIndex ];
629  case"weapon_wrench":
630  return ‪array( "pb_wrench_endgame_1stplace_out", "pb_wrench_endgame_2ndplace_out", "pb_wrench_endgame_3rdplace_out" )[ topPlayerIndex ];
631  case"weapon_sword":
632  return ‪array( "pb_sword_endgame_1stplace_out", "pb_sword_endgame_2ndplace_out", "pb_sword_endgame_3rdplace_out" )[ topPlayerIndex ];
633  case"weapon_nunchucks":
634  return ‪array( "pb_nunchucks_endgame_1stplace_out", "pb_nunchucks_endgame_2ndplace_out", "pb_nunchucks_endgame_3rdplace_out" )[ topPlayerIndex ];
635  case"weapon_mace":
636  return ‪array( "pb_mace_endgame_1stplace_out", "pb_mace_endgame_2ndplace_out", "pb_mace_endgame_3rdplace_out" )[ topPlayerIndex ];
637  case"weapon_prosthetic":
638  return ‪array( "pb_prosthetic_arm_endgame_1stplace_out", "pb_prosthetic_arm_endgame_2ndplace_out", "pb_prosthetic_arm_endgame_3rdplace_out" )[ topPlayerIndex ];
639  case"weapon_chainsaw":
640  return ‪array( "pb_chainsaw_endgame_1stplace_idle_out", "pb_chainsaw_endgame_1stplace_idle_out", "pb_chainsaw_endgame_1stplace_idle_out" )[ topPlayerIndex ];
641  case"weapon_smg_ppsh":
642  return ‪array( "pb_smg_ppsh_endgame_1stplace_out", "pb_smg_ppsh_endgame_1stplace_out", "pb_smg_ppsh_endgame_1stplace_out" )[ topPlayerIndex ];
643  case"weapon_knife_ballistic":
644  return ‪array( "pb_b_knife_endgame_1stplace_out", "pb_b_knife_endgame_1stplace_out", "pb_b_knife_endgame_1stplace_out" )[ topPlayerIndex ];
645  }
646 
647  return "";
648 }
649 
650 function ‪getIdleInAnimName( characterModel, topPlayerIndex )
651 {
652  weapon_group = ‪getWeaponGroup( characterModel );
653 
654  switch( weapon_group )
655  {
656  case "weapon_smg":
657  return ‪array( "pb_smg_endgame_1stplace_in", "pb_smg_endgame_2ndplace_in", "pb_smg_endgame_3rdplace_in" )[ topPlayerIndex ];
658  case "weapon_assault":
659  return ‪array( "pb_rifle_endgame_1stplace_in", "pb_rifle_endgame_2ndplace_in", "pb_rifle_endgame_3rdplace_in" )[ topPlayerIndex ];
660  case"weapon_cqb":
661  return ‪array( "pb_shotgun_endgame_1stplace_in", "pb_shotgun_endgame_2ndplace_in", "pb_shotgun_endgame_3rdplace_in" )[ topPlayerIndex ];
662  case"weapon_lmg":
663  return ‪array( "pb_lmg_endgame_1stplace_in", "pb_lmg_endgame_2ndplace_in", "pb_lmg_endgame_3rdplace_in" )[ topPlayerIndex ];
664  case"weapon_sniper":
665  return ‪array( "pb_sniper_endgame_1stplace_in", "pb_sniper_endgame_2ndplace_in", "pb_sniper_endgame_3rdplace_in" )[ topPlayerIndex ];
666  case"weapon_pistol":
667  return ‪array( "pb_pistol_endgame_1stplace_in", "pb_pistol_endgame_2ndplace_in", "pb_pistol_endgame_3rdplace_in" )[ topPlayerIndex ];
668  case"weapon_pistol_dw":
669  return ‪array( "pb_pistol_dw_endgame_1stplace_in", "pb_pistol_dw_endgame_2ndplace_in", "pb_pistol_dw_endgame_3rdplace_in" )[ topPlayerIndex ];
670  case"weapon_launcher":
671  return ‪array( "pb_launcher_endgame_1stplace_in", "pb_launcher_endgame_2ndplace_in", "pb_launcher_endgame_3rdplace_in" )[ topPlayerIndex ];
672  case"weapon_launcher_alt":
673  return ‪array( "pb_launcher_alt_endgame_1stplace_in", "pb_launcher_alt_endgame_2ndplace_in", "pb_launcher_alt_endgame_3rdplace_in" )[ topPlayerIndex ];
674  case"weapon_knife":
675  return ‪array( "pb_knife_endgame_1stplace_in", "pb_knife_endgame_2ndplace_in", "pb_knife_endgame_3rdplace_in" )[ topPlayerIndex ];
676  case"weapon_knuckles":
677  return ‪array( "pb_brass_knuckles_endgame_1stplace_in", "pb_brass_knuckles_endgame_2ndplace_in", "pb_brass_knuckles_endgame_3rdplace_in" )[ topPlayerIndex ];
678  case"weapon_boxing":
679  return ‪array( "pb_boxing_gloves_endgame_1stplace_in", "pb_boxing_gloves_endgame_2ndplace_in", "pb_boxing_gloves_endgame_3rdplace_in" )[ topPlayerIndex ];
680  case"weapon_wrench":
681  return ‪array( "pb_wrench_endgame_1stplace_in", "pb_wrench_endgame_2ndplace_in", "pb_wrench_endgame_3rdplace_in" )[ topPlayerIndex ];
682  case"weapon_sword":
683  return ‪array( "pb_sword_endgame_1stplace_in", "pb_sword_endgame_2ndplace_in", "pb_sword_endgame_3rdplace_in" )[ topPlayerIndex ];
684  case"weapon_nunchucks":
685  return ‪array( "pb_nunchucks_endgame_1stplace_in", "pb_nunchucks_endgame_2ndplace_in", "pb_nunchucks_endgame_3rdplace_in" )[ topPlayerIndex ];
686  case"weapon_mace":
687  return ‪array( "pb_mace_endgame_1stplace_in", "pb_mace_endgame_2ndplace_in", "pb_mace_endgame_3rdplace_in" )[ topPlayerIndex ];
688  case"weapon_prosthetic":
689  return ‪array( "pb_prosthetic_arm_endgame_1stplace_in", "pb_prosthetic_arm_endgame_2ndplace_in", "pb_prosthetic_arm_endgame_3rdplace_in" )[ topPlayerIndex ];
690  case"weapon_chainsaw":
691  return ‪array( "pb_chainsaw_endgame_1stplace_idle_in", "pb_chainsaw_endgame_1stplace_idle_in", "pb_chainsaw_endgame_1stplace_idle_in" )[ topPlayerIndex ];
692  case"weapon_smg_ppsh":
693  return ‪array( "pb_smg_ppsh_endgame_1stplace_in", "pb_smg_ppsh_endgame_1stplace_in", "pb_smg_ppsh_endgame_1stplace_in" )[ topPlayerIndex ];
694  case"weapon_knife_ballistic":
695  return ‪array( "pb_b_knife_endgame_1stplace_in", "pb_b_knife_endgame_1stplace_in", "pb_b_knife_endgame_1stplace_in" )[ topPlayerIndex ];
696  }
697 
698  return "";
699 }
700 
701 function ‪getWeaponGroup( characterModel )
702 {
703  if ( !isdefined( characterModel.weapon ) )
704  {
705  return "";
706  }
707 
708  weapon = characterModel.weapon;
709 
710  if ( weapon == level.weaponNone && isdefined( characterModel.showcaseWeapon ) )
711  {
712  weapon = characterModel.showcaseWeapon;
713  }
714 
715  weapon_group = GetItemGroupForWeaponName( weapon.rootWeapon.name );
716  if ( weapon_group == "weapon_launcher" )
717  {
718  if ( characterModel.weapon.rootWeapon.name == "launcher_lockonly" ||
719  characterModel.weapon.rootWeapon.name == "launcher_multi" )
720  {
721  weapon_group = "weapon_launcher_alt";
722  }
723  else if ( characterModel.weapon.rootWeapon.name == "launcher_ex41" )
724  {
725  weapon_group = "weapon_smg_ppsh";
726  }
727  }
728  else if ( weapon_group == "weapon_pistol" && weapon.isdualwield )
729  {
730  weapon_group = "weapon_pistol_dw";
731  }
732  else if ( weapon_group == "weapon_smg")
733  {
734  if ( characterModel.weapon.rootWeapon.name == "smg_ppsh" )
735  {
736  weapon_group = "weapon_smg_ppsh";
737  }
738  }
739  else if ( weapon_group == "weapon_cqb")
740  {
741  if ( characterModel.weapon.rootWeapon.name == "shotgun_olympia" )
742  {
743  weapon_group = "weapon_smg_ppsh";
744  }
745  }
746  else if ( weapon_group == "weapon_special" )
747  {
748  if ( characterModel.weapon.rootWeapon.name == "special_crossbow" ||
749  characterModel.weapon.rootWeapon.name == "special_discgun" )
750  {
751  weapon_group = "weapon_smg";
752  }
753  else if( characterModel.weapon.rootWeapon.name == "special_crossbow_dw" )
754  {
755  weapon_group = "weapon_pistol_dw";
756  }
757  else if( characterModel.weapon.rootWeapon.name == "knife_ballistic" )
758  {
759  weapon_group = "weapon_knife_ballistic";
760  }
761  }
762  else if ( weapon_group == "weapon_knife" )
763  {
764  if ( characterModel.weapon.rootWeapon.name == "melee_wrench" ||
765  characterModel.weapon.rootWeapon.name == "melee_crowbar" ||
766  characterModel.weapon.rootWeapon.name == "melee_improvise" ||
767  characterModel.weapon.rootWeapon.name == "melee_shockbaton" ||
768  characterModel.weapon.rootWeapon.name == "melee_shovel" )
769  {
770  weapon_group = "weapon_wrench";
771  }
772  else if ( characterModel.weapon.rootWeapon.name == "melee_knuckles" )
773  {
774  weapon_group = "weapon_knuckles";
775  }
776  else if ( characterModel.weapon.rootWeapon.name == "melee_chainsaw" ||
777  characterModel.weapon.rootWeapon.name == "melee_boneglass" ||
778  characterModel.weapon.rootWeapon.name == "melee_crescent" )
779  {
780  weapon_group = "weapon_chainsaw";
781  }
782  else if ( characterModel.weapon.rootWeapon.name == "melee_boxing" )
783  {
784  weapon_group = "weapon_boxing";
785  }
786  else if ( characterModel.weapon.rootWeapon.name == "melee_sword" ||
787  characterModel.weapon.rootWeapon.name == "melee_katana" )
788  {
789  weapon_group = "weapon_sword";
790  }
791  else if ( characterModel.weapon.rootWeapon.name == "melee_nunchuks" )
792  {
793  weapon_group = "weapon_nunchucks";
794  }
795  else if ( characterModel.weapon.rootWeapon.name == "melee_bat" ||
796  characterModel.weapon.rootWeapon.name == "melee_fireaxe" ||
797  characterModel.weapon.rootWeapon.name == "melee_mace" )
798  {
799  weapon_group = "weapon_mace";
800  }
801  else if ( characterModel.weapon.rootWeapon.name == "melee_prosthetic" )
802  {
803  weapon_group = "weapon_prosthetic";
804  }
805  }
806 
807  return weapon_group;
808 }
809 
810 // Epic Taunts
811 //========================================
812 
814 {
815  foreach( model in level.epicTauntXModels )
816  {
817  ForceStreamXModel( model );
818  }
819 }
820 
822 {
823  foreach( model in level.epicTauntXModels )
824  {
825  StopForceStreamingXModel( model );
826  }
827 }
828 
829 function ‪playEpicTauntScene( localClientNum, tauntAnimName )
830 {
831  sceneBundle = ‪struct::get_script_bundle( "scene", tauntAnimName );
832 
833  if ( !isdefined( sceneBundle ) )
834  return false;
835 
836  // Set up any scene object overrides
837  switch( tauntAnimName )
838  {
839  case "t7_loot_taunt_e_reaper_01":
840  self thread ‪setupReaperMinigun( localClientNum );
841  break;
842  case "t7_loot_taunt_e_nomad_03":
843  self thread ‪spawnGiUnit( localClientNum, "gi_unit_victim" );
844  break;
845  case "t7_loot_taunt_e_seraph_04":
846  self thread ‪spawnRap(localClientNum, "rap_1");
847  self thread ‪spawnRap(localClientNum, "rap_2");
848  break;
849  case "t7_loot_taunt_e_reaper_main_03":
850  self thread ‪spawnHiddenClone( localClientNum, "reaper_l" );
851  self thread ‪spawnHiddenClone( localClientNum, "reaper_r" );
852  break;
853  case "t7_loot_taunt_e_spectre_03":
854  if ( GetDvarString( "mapname" ) == "core_frontend" )
855  {
856  // disable the "alt streaming" effect since this disables the cloaking shader
857  self SetHighDetail( true, false );
858  self ‪handleCamoChange( self.localClientNum, true );
859  }
860  else
861  {
862  self thread ‪gadget_camo_render::forceOn( localClientNum );
863  }
864  self thread ‪spawnGiUnit( localClientNum, "gi_unit_victim" );
865  break;
866  case "t7_loot_taunt_e_outrider_05":
867  self thread ‪spawnTalon( localClientNum, "talon_bro_1", 0.65 );
868  self thread ‪spawnTalon( localClientNum, "talon_bro_2", 0.65 );
869  break;
870  }
871 
872  self thread ‪scene::play( tauntAnimName );
873  return true;
874 }
875 
876 function ‪stopEpicTauntScene( localClientNum, tauntAnimName )
877 {
878  sceneBundle = ‪struct::get_script_bundle( "scene", tauntAnimName );
879 
880  if ( !isdefined( sceneBundle ) )
881  return;
882 
883  switch( tauntAnimName )
884  {
885  case "t7_loot_taunt_e_spectre_03":
886  if ( GetDvarString( "mapname" ) == "core_frontend" )
887  {
888  // renabled the "alt streaming" now that cloaking is off
889  self SetHighDetail( true, false );
890  }
891  break;
892  }
893 
894  self thread ‪scene::stop( tauntAnimName );
895 }
896 
897 function ‪addEpicSceneFunc( tauntAnimName, func, state )
898 {
899  sceneBundle = ‪struct::get_script_bundle( "scene", tauntAnimName );
900 
901  if ( !isdefined( sceneBundle ) )
902  return;
903 
904  ‪scene::add_scene_func( tauntAnimName, func, state );
905 }
906 
908 {
909  if ( isdefined( self.epicTauntModels ) )
910  {
911  foreach ( model in self.epicTauntModels )
912  {
913  if ( isdefined( model ) )
914  {
915  model StopSounds();
916  model Delete();
917  }
918  }
919 
920  self.epicTauntModels = undefined;
921  }
922 }
923 
924 // Epic Taunt Anim Effects
925 //========================================
926 
927 function ‪hideModel( param )
928 {
929  self Hide();
930 }
931 
932 function ‪showModel( param )
933 {
934  self Show();
935 }
936 
937 function ‪spawnCameraGlass( param )
938 {
939  if ( isdefined( level.cameraGlass ) )
940  {
941  ‪deleteCameraGlass( param );
942  }
943 
944  level.cameraGlass = ‪Spawn( self.localClientNum, (0,0,0), "script_model" );
945  level.cameraGlass SetModel( ‪CAMERA_GLASS );
946  level.cameraGlass SetScale( 2.0 );
947 
948  level.cameraGlass thread ‪updateGlassPosition();
949 }
950 
952 {
953  self endon( "entityshutdown" );
954 
955  while ( 1 )
956  {
957  camAngles = GetCamAnglesByLocalClientNum( self.localClientNum );
958  camPos = GetCamPosByLocalClientNum( self.localClientNum );
959 
960  fwd = AnglesToForward( camAngles );
961 
962  self.origin = camPos +( fwd * 60 );
963  self.angles = camAngles + (0, 180, 0);
964 
966  }
967 }
968 
969 function ‪deleteCameraGlass( param )
970 {
971  if ( !isdefined( level.cameraGlass ) )
972  return;
973 
974  level.cameraGlass Delete();
975  level.cameraGlass = undefined;
976 }
977 
978 function ‪reaperBulletGlass( param )
979 {
980  waittillframeend;
981 
982  minigun = GetWeapon( "hero_minigun" );
983 
984  for ( i = 30; i > -30; i -= 7 )
985  {
986  if ( !isdefined( self ) )
987  {
988  return;
989  }
990 
991  self ‪magicGlassBullet( self.localClientNum, minigun, RandomFloatRange(2, 12), i );
992  self playsound (0, "pfx_magic_bullet_glass");
993  wait minigun.fireTime;
994  }
995 }
996 
997 function ‪centerBulletGlass( weaponName )
998 {
999  waittillframeend;
1000 
1001  weapon = GetWeapon( weaponName );
1002 
1003  if ( weapon == level.weaponNone )
1004  {
1005  return;
1006  }
1007 
1008  self ‪magicGlassBullet( self.localClientNum, weapon, 4, -2 );
1009  self playsound (0, "pfx_magic_bullet_glass");
1010 }
1011 
1012 function ‪talonBulletGlassLeft( param )
1013 {
1014  self ‪talonBulletGlass( -28, -10 );
1015 }
1016 
1017 function ‪talonBulletGlassRight( param )
1018 {
1019  self ‪talonBulletGlass( 10, 28 );
1020 }
1021 
1022 function ‪talonBulletGlass( yawMin, yawMax )
1023 {
1024  waittillframeend;
1025 
1026  minigun = GetWeapon( "hero_minigun" );
1027 
1028  for( i = 0; i < 15; i++ )
1029  {
1030  if ( !isdefined( self ) )
1031  {
1032  return;
1033  }
1034  self ‪magicGlassBullet( self.localClientNum, minigun, RandomFloatRange(4, 16), RandomFloatRange( yawMin, yawMax ) );
1035  self playsound (0, "pfx_magic_bullet_glass");
1036  wait minigun.fireTime;
1037  }
1038 
1039 }
1040 
1041 function ‪cloneShaderOn( param )
1042 {
1043  if ( GetDvarString( "mapname" ) == "core_frontend" )
1044  {
1045  self SetHighDetail( true, false );
1046  }
1047 
1048  localPlayerTeam = GetLocalPlayerTeam( self.localClientNum );
1049  topPlayerTeam = GetTopPlayersTeam( self.localClientNum, 0 );
1050 
1051  friendly = localPlayerTeam === topPlayerTeam;
1052 
1053  if( friendly )
1054  {
1055  self ‪duplicate_render::update_dr_flag( self.localClientNum, "clone_ally_on", true );
1056  }
1057  else
1058  {
1059  self ‪duplicate_render::update_dr_flag( self.localClientNum, "clone_enemy_on", true );
1060  }
1061 
1062  self thread ‪gadget_clone_render::transition_shader( self.localClientNum );
1063 }
1064 
1065 function ‪cloneShaderOff( param )
1066 {
1067  self ‪duplicate_render::update_dr_flag( self.localClientNum, "clone_ally_on", false );
1068  self ‪duplicate_render::update_dr_flag( self.localClientNum, "clone_enemy_on", false );
1069 }
1070 
1071 function ‪handleCamoChange( localClientNum, camo_on )
1072 {
1073  flags_changed = self ‪duplicate_render::set_dr_flag( "gadget_camo_friend", false );
1074  flags_changed = flags_changed && self ‪duplicate_render::set_dr_flag( "gadget_camo_flicker", false );
1075  flags_changed = flags_changed && self ‪duplicate_render::set_dr_flag( "gadget_camo_break", false );
1076  flags_changed = flags_changed && self ‪duplicate_render::set_dr_flag( "gadget_camo_reveal", false );
1077  flags_changed = flags_changed && self ‪duplicate_render::set_dr_flag( "gadget_camo_on", false );
1078 
1079  if ( flags_changed )
1080  {
1082  }
1083 
1084  if ( camo_on )
1085  {
1086  self thread ‪gadget_camo_render::forceOn( localClientNum );
1087  }
1088  else
1089  {
1090  self thread ‪gadget_camo_render::doReveal( self.localClientNum, 0 );
1091  }
1092 }
1093 
1094 function ‪camoShaderOn( param )
1095 {
1096  if ( GetDvarString( "mapname" ) == "core_frontend" )
1097  {
1098  self ‪handleCamoChange( self.localClientNum, true );
1099  }
1100  else
1101  {
1102  self thread ‪gadget_camo_render::doReveal( self.localClientNum, 1 );
1103  }
1104 }
1105 
1106 function ‪camoShaderOff( param )
1107 {
1108  if ( GetDvarString( "mapname" ) == "core_frontend" )
1109  {
1110  self ‪handleCamoChange( self.localClientNum, false );
1111  }
1112  else
1113  {
1114  self thread ‪gadget_camo_render::doReveal( self.localClientNum, 0 );
1115  }
1116 }
1117 
1118 function ‪fireWeapon( weaponName )
1119 {
1120  if ( !isdefined( weaponName ) )
1121  return;
1122 
1123  self endon( "stopFireWeapon" );
1124 
1125  weapon = GetWeapon( weaponName );
1126 
1127  waittillframeend;
1128 
1129  while( 1 && isdefined( self ) )
1130  {
1131  self MagicBullet( weapon, (0, 0, 0), (0, 0, 0) );
1132  wait( weapon.fireTime );
1133  }
1134 }
1135 
1136 function ‪stopFireWeapon( param )
1137 {
1138  self notify( "stopFireWeapon" );
1139 }
1140 
1141 function ‪fireBeam( beam )
1142 {
1143  if ( isdefined( self.beamFx ) )
1144  {
1145  return;
1146  }
1147 
1148  self.beamFx = BeamLaunch( self.localClientNum, self, "tag_flash", undefined, "none", beam );
1149 }
1150 
1151 function ‪stopFireBeam( param )
1152 {
1153  if ( !isdefined( self.beamFx ) )
1154  {
1155  return;
1156  }
1157 
1158  BeamKill( self.localClientNum, self.beamFx );
1159 
1160  self.beamFx = undefined;
1161 }
1162 
1163 function ‪playWinnerTeamFx( fxName )
1164 {
1165  waittillframeend;
1166 
1167  topPlayerTeam = GetTopPlayersTeam( self.localClientNum, 0 );
1168  ‪DEFAULT( topPlayerTeam, GetLocalPlayerTeam( self.localClientNum ) );
1169 
1170  fxHandle = PlayFxOnTag( self.localClientNum, fxName, self, "tag_origin" );
1171 
1172  if ( isdefined( fxHandle ) )
1173  {
1174  SetFxTeam( self.localClientNum, fxHandle, topPlayerTeam );
1175  }
1176 }
1177 
1178 function ‪playLocalTeamFx( fxName )
1179 {
1180  waittillframeend;
1181 
1182  localPlayerTeam = GetLocalPlayerTeam( self.localClientNum );
1183 
1184  fxHandle = PlayFxOnTag( self.localClientNum, fxName, self, "tag_origin" );
1185 
1186  if ( isdefined( fxHandle ) )
1187  {
1188  SetFxTeam( self.localClientNum, fxHandle, localPlayerTeam );
1189  }
1190 }
1191 
1192 // Effect Helpers
1193 //========================================
1194 
1195 function ‪magicGlassBullet( localClientNum, weapon, pitchAngle, yawAngle )
1196 {
1197  camPos = GetCamPosByLocalClientNum( localClientNum );
1198  camAngles = GetCamAnglesByLocalClientNum( localClientNum );
1199 
1200  bulletAngles = camAngles + ( pitchAngle, yawAngle, 0 );
1201 
1202  self MagicBullet( weapon, camPos, bulletAngles );
1203 }
1204 
1205 function ‪launchProjectile( localClientNum, projectileModel, projectileTrail )
1206 {
1207  launchOrigin = self GetTagOrigin( "tag_flash" );
1208 
1209  if ( !isdefined( launchOrigin ) )
1210  return;
1211 
1212  launchAngles = self GetTagAngles( "tag_flash" );
1213  launchDir = AnglesToForward( launchAngles );
1214 
1215  CreateDynEntAndLaunch( localClientNum, projectileModel, launchOrigin, (0,0,0), launchOrigin, launchDir * GetDvarFloat( "launchspeed", 3.5 ), projectileTrail );
1216 }
1217 
1218 function ‪setupReaperMinigun( localClientNum )
1219 {
1220  model = ‪Spawn( localClientNum, self.origin, "script_model" );
1221  model.angles = self.angles;
1222  model.targetName = "scythe_prop";
1223 
1224  model SetHighDetail( true );
1225  scytheModel = ‪MINIGUN_PROP;
1226 
1227  if ( isdefined( self.bodyModel ) )
1228  {
1229  if ( StrStartsWith( self.bodyModel, "c_t7_mp_reaper_mpc_body3" ) )
1230  {
1231  scytheModel = ‪MINIGUN_PROP_3;
1232  }
1233  }
1234 
1235  model SetModel( scytheModel );
1236  model SetBodyRenderOptions( self.modeRenderOptions, self.bodyRenderOptions, self.helmetRenderOptions, self.helmetRenderOptions );
1237 
1238  self HidePart( localClientNum, "tag_minigun_flaps" );
1239 
1240  ‪ARRAY_ADD( self.epicTauntModels, model );
1241 }
1242 
1243 // The scene system will try to show and anchor the model when the animation starts, so shrink it and hide it
1244 function ‪spawnHiddenClone( localClientNum, targetName)
1245 {
1246  clone = self ‪spawnPlayerModel( localClientNum, targetName, self.origin, self.angles, self.bodyModel, self.helmetModel, self.modeRenderOptions, self.bodyRenderOptions, self.helmetRenderOptions );
1247 
1248  clone SetScale( 0 );
1249 
1251 
1252  clone Hide();
1253  clone SetScale( 1 );
1254 
1255  ‪ARRAY_ADD( self.epicTauntModels, clone );
1256 }
1257 
1258 function ‪spawnTopPlayerModel( localClientNum, targetName, origin, angles, topPlayerIndex )
1259 {
1260  bodyModel = GetTopPlayersBodyModel( localClientNum, topPlayerIndex );
1261  helmetModel = GetTopPlayersHelmetModel( localClientNum, topPlayerIndex );
1262  modeRenderOptions = GetCharacterModeRenderOptions( CurrentSessionMode() );
1263  bodyRenderOptions = GetTopPlayersBodyRenderOptions( localClientNum, topPlayerIndex );
1264  helmetRenderOptions = GetTopPlayersHelmetRenderOptions( localClientNum, topPlayerIndex );
1265 
1266  return ‪spawnPlayerModel( localClientNum, targetName, origin, angles, bodyModel, helmetModel, modeRenderOptions, bodyRenderOptions, helmetRenderOptions );
1267 }
1268 
1269 function ‪spawnPlayerModel( localClientNum, targetName, origin, angles, bodyModel, helmetModel, modeRenderOptions, bodyRenderOptions, helmetRenderOptions )
1270 {
1271  model = ‪Spawn( localClientNum, origin, "script_model" );
1272  model.angles = angles;
1273  model.targetName = targetName;
1274 
1275  model SetHighDetail( true );
1276 
1277  model SetModel( bodyModel );
1278  model Attach( helmetModel, "" );
1279 
1280  model SetBodyRenderOptions( modeRenderOptions, bodyRenderOptions, helmetRenderOptions, helmetRenderOptions );
1281 
1282  model Hide();
1283 
1284  model UseAnimTree( #animtree );
1285 
1286  return model;
1287 }
1288 
1289 function ‪spawnGiUnit( localClientNum, targetName )
1290 {
1291  model = ‪Spawn( localClientNum, self.origin, "script_model" );
1292  model.angles = self.angles;
1293  model.targetName = targetName;
1294 
1295  model SetHighDetail( true );
1296 
1297  model SetModel( ‪GI_UNIT_BODY );
1298  model Attach( ‪GI_UNIT_HEAD, "" );
1299 
1300  ‪ARRAY_ADD( self.epicTauntModels, model );
1301 }
1302 
1303 function ‪spawnRap( localClientNum, targetName)
1304 {
1305  model = ‪Spawn( localClientNum, self.origin, "script_model" );
1306  model.angles = self.angles;
1307  model.targetName = targetName;
1308 
1309  localPlayerTeam = GetLocalPlayerTeam( self.localClientNum );
1310  topPlayerTeam = GetTopPlayersTeam( localClientNum, 0 );
1311 
1312  if ( !isdefined( topPlayerTeam) || localPlayerTeam == topPlayerTeam )
1313  {
1314  model SetModel( ‪RAP_FRIENDLY );
1315  fxTeam = localPlayerTeam;
1316  }
1317  else
1318  {
1319  model SetModel( ‪RAP_ENEMY );
1320  fxTeam = topPlayerTeam;
1321  }
1322 
1323  model ‪util::waittill_dobj( localClientNum );
1324  /*
1325  fxHandle = PlayFxOnTag( localClientNum, TALON_LIGHT_FX, model, "tag_body" );
1326  SetFxTeam( localClientNum, fxHandle, fxTeam );
1327  */
1328  ‪ARRAY_ADD( self.epicTauntModels, model );
1329 }
1330 
1331 function ‪spawnTalon( localClientNum, targetName, scale = 1.0 )
1332 {
1333  model = ‪Spawn( localClientNum, self.origin, "script_model" );
1334  model.angles = self.angles;
1335  model.targetName = targetName;
1336 
1337  localPlayerTeam = GetLocalPlayerTeam( self.localClientNum );
1338  topPlayerTeam = GetTopPlayersTeam( localClientNum, 0 );
1339 
1340  if ( !isdefined( topPlayerTeam) || localPlayerTeam == topPlayerTeam )
1341  {
1342  model SetModel( ‪TALON_FRIENDLY );
1343  fxTeam = localPlayerTeam;
1344  }
1345  else
1346  {
1347  model SetModel( ‪TALON_ENEMY );
1348  fxTeam = topPlayerTeam;
1349  }
1350 
1351  model SetScale( scale );
1352 
1353  model ‪util::waittill_dobj( localClientNum );
1354 
1355  fxHandle = PlayFxOnTag( localClientNum, ‪TALON_LIGHT_FX, model, "tag_body" );
1356  SetFxTeam( localClientNum, fxHandle, fxTeam );
1357 
1358  ‪ARRAY_ADD( self.epicTauntModels, model );
1359 }
‪deleteCameraGlass
‪function deleteCameraGlass(param)
Definition: end_game_taunts.csc:969
‪RAP_FRIENDLY
‪#define RAP_FRIENDLY
Definition: end_game_taunts.csc:42
‪waitRemoveWeapon
‪function waitRemoveWeapon(characterModel)
Definition: end_game_taunts.csc:410
‪addEpicSceneFunc
‪function addEpicSceneFunc(tauntAnimName, func, state)
Definition: end_game_taunts.csc:897
‪getIdleAnimName
‪function getIdleAnimName(localClientNum, characterModel, topPlayerIndex)
Definition: end_game_taunts.csc:478
‪talonBulletGlassRight
‪function talonBulletGlassRight(param)
Definition: end_game_taunts.csc:1017
‪WEAPON_GROUP_TOP_3_ANIMS
‪#define WEAPON_GROUP_TOP_3_ANIMS
Definition: weapon_group_anims.gsh:167
‪PROSTHETIC_ENDGAME_ARRAY
‪#define PROSTHETIC_ENDGAME_ARRAY
Definition: weapon_group_anims.gsh:58
‪spawnHiddenClone
‪function spawnHiddenClone(localClientNum, targetName)
Definition: end_game_taunts.csc:1244
‪hideModel
‪function hideModel(param)
Definition: end_game_taunts.csc:927
‪MINIGUN_PROP_3
‪#define MINIGUN_PROP_3
Definition: end_game_taunts.csc:39
‪getIdleInAnimName
‪function getIdleInAnimName(characterModel, topPlayerIndex)
Definition: end_game_taunts.csc:650
‪spawnPlayerModel
‪function spawnPlayerModel(localClientNum, targetName, origin, angles, bodyModel, helmetModel, modeRenderOptions, bodyRenderOptions, helmetRenderOptions)
Definition: end_game_taunts.csc:1269
‪cloneShaderOff
‪function cloneShaderOff(param)
Definition: end_game_taunts.csc:1065
‪TAUNT_FIRST_PLACE
‪#define TAUNT_FIRST_PLACE
Definition: end_game_taunts.csc:22
‪play
‪function play(animation, v_origin_or_ent, v_angles_or_tag, n_rate=1, n_blend_in=.2, n_blend_out=.2, n_lerp, b_link=false)
Definition: animation_shared.csc:44
‪camoShaderOff
‪function camoShaderOff(param)
Definition: end_game_taunts.csc:1106
‪waitAppearWeapon
‪function waitAppearWeapon(characterModel)
Definition: end_game_taunts.csc:426
‪GI_UNIT_BODY
‪#define GI_UNIT_BODY
Definition: end_game_taunts.csc:40
‪spawnTalon
‪function spawnTalon(localClientNum, targetName, scale=1.0)
Definition: end_game_taunts.csc:1331
‪spawnTopPlayerModel
‪function spawnTopPlayerModel(localClientNum, targetName, origin, angles, topPlayerIndex)
Definition: end_game_taunts.csc:1258
‪update_dr_filters
‪function update_dr_filters(localClientNum)
Definition: duplicaterender_mgr.csc:329
‪transition_shader
‪function transition_shader(localClientNum)
Definition: _gadget_clone_render.csc:40
‪handleCamoChange
‪function handleCamoChange(localClientNum, camo_on)
Definition: end_game_taunts.csc:1071
‪camoShaderOn
‪function camoShaderOn(param)
Definition: end_game_taunts.csc:1094
‪add_scene_func
‪function add_scene_func(str_scenedef, func, str_state="play",...)
Definition: scene_shared.csc:1628
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪forceOn
‪function forceOn(local_client_num)
Definition: _gadget_camo_render.csc:57
‪MACE_ENDGAME_ARRAY
‪#define MACE_ENDGAME_ARRAY
Definition: weapon_group_anims.gsh:43
‪cancelGesture
‪function cancelGesture(characterModel)
Definition: end_game_taunts.csc:391
‪spawn_temp_specialist_model
‪function spawn_temp_specialist_model(localClientNum, characterIndex, origin, angles, showcaseWeapon)
Definition: end_game_taunts.csc:203
‪GI_UNIT_HEAD
‪#define GI_UNIT_HEAD
Definition: end_game_taunts.csc:41
‪playGestureType
‪function playGestureType(localClientNum, characterModel, topPlayerIndex, gestureType)
Definition: end_game_taunts.csc:316
‪TO_GESTURE_BLEND_TIME
‪#define TO_GESTURE_BLEND_TIME
Definition: end_game_taunts.csc:34
‪stopFireBeam
‪function stopFireBeam(param)
Definition: end_game_taunts.csc:1151
‪launchProjectile
‪function launchProjectile(localClientNum, projectileModel, projectileTrail)
Definition: end_game_taunts.csc:1205
‪TO_IDLE_BLEND_TIME
‪#define TO_IDLE_BLEND_TIME
Definition: end_game_taunts.csc:29
‪TALON_FRIENDLY
‪#define TALON_FRIENDLY
Definition: end_game_taunts.csc:44
‪setupReaperMinigun
‪function setupReaperMinigun(localClientNum)
Definition: end_game_taunts.csc:1218
‪previewTaunt
‪function previewTaunt(localClientNum, characterModel, idleAnimName, tauntAnimName)
Definition: end_game_taunts.csc:239
‪KNUCKLES_ENDGAME_ARRAY
‪#define KNUCKLES_ENDGAME_ARRAY
Definition: weapon_group_anims.gsh:6
‪playTransitionAnim
‪function playTransitionAnim(characterModel, transitionAnimName, blendInTime=0, blendOutTime=0)
Definition: end_game_taunts.csc:397
‪NUNCHUCKS_ENDGAME_ARRAY
‪#define NUNCHUCKS_ENDGAME_ARRAY
Definition: weapon_group_anims.gsh:37
‪check_force_gesture
‪function check_force_gesture()
Definition: end_game_taunts.csc:161
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪stream_epic_models
‪function stream_epic_models()
Definition: end_game_taunts.csc:813
‪reaperBulletGlass
‪function reaperBulletGlass(param)
Definition: end_game_taunts.csc:978
‪playLocalTeamFx
‪function playLocalTeamFx(fxName)
Definition: end_game_taunts.csc:1178
‪playEpicTauntScene
‪function playEpicTauntScene(localClientNum, tauntAnimName)
Definition: end_game_taunts.csc:829
‪FROM_IDLE_BLEND_TIME
‪#define FROM_IDLE_BLEND_TIME
Definition: end_game_taunts.csc:28
‪playTaunt
‪function playTaunt(localClientNum, characterModel, topPlayerIndex, idleAnimName, tauntAnimName, toTauntBlendTime=0, playTransitions=true)
Definition: end_game_taunts.csc:248
‪add_notetrack_func
‪function add_notetrack_func(funcname, func)
Definition: animation_shared.csc:190
‪cloneShaderOn
‪function cloneShaderOn(param)
Definition: end_game_taunts.csc:1041
‪getWeaponGroup
‪function getWeaponGroup(characterModel)
Definition: end_game_taunts.csc:701
‪hideWeapon
‪function hideWeapon(characterModel)
Definition: end_game_taunts.csc:442
‪BOXING_ENDGAME_ARRAY
‪#define BOXING_ENDGAME_ARRAY
Definition: weapon_group_anims.gsh:12
‪ARRAY_ADD
‪#define ARRAY_ADD(__array, __item)
Definition: shared.gsh:304
‪FROM_GESTURE_BLEND_TIME
‪#define FROM_GESTURE_BLEND_TIME
Definition: end_game_taunts.csc:35
‪cancelTaunt
‪function cancelTaunt(localClientNum, characterModel)
Definition: end_game_taunts.csc:301
‪talonBulletGlassLeft
‪function talonBulletGlassLeft(param)
Definition: end_game_taunts.csc:1012
‪CHAINSAW_ENDGAME_ARRAY
‪#define CHAINSAW_ENDGAME_ARRAY
Definition: weapon_group_anims.gsh:66
‪TO_TAUNT_BLEND_TIME
‪#define TO_TAUNT_BLEND_TIME
Definition: end_game_taunts.csc:31
‪previewGesture
‪function previewGesture(localClientNum, characterModel, idleAnimName, gestureAnimName)
Definition: end_game_taunts.csc:325
‪MINIGUN_PROP
‪#define MINIGUN_PROP
Definition: end_game_taunts.csc:38
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪array
‪function filter array
Definition: array_shared.csc:16
‪RAP_ENEMY
‪#define RAP_ENEMY
Definition: end_game_taunts.csc:43
‪playWinnerTeamFx
‪function playWinnerTeamFx(fxName)
Definition: end_game_taunts.csc:1163
‪Spawn
‪function Spawn(parent, onDeathCallback)
Definition: _flak_drone.gsc:427
‪magicGlassBullet
‪function magicGlassBullet(localClientNum, weapon, pitchAngle, yawAngle)
Definition: end_game_taunts.csc:1195
‪TALON_ENEMY
‪#define TALON_ENEMY
Definition: end_game_taunts.csc:45
‪stop
‪function stop(n_blend=0.2)
Definition: animation_shared.gsc:97
‪stopFireWeapon
‪function stopFireWeapon(param)
Definition: end_game_taunts.csc:1136
‪playGesture
‪function playGesture(localClientNum, characterModel, topPlayerIndex, idleAnimName, gestureAnimName, playTransitions=true)
Definition: end_game_taunts.csc:334
‪waittill_dobj
‪function waittill_dobj(localClientNum)
Definition: util_shared.csc:1117
‪showWeapon
‪function showWeapon(characterModel)
Definition: end_game_taunts.csc:456
‪getIdleOutAnimName
‪function getIdleOutAnimName(characterModel, topPlayerIndex)
Definition: end_game_taunts.csc:599
‪stop_stream_epic_models
‪function stop_stream_epic_models()
Definition: end_game_taunts.csc:821
‪showModel
‪function showModel(param)
Definition: end_game_taunts.csc:932
‪TALON_LIGHT_FX
‪#define TALON_LIGHT_FX
Definition: end_game_taunts.csc:49
‪stopEpicTauntScene
‪function stopEpicTauntScene(localClientNum, tauntAnimName)
Definition: end_game_taunts.csc:876
‪WRENCH_ENDGAME_ARRAY
‪#define WRENCH_ENDGAME_ARRAY
Definition: weapon_group_anims.gsh:19
‪draw_runner_up_bounds
‪function draw_runner_up_bounds()
Definition: end_game_taunts.csc:186
‪spawnRap
‪function spawnRap(localClientNum, targetName)
Definition: end_game_taunts.csc:1303
‪update_dr_flag
‪function update_dr_flag(localClientNum, toset, setto=true)
Definition: duplicaterender_mgr.csc:221
‪playCurrentTaunt
‪function playCurrentTaunt(localClientNum, characterModel, topPlayerIndex)
Definition: end_game_taunts.csc:230
‪check_force_taunt
‪function check_force_taunt()
Definition: end_game_taunts.csc:117
‪get_script_bundle
‪function get_script_bundle(str_type, str_name)
Definition: struct.csc:45
‪BRAWLER_ENDGAME_ARRAY
‪#define BRAWLER_ENDGAME_ARRAY
Definition: weapon_group_anims.gsh:50
‪fireBeam
‪function fireBeam(beam)
Definition: end_game_taunts.csc:1141
‪CAMERA_GLASS
‪#define CAMERA_GLASS
Definition: end_game_taunts.csc:37
‪centerBulletGlass
‪function centerBulletGlass(weaponName)
Definition: end_game_taunts.csc:997
‪talonBulletGlass
‪function talonBulletGlass(yawMin, yawMax)
Definition: end_game_taunts.csc:1022
‪FROM_TAUNT_BLEND_TIME
‪#define FROM_TAUNT_BLEND_TIME
Definition: end_game_taunts.csc:32
‪spawnGiUnit
‪function spawnGiUnit(localClientNum, targetName)
Definition: end_game_taunts.csc:1289
‪doReveal
‪function doReveal(localClientNum, direction)
Definition: _flak_drone.csc:46
‪set_dr_flag
‪function set_dr_flag(toset, setto=true)
Definition: duplicaterender_mgr.csc:251
‪WAIT_CLIENT_FRAME
‪#define WAIT_CLIENT_FRAME
Definition: shared.gsh:266
‪SWORD_ENDGAME_ARRAY
‪#define SWORD_ENDGAME_ARRAY
Definition: weapon_group_anims.gsh:30
‪spawnCameraGlass
‪function spawnCameraGlass(param)
Definition: end_game_taunts.csc:937
‪shutdownEpicTauntModels
‪function shutdownEpicTauntModels()
Definition: end_game_taunts.csc:907
‪fireWeapon
‪function fireWeapon(weaponName)
Definition: end_game_taunts.csc:1118
‪updateGlassPosition
‪function updateGlassPosition()
Definition: end_game_taunts.csc:951
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265
‪__init__
‪function __init__()
Definition: end_game_taunts.csc:56