‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_zm.csc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\aat_shared;
4 #using scripts\shared\archetype_shared\archetype_shared;
5 #using scripts\shared\array_shared;
6 #using scripts\shared\callbacks_shared;
7 #using scripts\shared\clientfield_shared;
8 #using scripts\shared\duplicaterender_mgr;
9 #using scripts\shared\fx_shared;
10 #using scripts\shared\system_shared;
11 #using scripts\shared\util_shared;
12 #using scripts\shared\visionset_mgr_shared;
13 
14 #insert scripts\shared\aat_shared.gsh;
15 #insert scripts\shared\duplicaterender.gsh;
16 #insert scripts\shared\shared.gsh;
17 #insert scripts\shared\version.gsh;
18 
19 #using scripts\zm\_load;
20 #using scripts\zm\_sticky_grenade;
21 #using scripts\shared\util_shared;
22 #using scripts\zm\_zm_audio;
23 #using scripts\zm\_zm_bgb;
24 #using scripts\zm\_zm_demo;
25 #using scripts\zm\_zm_equipment;
26 #using scripts\zm\_zm_ffotd;
27 #using scripts\zm\_zm_laststand;
28 #using scripts\zm\_zm_perks;
29 #using scripts\zm\_zm_powerups;
30 #using scripts\zm\_zm_utility;
31 #using scripts\zm\_zm_weapons;
32 #using scripts\zm\_zm_zdraw;
33 
34 // AATs
35 #insert scripts\shared\aat_zm.gsh;
36 #using scripts\zm\aats\_zm_aat_blast_furnace;
37 #using scripts\zm\aats\_zm_aat_dead_wire;
38 #using scripts\zm\aats\_zm_aat_fire_works;
39 #using scripts\zm\aats\_zm_aat_thunder_wall;
40 #using scripts\zm\aats\_zm_aat_turned;
41 
42 #precache( "client_fx", "_t6/maps/zombie/fx_mp_zombie_hand_water_burst" );
43 #precache( "client_fx", "_t6/maps/zombie/fx_mp_zombie_body_water_billowing" );
44 #precache( "client_fx", "_t6/maps/zombie/fx_zombie_body_wtr_falling" );
45 #precache( "client_fx", "zombie/fx_spawn_dirt_hand_burst_zmb" );
46 #precache( "client_fx", "zombie/fx_spawn_dirt_body_billowing_zmb" );
47 #precache( "client_fx", "zombie/fx_spawn_dirt_body_dustfalling_zmb" );
48 #precache( "client_fx", "_t6/maps/zombie/fx_mp_zombie_hand_snow_burst" );
49 #precache( "client_fx", "_t6/maps/zombie/fx_mp_zombie_body_snow_falling" );
50 #precache( "client_fx", "zombie/fx_blood_torso_explo_zmb" );
51 #precache( "client_fx", "zombie/fx_blood_torso_explo_lg_zmb" );
52 
53 #namespace zm;
54 
55 function autoexec ‪ignore_systems()
56 {
57  //shutdown unwanted systems
58  ‪system::ignore("gadget_clone");
59  ‪system::ignore("gadget_heat_wave");
60  ‪system::ignore("gadget_resurrect");
61  ‪system::ignore("gadget_shock_field");
62  ‪system::ignore("gadget_es_strike");
63  ‪system::ignore("gadget_misdirection");
64  ‪system::ignore("gadget_smokescreen");
65  ‪system::ignore("gadget_firefly_swarm");
66  ‪system::ignore("gadget_immolation");
67  ‪system::ignore("gadget_forced_malfunction");
68  ‪system::ignore("gadget_sensory_overload");
69  ‪system::ignore("gadget_rapid_strike");
70  ‪system::ignore("gadget_camo_render");
71  ‪system::ignore("gadget_unstoppable_force");
72  ‪system::ignore("gadget_overdrive");
73  ‪system::ignore("gadget_concussive_wave");
74  ‪system::ignore("gadget_ravage_core");
75  ‪system::ignore("gadget_cacophany");
76  ‪system::ignore("gadget_iff_override");
77  ‪system::ignore("gadget_security_breach");
78  ‪system::ignore("gadget_surge");
79  ‪system::ignore("gadget_exo_breakdown");
80  ‪system::ignore("gadget_servo_shortout");
81  ‪system::ignore("gadget_system_overload");
82  ‪system::ignore("gadget_cleanse");
83  ‪system::ignore("gadget_flashback");
84  ‪system::ignore("gadget_combat_efficiency");
85  ‪system::ignore("gadget_other");
86  ‪system::ignore("gadget_vision_pulse");
87  ‪system::ignore("gadget_camo");
88  ‪system::ignore("gadget_speed_burst");
89  ‪system::ignore("gadget_armor");
90  ‪system::ignore("gadget_thief");
91  ‪system::ignore("replay_gun");
92  ‪system::ignore("spike_charge_siegebot");
93  ‪system::ignore("end_game_taunts");
94 
95  if ( GetDvarInt( "splitscreen_playerCount" ) > 2 )
96  {
97  ‪system::ignore("footsteps");
98  ‪system::ignore("ambient");
99  }
100 
101 }
102 
103 function ‪init()
104 {
105  level thread ‪zm_ffotd::main_start();
106 
107  level.onlineGame = SessionModeIsOnlineGame();
108  level.swimmingFeature = false;
109 
110 // level.scr_zm_game_module = getZMGameModule(GetDvarString( "ui_gametype" ));
111  level.scr_zm_ui_gametype = GetDvarString( "ui_gametype" );
112  level.scr_zm_map_start_location = "";//GetDvarString( "ui_zm_mapstartlocation" );
113  level.gamedifficulty = GetGametypeSetting( "zmDifficulty" );
114  level.enable_magic = GetGametypeSetting( "magic" );
115  level.headshots_only = GetGametypeSetting( "headshotsonly" );
116 
117  level.disable_equipment_team_object = true;
118 
120 
121  level.clientVoiceSetup = &‪zm_audio::clientVoiceSetup;
122  level.playerFallDamageSound = &‪zm_audio::playerFallDamageSound;
123 
125 
128 
130 
134 
135  level.gibResetTime = 0.5;
136  level.gibMaxCount = 3;
137  level.gibTimer = 0;
138  level.gibCount = 0;
139  level._gibEventCBFunc = &‪on_gib_event;
140  level thread ‪resetGibCounter();
141 
142  level thread ‪ZPO_listener();
143  level thread ‪ZPOff_listener();
144 
145  level._BOX_INDICATOR_NO_LIGHTS = -1;
146  level._BOX_INDICATOR_FLASH_LIGHTS_MOVING = 99;
147 
148  level._box_indicator = level._BOX_INDICATOR_NO_LIGHTS; // No lights showing.
149 
150  ‪util::register_system("box_indicator", &‪box_monitor);
151 
152  level._ZOMBIE_GIB_PIECE_INDEX_ALL = 0;
153  level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM = 1;
154  level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM = 2;
155  level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG = 3;
156  level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG = 4;
157  level._ZOMBIE_GIB_PIECE_INDEX_HEAD = 5;
158  level._ZOMBIE_GIB_PIECE_INDEX_GUTS = 6;
159  level._ZOMBIE_GIB_PIECE_INDEX_HAT = 7;
160 
161  ‪callback::add_callback( #"on_localclient_connect", &‪basic_player_connect);
164 
165  level.update_aat_hud = &‪update_aat_hud;
166 
167  // custom character exerts - most of the exert sounds will be set up here
168  if (isdefined(level.setupCustomCharacterExerts))
169  [[level.setupCustomCharacterExerts]]();
170 
171 
172  level thread ‪zm_ffotd::main_end();
173 }
174 
176 {
177  wait(0.1);
178 
179  players = GetLocalPlayers();
180 
181  for(x=0;x<players.size;x++)
182  {
183  while( !ClientHasSnapshot( x ) )
184  {
185  wait( 0.05 );
186  }
187  }
188 
189  wait(0.1);
190 
191  level thread [[func]]();
192 }
193 
194 
195 #define PLAYER_KEYLINE_MATERIAL "mc/hud_keyline_zm_player"
196 #define PLAYER_KEYLINE_MATERIAL_LASTSTAND "mc/hud_keyline_zm_player_ls"
197 
198 #define PLAYER_KEYLINE_DVAR "scr_hide_player_keyline"
199 
200 #define SITREP_FRIENDLY_ONLY 4
201 #define SITREP_BEAST_MODE_AND_FRIENDLY 3
202 
204 {
205  self oed_sitrepscan_enable( ‪SITREP_FRIENDLY_ONLY );
206  self oed_sitrepscan_setoutline( 1 );
207  self oed_sitrepscan_setlinewidth( 2 );
208  self oed_sitrepscan_setsolid( 1 );
209  self oed_sitrepscan_setradius( 800 );
210  self oed_sitrepscan_setfalloff( 0.1 );
211 
212  ‪duplicate_render::set_dr_filter_offscreen( "player_keyline", 25, "keyline_active", "keyline_disabled", ‪DR_TYPE_OFFSCREEN, ‪PLAYER_KEYLINE_MATERIAL, ‪DR_CULL_NEVER );
213  ‪duplicate_render::set_dr_filter_offscreen( "player_keyline_ls", 30, "keyline_active,keyline_ls", "keyline_disabled", ‪DR_TYPE_OFFSCREEN, ‪PLAYER_KEYLINE_MATERIAL_LASTSTAND, ‪DR_CULL_NEVER );
214 
215 }
216 
217 function ‪player_duplicaterender( localClientNum )
218 {
219  if( self == GetLocalPlayer( localClientNum ) )
220  {
222  self thread ‪force_update_player_clientfields(localClientNum);
223  }
224  if( self IsPlayer() && self IsLocalPlayer() )
225  {
226  if( !IsDefined(self GetLocalClientNumber()) || localClientNum == self GetLocalClientNumber() )
227  return;
228  }
229 
230  dvar_value = GetDvarInt( ‪PLAYER_KEYLINE_DVAR );
231 
232  self ‪duplicate_render::set_dr_flag( "keyline_active", !dvar_value );
233  self ‪duplicate_render::update_dr_filters(localClientNum);
234 }
235 
236 function ‪player_umbrahotfixes( localClientNum )
237 {
238  if ( !self IsLocalPlayer() || !IsDefined( self GetLocalClientNumber() ) || localClientNum != self GetLocalClientNumber() )
239  {
240  return;
241  }
242 
243  self thread ‪zm_utility::umbra_fix_logic( localClientNum );
244 }
245 
246 function ‪basic_player_connect( localClientNum )
247 {
248 
249  if ( !isdefined( level._laststand ) )
250  {
251  level._laststand = [];
252  }
253 
254  level._laststand[localClientNum] = false;
255 
256 }
257 
258 function ‪force_update_player_clientfields( localClientNum )
259 {
260  self endon( "entityshutdown" );
261 
262  while(!ClientHasSnapshot(localClientNum))
263  {
264  wait(0.25);
265  }
266 
267  wait(0.25);
268 
269  self ProcessClientFieldsAsIfNew();
270 }
271 
273 {
274 // level._effect["wood_chunk_destory"] = "_t6/impacts/fx_large_woodhit";
275 }
276 
278 {
279 
280 
281  // NEW riser effects in water
282  if(isDefined(level.use_new_riser_water) && level.use_new_riser_water)
283  {
284  level._effect["rise_burst_water"] = "_t6/maps/zombie/fx_mp_zombie_hand_water_burst";
285  level._effect["rise_billow_water"] = "_t6/maps/zombie/fx_mp_zombie_body_water_billowing";
286  level._effect["rise_dust_water"] = "_t6/maps/zombie/fx_zombie_body_wtr_falling";
287  }
288 
289  level._effect["rise_burst"] = "zombie/fx_spawn_dirt_hand_burst_zmb";
290  level._effect["rise_billow"] = "zombie/fx_spawn_dirt_body_billowing_zmb";
291  level._effect["rise_dust"] = "zombie/fx_spawn_dirt_body_dustfalling_zmb";
292 
293  if(isDefined(level.riser_type) && level.riser_type == "snow")
294  {
295  level._effect["rise_burst_snow"] = "_t6/maps/zombie/fx_mp_zombie_hand_snow_burst";
296  level._effect["rise_billow_snow"] = "_t6/maps/zombie/fx_mp_zombie_body_snow_billowing";
297  level._effect["rise_dust_snow"] = "_t6/maps/zombie/fx_mp_zombie_body_snow_falling";
298  }
299 
300 }
301 
303 {
304  // Callbacks for actors
305 
307 
308  if ( ‪IS_TRUE( level.use_water_risers ) )
309  {
311  }
312 
313  if ( ‪IS_TRUE( level.use_foliage_risers ) )
314  {
316  }
317 
318  if ( ‪IS_TRUE( level.use_low_gravity_risers ) )
319  {
321  }
322 
328 
329  bits = 4;
330  power = ‪struct::get_array("elec_switch_fx","script_noteworthy");
331  if ( IsDefined( power ) )
332  {
333  bits = GetMinBitCountForNum( power.size + 1 );
334  }
337 
343 }
344 
345 function ‪box_monitor(clientNum, state, oldState)
346 {
347  if(IsDefined(level._custom_box_monitor))
348  {
349  [[level._custom_box_monitor]](clientNum, state, oldState);
350  }
351 }
352 
353 function ‪ZPO_listener()
354 {
355  while(1)
356  {
357  int = undefined;
358  level waittill("ZPO", int); // Zombie power on.
359 
360  if(IsDefined(int))
361  {
362  level notify("power_on", int );
363  }
364  else
365  {
366  level notify("power_on" );
367  }
368  //level notify("middle_door_open");
369  }
370 }
371 
373 {
374  while(1)
375  {
376  int = undefined;
377  level waittill("ZPOff", int);
378 
379  if(IsDefined(int))
380  {
381  level notify("power_off", int );
382  }
383  else
384  {
385  level notify("power_off" );
386  }
387  }
388 }
389 
390 function ‪zombie_power_clientfield_on(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
391 {
392  if(newVal)
393  {
394  level notify("ZPO", newVal);
395  }
396 }
397 
398 function ‪zombie_power_clientfield_off(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
399 {
400  if(newVal)
401  {
402  level notify("ZPOff", newVal);
403  }
404 }
405 
406 function ‪round_complete_time(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
407 {
408  model = CreateUIModel( GetUIModelForController( localClientNum ), "hudItems.time.round_complete_time" );
409  SetUIModelValue( model, newVal );
410 }
411 
412 function ‪round_complete_num(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
413 {
414  model = CreateUIModel( GetUIModelForController( localClientNum ), "hudItems.time.round_complete_num" );
415  SetUIModelValue( model, newVal );
416 }
417 
418 function ‪game_end_time(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
419 {
420  model = CreateUIModel( GetUIModelForController( localClientNum ), "hudItems.time.game_end_time" );
421  SetUIModelValue( model, newVal );
422 }
423 
424 function ‪quest_complete_time(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
425 {
426  model = CreateUIModel( GetUIModelForController( localClientNum ), "hudItems.time.quest_complete_time" );
427  SetUIModelValue( model, newVal );
428 }
429 
430 function ‪game_start_time(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
431 {
432  model = CreateUIModel( GetUIModelForController( localClientNum ), "hudItems.time.game_start_time" );
433  SetUIModelValue( model, newVal );
434 }
435 
436 //
437 //
438 function ‪createZombieEyesInternal(localClientNum)
439 {
440  self endon("entityshutdown");
441 
442  self ‪util::waittill_dobj( localClientNum );
443 
444  if ( !isdefined( self._eyeArray ) )
445  {
446  self._eyeArray = [];
447  }
448 
449  if ( !isdefined( self._eyeArray[localClientNum] ) )
450  {
451  linkTag = "j_eyeball_le";
452 
453  effect = level._effect["eye_glow"];
454 
455  // will handle level wide eye fx change
456  if(IsDefined(level._override_eye_fx))
457  {
458  effect = level._override_eye_fx;
459  }
460  // will handle individual spawner or type eye fx change
461  if(IsDefined(self._eyeglow_fx_override))
462  {
463  effect = self._eyeglow_fx_override;
464  }
465 
466  if(IsDefined(self._eyeglow_tag_override))
467  {
468  linkTag = self._eyeglow_tag_override;
469  }
470 
471  self._eyeArray[localClientNum] = PlayFxOnTag( localClientNum, effect, self, linkTag );
472  }
473 }
474 
475 function ‪createZombieEyes( localClientNum )
476 {
477  self thread ‪createZombieEyesInternal(localClientNum);
478 }
479 
480 
481 function ‪deleteZombieEyes(localClientNum)
482 {
483  if ( isdefined( self._eyeArray ) )
484  {
485  if ( isdefined( self._eyeArray[localClientNum] ) )
486  {
487  DeleteFx( localClientNum, self._eyeArray[localClientNum], true );
488  self._eyeArray[localClientNum] = undefined;
489  }
490  }
491 }
492 
493 function ‪player_eyes_clientfield_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
494 {
495  if ( self IsPlayer() )
496  {
497  self.zombie_face = newVal;
498  self notify( "face", "face_advance" );
499 
500  if ( ‪IS_TRUE(self.special_eyes) )
501  {
502 // self._eyeglow_fx_override = level._effect["player_eye_glow_blue"];
503  }
504  else
505  {
506 // self._eyeglow_fx_override = level._effect["player_eye_glow_orng"];
507  }
508  }
509 
510  if( self IsPlayer() && self IsLocalPlayer() && !IsDemoPlaying() )
511  {
512  if( localClientNum == self GetLocalClientNumber() )
513  return;
514  }
515 
516  if( !IsDemoPlaying() )
517  ‪zombie_eyes_clientfield_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump);
518  else
519  ‪zombie_eyes_demo_clientfield_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump);
520 }
521 
522 function ‪player_eye_color_clientfield_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
523 {
524  if( self IsPlayer() && self IsLocalPlayer() && !IsDemoPlaying() )
525  {
526  if( localClientNum == self GetLocalClientNumber() )
527  return;
528  }
529 
530  if ( !IsDefined(self.special_eyes) || self.special_eyes != newVal )
531  {
532  self.special_eyes = newVal;
533 
534  if ( ‪IS_TRUE(self.special_eyes) )
535  {
536  self._eyeglow_fx_override = level._effect["player_eye_glow_blue"];
537  }
538  else
539  {
540  self._eyeglow_fx_override = level._effect["player_eye_glow_orng"];
541  }
542 
543  if( !IsDemoPlaying() )
544  ‪zombie_eyes_clientfield_cb(localClientNum, false, ‪IS_TRUE(self.zombie_face), bNewEnt, bInitialSnap, fieldName, bWasTimeJump);
545  else
546  ‪zombie_eyes_demo_clientfield_cb(localClientNum, false, ‪IS_TRUE(self.zombie_face), bNewEnt, bInitialSnap, fieldName, bWasTimeJump);
547  }
548 }
549 
550 function ‪zombie_eyes_handle_demo_jump( localClientNum )
551 {
552  self endon( "entityshutdown" );
553  self endon( "death_or_disconnect" );
554  self endon( "new_zombie_eye_cb" );
555 
556  while( true )
557  {
558  level ‪util::waittill_any( "demo_jump", "demo_player_switch" );
559 
560  self ‪deleteZombieEyes(localClientNum);
561  self mapshaderconstant( localClientNum, 0, "scriptVector2", 0, ‪get_eyeball_off_luminance(), self ‪get_eyeball_color() );
562  self.eyes_spawned = false;
563  }
564 }
565 
566 function ‪zombie_eyes_demo_watcher( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
567 {
568  self endon( "entityshutdown" );
569  self endon( "death_or_disconnect" );
570  self endon( "new_zombie_eye_cb" );
571 
572  self thread ‪zombie_eyes_handle_demo_jump( localClientNum );
573 
574  if( newVal )
575  {
576  while( true )
577  {
578  if( !self IsLocalPlayer() || IsSpectating( localClientNum, true ) || localClientNum != self GetLocalClientNumber() )
579  {
580  if( !‪IS_TRUE( self.eyes_spawned ) )
581  {
582  self ‪createZombieEyes( localClientNum );
583  self mapshaderconstant( localClientNum, 0, "scriptVector2", 0, ‪get_eyeball_on_luminance(), self ‪get_eyeball_color() );
584  self.eyes_spawned = true;
585  }
586  }
587  else
588  {
589  if( ‪IS_TRUE( self.eyes_spawned ) )
590  {
591  self ‪deleteZombieEyes(localClientNum);
592  self mapshaderconstant( localClientNum, 0, "scriptVector2", 0, ‪get_eyeball_off_luminance(), self ‪get_eyeball_color() );
593  self.eyes_spawned = false;
594  }
595  }
596 
597  wait( 0.016 );
598  }
599  }
600  else
601  {
602  self ‪deleteZombieEyes(localClientNum);
603  self mapshaderconstant( localClientNum, 0, "scriptVector2", 0, ‪get_eyeball_off_luminance(), self ‪get_eyeball_color() );
604  self.eyes_spawned = false;
605  }
606 }
607 
608 function ‪zombie_eyes_demo_clientfield_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
609 {
610  self notify( "new_zombie_eye_cb" );
611  self thread ‪zombie_eyes_demo_watcher(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump);
612 }
613 
614 function ‪zombie_eyes_clientfield_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump) // self = actor
615 {
616  if(!IsDefined(newVal))
617  {
618  return;
619  }
620 
621  if(newVal)
622  {
623  self ‪createZombieEyes( localClientNum );
624  self mapshaderconstant( localClientNum, 0, "scriptVector2", 0, ‪get_eyeball_on_luminance(), self ‪get_eyeball_color() );
625  }
626  else
627  {
628  self ‪deleteZombieEyes(localClientNum);
629  self mapshaderconstant( localClientNum, 0, "scriptVector2", 0, ‪get_eyeball_off_luminance(), self ‪get_eyeball_color() );
630  }
631 
632  // optional callback for handling zombie eyes
633  if ( IsDefined( level.zombie_eyes_clientfield_cb_additional ) )
634  {
635  self [[ level.zombie_eyes_clientfield_cb_additional ]]( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump );
636  }
637 }
638 
639 function ‪zombie_zombie_keyline_render_clientfield_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump) // self = actor
640 {
641  if(!IsDefined(newVal))
642  {
643  return;
644  }
645 
646  if( ‪IS_TRUE(level.debug_keyline_zombies) )
647  {
648  if( newVal )
649  {
650  self ‪duplicate_render::set_dr_flag( "keyline_active", 1 );
651  self ‪duplicate_render::update_dr_filters(localClientNum);
652  }
653  else
654  {
655  self ‪duplicate_render::set_dr_flag( "keyline_active", 0 );
656  self ‪duplicate_render::update_dr_filters(localClientNum);
657  }
658  }
659 }
660 
662 {
663  if( IsDefined( level.eyeball_on_luminance_override ) )
664  {
665  return level.eyeball_on_luminance_override;
666  }
667 
668  return 1;
669 }
670 
672 {
673  if( IsDefined( level.eyeball_off_luminance_override ) )
674  {
675  return level.eyeball_off_luminance_override;
676  }
677 
678  return 0;
679 }
680 
681 function ‪get_eyeball_color() // self = zombie
682 {
683  val = 0;
684 
685  if ( IsDefined( level.zombie_eyeball_color_override ) )
686  {
687  val = level.zombie_eyeball_color_override;
688  }
689 
690  if ( IsDefined( self.zombie_eyeball_color_override ) )
691  {
692  val = self.zombie_eyeball_color_override;
693  }
694 
695  return val;
696 }
697 
698 function ‪zombie_ragdoll_explode_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
699 {
700  if(newVal)
701  {
702  self ‪zombie_wait_explode( localClientNum );
703  }
704 }
705 
706 function ‪zombie_gut_explosion_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
707 {
708  if(newVal)
709  {
710  if(isdefined(level._effect["zombie_guts_explosion"]))
711  {
712  org = self GetTagOrigin("J_SpineLower");
713 
714  if(isdefined(org))
715  {
716  playfx( localClientNum, level._effect["zombie_guts_explosion"], org );
717  }
718  }
719  }
720 }
721 
723 {
724  level._effect["zombie_guts_explosion"] = "zombie/fx_blood_torso_explo_lg_zmb";
725 }
726 
727 
728 function ‪zombie_wait_explode( localClientNum )
729 {
730  where = self GetTagOrigin( "J_SpineLower" );
731  if (!isdefined(where))
732  where = self.origin;
733 
734  start = GetTime();
735  while ( GetTime() - start < 2000 )
736  {
737  if (isdefined(self))
738  {
739  where = self GetTagOrigin( "J_SpineLower" );
740  if (!isdefined(where))
741  where = self.origin;
742  }
743  wait 0.05;
744  }
745 
746  if ( IsDefined( level._effect[ "zombie_guts_explosion" ] ) && ‪util::is_mature() )
747  {
748  Playfx( localClientNum, level._effect["zombie_guts_explosion"], where );
749  }
750 
751 }
752 
753 function ‪mark_piece_gibbed( piece_index )
754 {
755  if ( !isdefined( self.gibbed_pieces ) )
756  {
757  self.gibbed_pieces = [];
758  }
759 
760  self.gibbed_pieces[self.gibbed_pieces.size] = piece_index;
761 }
762 
763 
764 function ‪has_gibbed_piece( piece_index )
765 {
766  if ( !isdefined( self.gibbed_pieces ) )
767  {
768  return false;
769  }
770 
771  for ( i = 0; i < self.gibbed_pieces.size; i++ )
772  {
773  if ( self.gibbed_pieces[i] == piece_index )
774  {
775  return true;
776  }
777  }
778 
779  return false;
780 }
781 
782 
784 {
785  fxTag = "j_neck";
786  fxOrigin = self GetTagOrigin( fxTag );
787  upVec = AnglesToUp( self GetTagAngles( fxTag ) );
788  forwardVec = AnglesToForward( self GetTagAngles( fxTag ) );
789 
790  players = level.localPlayers;
791 
792  for ( i = 0; i < players.size; i++ )
793  {
794  // main head pop fx
795  PlayFX( i, level._effect["headshot"], fxOrigin, forwardVec, upVec );
796  PlayFX( i, level._effect["headshot_nochunks"], fxOrigin, forwardVec, upVec );
797  }
798 
799  PlaySound( 0, "zmb_zombie_head_gib", fxOrigin ); // Brought over from _zm_spawner.gsc by DSL 03/15/13
800 
801  wait( 0.3 );
802  if ( IsDefined( self ) )
803  {
804  players = level.localPlayers;
805 
806  for ( i = 0; i < players.size; i++ )
807  {
808  PlayFxOnTag( i, level._effect["bloodspurt"], self, fxTag );
809  }
810  }
811 }
812 
813 function ‪do_gib_fx( tag )
814 {
815  players = level.localPlayers;
816 
817  for ( i = 0; i < players.size; i++ )
818  {
819  PlayFxOnTag( i, level._effect["animscript_gib_fx"], self, tag );
820  }
821  PlaySound( 0, "zmb_death_gibs", self gettagorigin( tag ) );
822 }
823 
824 
825 function ‪do_gib( model, tag )
826 {
827  //PrintLn( "*** Generating gib " + model + " from tag " + tag );
828 
829  start_pos = self gettagorigin( tag );
830  start_angles = self gettagangles(tag);
831 
832  wait( 0.016 );
833 
834  end_pos = undefined;
835  angles = undefined;
836 
837  if(!IsDefined(self))
838  {
839  end_pos = start_pos + (AnglesToForward(start_angles) * 10);
840  angles = start_angles;
841  }
842  else
843  {
844  end_pos = self gettagorigin( tag );
845  angles = self gettagangles(tag);
846  }
847 
848  if ( IsDefined( self._gib_vel ) )
849  {
850  forward = self._gib_vel;
851  self._gib_vel = undefined;
852  }
853  else
854  {
855  forward = VectorNormalize( end_pos - start_pos );
856  forward *= RandomFloatRange( 0.6, 1.0 );
857  forward += (0, 0, RandomFloatRange( 0.4, 0.7 ));
858 // forward *= 2.0;
859  }
860 
861  CreateDynEntAndLaunch( 0, model, end_pos, angles, start_pos, forward, level._effect["animscript_gibtrail_fx"], 1 );
862 
863  if(IsDefined(self))
864  {
865  self ‪do_gib_fx( tag );
866  }
867  else
868  {
869  PlaySound( 0, "zmb_death_gibs", end_pos);
870  }
871 }
872 
873 // hat gibs look better when they pop off almost straight up
874 function ‪do_hat_gib( model, tag )
875 {
876  //PrintLn( "*** Generating gib " + model + " from tag " + tag );
877 
878  start_pos = self gettagorigin( tag );
879  start_angles = self gettagangles( tag );
880  up_angles = (0, 0, 1);
881 
882  force = (0, 0, RandomFloatRange( 1.4, 1.7 ));
883 
884  CreateDynEntAndLaunch( 0, model, start_pos, up_angles, start_pos, force );
885 }
886 
888 {
889  if( level.gibCount<=level.gibMaxCount )
890  {
891  return true;
892  }
893  return false;
894 }
895 
897 {
898  self endon( "disconnect" );
899 
900  while(1)
901  {
902  wait( level.gibResetTime );
903  level.gibTimer = 0;
904  level.gibCount = 0;
905  }
906 }
907 
908 function ‪on_gib_event( localClientNum, type, locations )
909 {
910  if ( localClientNum != 0 )
911  {
912  return;
913  }
914 
915  if( !‪util::is_mature() )
916  {
917  return;
918  }
919 
920  if ( !isDefined( self._gib_def ) )
921  {
922  return;
923  }
924 
925  if ( IsDefined( level._gib_overload_func ) )
926  {
927  if ( self [[level._gib_overload_func]]( type, locations ) )
928  {
929  return; // if overload func returns true - do more more processing.
930  }
931  }
932 
933  if( !‪check_should_gib() )
934  {
935  return;
936  }
937  level.gibCount++;
938 
939  for ( i = 0; i < locations.size; i++ )
940  {
941  // only the head can gib after already gibbing
942  if ( IsDefined( self.gibbed ) && level._ZOMBIE_GIB_PIECE_INDEX_HEAD != locations[i] )
943  {
944  continue;
945  }
946 
947  switch( locations[i] )
948  {
949  case 0: // level._ZOMBIE_GIB_PIECE_INDEX_ALL
950  if ( IsDefined( self._gib_def.gibSpawn1 ) && IsDefined( self._gib_def.gibSpawnTag1 ) )
951  {
952  self thread ‪do_gib( self._gib_def.gibSpawn1, self._gib_def.gibSpawnTag1 );
953  }
954  if ( IsDefined( self._gib_def.gibSpawn2 ) && IsDefined( self._gib_def.gibSpawnTag2 ) )
955  {
956  self thread ‪do_gib( self._gib_def.gibSpawn2, self._gib_def.gibSpawnTag2 );
957  }
958  if ( IsDefined( self._gib_def.gibSpawn3 ) && IsDefined( self._gib_def.gibSpawnTag3 ) )
959  {
960  self thread ‪do_gib( self._gib_def.gibSpawn3, self._gib_def.gibSpawnTag3 );
961  }
962  if ( IsDefined( self._gib_def.gibSpawn4 ) && IsDefined( self._gib_def.gibSpawnTag4 ) )
963  {
964  self thread ‪do_gib( self._gib_def.gibSpawn4, self._gib_def.gibSpawnTag4 );
965  }
966  if ( IsDefined( self._gib_def.gibSpawn5 ) && IsDefined( self._gib_def.gibSpawnTag5 ) )
967  {
968  self thread ‪do_hat_gib( self._gib_def.gibSpawn5, self._gib_def.gibSpawnTag5 );
969  }
970 
971  self thread ‪do_headshot_gib_fx(); // head
972  self thread ‪do_gib_fx( "J_SpineLower" ); //guts
973 
974  ‪mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM );
975  ‪mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM );
976  ‪mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG );
977  ‪mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG );
978  ‪mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_HEAD );
979  ‪mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_HAT );
980  break;
981 
982  case 1: // level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM
983  if ( IsDefined( self._gib_def.gibSpawn1 ) && IsDefined( self._gib_def.gibSpawnTag1 ) )
984  {
985  self thread ‪do_gib( self._gib_def.gibSpawn1, self._gib_def.gibSpawnTag1 );
986  }
987  else
988  {
989  if ( !IsDefined( self._gib_def.gibSpawn1 ) )
990  {
991  }
992  if ( !IsDefined( self._gib_def.gibSpawnTag1 ) )
993  {
994  }
995  }
996 
997  ‪mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM );
998  break;
999 
1000  case 2: // level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM
1001  if ( IsDefined( self._gib_def.gibSpawn2 ) && IsDefined(self._gib_def.gibSpawnTag2 ) )
1002  {
1003  self thread ‪do_gib( self._gib_def.gibSpawn2, self._gib_def.gibSpawnTag2 );
1004  }
1005  else
1006  {
1007  if ( !IsDefined( self._gib_def.gibSpawn2 ) )
1008  {
1009  }
1010  if ( !IsDefined( self._gib_def.gibSpawnTag2 ) )
1011  {
1012  }
1013  }
1014 
1015  ‪mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM );
1016  break;
1017 
1018  case 3: // level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG
1019  if ( IsDefined( self._gib_def.gibSpawn3 ) && IsDefined( self._gib_def.gibSpawnTag3 ) )
1020  {
1021  self thread ‪do_gib( self._gib_def.gibSpawn3, self._gib_def.gibSpawnTag3 );
1022  }
1023 
1024  ‪mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG );
1025  break;
1026 
1027  case 4: // level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG
1028  if ( IsDefined( self._gib_def.gibSpawn4 ) && IsDefined( self._gib_def.gibSpawnTag4 ) )
1029  {
1030  self thread ‪do_gib( self._gib_def.gibSpawn4, self._gib_def.gibSpawnTag4 );
1031  }
1032 
1033  ‪mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG );
1034  break;
1035 
1036  case 5: // level._ZOMBIE_GIB_PIECE_INDEX_HEAD, fx only
1037  self thread ‪do_headshot_gib_fx();
1038 
1039  ‪mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_HEAD );
1040  break;
1041 
1042  case 6: // level._ZOMBIE_GIB_PIECE_INDEX_GUTS, fx only
1043  self thread ‪do_gib_fx( "J_SpineLower" );
1044  break;
1045 
1046  case 7: // level._ZOMBIE_GIB_PIECE_INDEX_HAT, hat launch only, no fx
1047  if ( IsDefined( self._gib_def.gibSpawn5 ) && IsDefined( self._gib_def.gibSpawnTag5 ) )
1048  {
1049  self thread ‪do_hat_gib( self._gib_def.gibSpawn5, self._gib_def.gibSpawnTag5 );
1050  }
1051 
1052  ‪mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_HAT );
1053  break;
1054  }
1055  }
1056 
1057  self.gibbed = true;
1058 }
1059 
1060 
1061 // ww: function stores the vision set passed in and then applies it to the local player the function is threaded
1062 // on. visionsets will be set up in a priority queue, whichever is the highest scoring vision set will be applied
1063 // priorities should not go over ten! ten is only reserved for sets that must trump any and all (e.g. black hole bomb )
1064 // SELF == PLAYER
1065 function ‪zombie_vision_set_apply( str_visionset, int_priority, flt_transition_time, int_clientnum )
1066 {
1067  self endon( "death" );
1068  self endon( "disconnect" );
1069 
1070  // make sure the vision set list is on the player
1071  if( !IsDefined( self._zombie_visionset_list ) )
1072  {
1073  // if not create it
1074  self._zombie_visionset_list = [];
1075  }
1076 
1077  // make sure the variables passed in are valid
1078  if( !IsDefined( str_visionset ) || !IsDefined( int_priority ) )
1079  {
1080  return;
1081  }
1082 
1083  // default flt_transition_time
1084  if( !IsDefined( flt_transition_time ) )
1085  {
1086  flt_transition_time = 1;
1087  }
1088 
1089  if( !IsDefined( int_clientnum ) )
1090  {
1091  if ( self IsLocalPlayer() )
1092  {
1093  int_clientnum = self GetLocalClientNumber();
1094  }
1095 
1096  if(!IsDefined(int_clientnum))
1097  {
1098  return; // GetLocalClientNumber fails for spectators - get out.
1099  }
1100  }
1101 
1102  // make sure there isn't already one of the vision set in the array
1103  already_in_array = false;
1104 
1105  // if the array already has items in it check for duplictes
1106  if( self._zombie_visionset_list.size != 0 )
1107  {
1108  for( i = 0; i < self._zombie_visionset_list.size; i++ )
1109  {
1110  if( IsDefined( self._zombie_visionset_list[i].vision_set ) && self._zombie_visionset_list[i].vision_set == str_visionset )
1111  {
1112  already_in_array = true;
1113 
1114  // if the priority is different change it and
1115  if( self._zombie_visionset_list[i].priority != int_priority )
1116  {
1117  // reset the priority based on the new int_priority
1118  self._zombie_visionset_list[i].priority = int_priority;
1119  }
1120 
1121  break;
1122 
1123  }
1124 
1125  // check to see if there is a visionset with this priority
1126  }
1127  }
1128 
1129 
1130  // if it isn't in the array add it
1131  if( !already_in_array )
1132  {
1133  // add the new vision set to the array
1134  temp_struct = spawnStruct();
1135  temp_struct.vision_set = str_visionset;
1136  temp_struct.priority = int_priority;
1137  ‪array::add( self._zombie_visionset_list, temp_struct, false );
1138  }
1139 
1140  // now go through the player's list and find the one with highest priority
1141  vision_to_set = self ‪zombie_highest_vision_set_apply();
1142 
1143  if( IsDefined( vision_to_set ) )
1144  {
1145  // now you have the highest scoring vision set, apply to player
1146  VisionSetNaked( int_clientnum, vision_to_set, flt_transition_time );
1147  }
1148  else
1149  {
1150  // now you have the highest scoring vision set, apply to player
1151  VisionSetNaked( int_clientnum, "undefined", flt_transition_time );
1152  }
1153 
1154 }
1155 
1156 // ww: removes the vision set from the vision set array, goes through the array and sets the next highest priority
1157 // SELF == PLAYER
1158 function ‪zombie_vision_set_remove( str_visionset, flt_transition_time, int_clientnum )
1159 {
1160  self endon( "death" );
1161  self endon( "disconnect" );
1162 
1163  // make sure hte vision set is passed in
1164  if( !IsDefined( str_visionset ) )
1165  {
1166  return;
1167  }
1168 
1169  // default transition time
1170  if( !IsDefined( flt_transition_time ) )
1171  {
1172  flt_transition_time = 1;
1173  }
1174 
1175  // can't call this before the array has been set up through apply
1176  if( !IsDefined( self._zombie_visionset_list ) )
1177  {
1178  self._zombie_visionset_list = [];
1179  }
1180 
1181  // get the player's client number if it wasn't passed in
1182  if( !IsDefined( int_clientnum ) )
1183  {
1184  if ( self IsLocalPlayer() )
1185  {
1186  int_clientnum = self GetLocalClientNumber();
1187  }
1188 
1189  if(!IsDefined(int_clientnum))
1190  {
1191  return; // GetLocalClientNumber fails for spectators - get out.
1192  }
1193  }
1194 
1195  // remove the vision set from the array
1196  temp_struct = undefined;
1197  for( i = 0; i < self._zombie_visionset_list.size; i++ )
1198  {
1199  if( IsDefined( self._zombie_visionset_list[i].vision_set ) && self._zombie_visionset_list[i].vision_set == str_visionset )
1200  {
1201  temp_struct = self._zombie_visionset_list[i];
1202  }
1203  }
1204 
1205  if( IsDefined( temp_struct ) )
1206  {
1207  ArrayRemoveValue( self._zombie_visionset_list, temp_struct );
1208  }
1209 
1210  // set the next highest priority
1211  vision_to_set = self ‪zombie_highest_vision_set_apply();
1212 
1213  if( IsDefined( vision_to_set ) )
1214  {
1215  // now you have the highest scoring vision set, apply to player
1216  VisionSetNaked( int_clientnum, vision_to_set, flt_transition_time );
1217  }
1218  else
1219  {
1220  // now you have the highest scoring vision set, apply to player
1221  VisionSetNaked( int_clientnum, "undefined", flt_transition_time );
1222  }
1223 }
1224 
1225 // ww: apply the highest score vision set
1227 {
1228  if( !IsDefined( self._zombie_visionset_list ) )
1229  {
1230  return;
1231  }
1232 
1233  highest_score = 0;
1234  highest_score_vision = undefined;
1235 
1236  //PrintLn( "******************************* " + self GetLocalClientNumber() + " ******************************" );
1237  //PrintLn( "******************************* " + self._zombie_visionset_list.size + " ******************************" );
1238 
1239  for( i = 0; i < self._zombie_visionset_list.size; i++ )
1240  {
1241  if( IsDefined( self._zombie_visionset_list[i].priority ) && self._zombie_visionset_list[i].priority > highest_score )
1242  {
1243  highest_score = self._zombie_visionset_list[i].priority;
1244  highest_score_vision = self._zombie_visionset_list[i].vision_set;
1245  //PrintLn( "******************************* " + self._zombie_visionset_list[i].priority + " ******************************" );
1246  //PrintLn( "******************************* " + self._zombie_visionset_list[i].vision_set + " ******************************" );
1247  }
1248  }
1249 
1250  return highest_score_vision;
1251 }
1252 
1253 function ‪handle_zombie_risers_foliage(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
1254 {
1255  level endon("demo_jump");
1256  self endon("entityshutdown");
1257 
1258  if ( !oldVal && newVal )
1259  {
1260  localPlayers = level.localPlayers;
1261  playsound(0,"zmb_zombie_spawn", self.origin); // TODO: foliage spawn sound?
1262 
1263  burst_fx = level._effect["rise_burst_foliage"];
1264  billow_fx = level._effect["rise_billow_foliage"];
1265  type = "foliage";
1266 
1267  for(i = 0; i < localPlayers.size; i ++)
1268  {
1269  self thread ‪rise_dust_fx(i,type,billow_fx,burst_fx);
1270  }
1271  }
1272 }
1273 
1274 function ‪handle_zombie_risers_water(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
1275 {
1276  level endon("demo_jump");
1277  self endon("entityshutdown");
1278 
1279  if ( !oldVal && newVal )
1280  {
1281  localPlayers = level.localPlayers;
1282  playsound(0,"zmb_zombie_spawn_water", self.origin);
1283 
1284  burst_fx = level._effect["rise_burst_water"];
1285  billow_fx = level._effect["rise_billow_water"];
1286  type = "water";
1287 
1288  for(i = 0; i < localPlayers.size; i ++)
1289  {
1290  self thread ‪rise_dust_fx(i,type,billow_fx,burst_fx);
1291  }
1292  }
1293 }
1294 
1295 
1296 function ‪handle_zombie_risers(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
1297 {
1298  level endon("demo_jump");
1299  self endon("entityshutdown");
1300 
1301  if ( !oldVal && newVal )
1302  {
1303  localPlayers = level.localPlayers;
1304 
1305  sound = "zmb_zombie_spawn";
1306  burst_fx = level._effect["rise_burst"];
1307  billow_fx = level._effect["rise_billow"];
1308  type = "dirt";
1309 
1310  if(isdefined(level.riser_type) && level.riser_type == "snow" )
1311  {
1312  sound = "zmb_zombie_spawn_snow";
1313  burst_fx = level._effect["rise_burst_snow"];
1314  billow_fx = level._effect["rise_billow_snow"];
1315  type = "snow";
1316  }
1317 
1318  playsound (0,sound, self.origin);
1319 
1320  for(i = 0; i < localPlayers.size; i ++)
1321  {
1322  self thread ‪rise_dust_fx(i,type,billow_fx,burst_fx);
1323  }
1324  }
1325 
1326 }
1327 
1328 function ‪handle_zombie_risers_lowg(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
1329 {
1330  level endon("demo_jump");
1331  self endon("entityshutdown");
1332 
1333  if ( !oldVal && newVal )
1334  {
1335  localPlayers = level.localPlayers;
1336 
1337  sound = "zmb_zombie_spawn";
1338  burst_fx = level._effect["rise_burst_lg"];
1339  billow_fx = level._effect["rise_billow_lg"];
1340  type = "dirt";
1341 
1342  if(isdefined(level.riser_type) && level.riser_type == "snow" )
1343  {
1344  sound = "zmb_zombie_spawn_snow";
1345  burst_fx = level._effect["rise_burst_snow"];
1346  billow_fx = level._effect["rise_billow_snow"];
1347  type = "snow";
1348  }
1349 
1350  playsound (0,sound, self.origin);
1351 
1352  for(i = 0; i < localPlayers.size; i ++)
1353  {
1354  self thread ‪rise_dust_fx(i,type,billow_fx,burst_fx);
1355  }
1356  }
1357 
1358 }
1359 
1360 function ‪rise_dust_fx( clientnum, type, billow_fx, burst_fx )
1361 {
1362  dust_tag = "J_SpineUpper";
1363 
1364  self endon("entityshutdown");
1365  level endon("demo_jump");
1366 
1367  if ( IsDefined( level.zombie_custom_riser_fx_handler ) )
1368  {
1369  s_info = self [[ level.zombie_custom_riser_fx_handler ]]();
1370 
1371  if ( IsDefined( s_info ) )
1372  {
1373  if ( IsDefined( s_info.burst_fx ) )
1374  {
1375  burst_fx = s_info.burst_fx;
1376  }
1377 
1378  if ( IsDefined( s_info.billow_fx ) )
1379  {
1380  billow_fx = s_info.billow_fx;
1381  }
1382 
1383  if ( IsDefined( s_info.type ) )
1384  {
1385  type = s_info.type;
1386  }
1387  }
1388  }
1389 
1390  if ( IsDefined( burst_fx ) )
1391  {
1392  playfx(clientnum,burst_fx,self.origin + ( 0,0,randomintrange(5,10) ) );
1393  }
1394 
1395  wait(.25);
1396 
1397  if ( IsDefined( billow_fx ) )
1398  {
1399  playfx(clientnum,billow_fx,self.origin + ( randomintrange(-10,10),randomintrange(-10,10),randomintrange(5,10) ) );
1400  }
1401 
1402  wait(2); //wait a bit to start playing the falling dust
1403  dust_time = 5.5; // play dust fx for a max time
1404  dust_interval = .3; //randomfloatrange(.1,.25); // wait this time in between playing the effect
1405 
1406  player = level.localPlayers[clientnum];
1407 
1408  effect = level._effect["rise_dust"];
1409 
1410  if(type == "water")
1411  {
1412  effect = level._effect["rise_dust_water"];
1413  }
1414  else if ( type == "snow")
1415  {
1416  effect = level._effect["rise_dust_snow"];
1417  }
1418  else if ( type == "foliage" )
1419  {
1420  effect = level._effect["rise_dust_foliage"];
1421  }
1422  else if ( type == "none" )
1423  {
1424  return;
1425  }
1426 
1427  for (t = 0; t < dust_time; t += dust_interval)
1428  {
1429  if (!isdefined(self))
1430  return;
1431  PlayfxOnTag(clientnum,effect, self, dust_tag);
1432  wait dust_interval;
1433  }
1434 
1435 }
1436 
1437 function ‪end_last_stand(clientNum)
1438 {
1439  self waittill("lastStandEnd");
1440 
1441  waitrealtime(0.7);
1442 
1443  playsound(clientNum, "revive_gasp");
1444 }
1445 
1446 function ‪last_stand_thread(clientNum)
1447 {
1448  self thread ‪end_last_stand(clientNum);
1449 
1450  self endon("lastStandEnd");
1451 
1452  const startVol = 0.5;
1453  const maxVol = 1.0;
1454 
1455  const startPause = 0.5;
1456  const maxPause = 2.0;
1457 
1458  ‪pause = startPause;
1459  vol = startVol;
1460 
1461  while(1)
1462  {
1463  id = playsound(clientNum, "chr_heart_beat");
1464  setSoundVolume(id, vol);
1465  //iprintlnbold( "LASTSTAND ON CLIENT " + clientNum );
1466 
1467  waitrealtime(‪pause);
1468 
1469  if(‪pause < maxPause)
1470  {
1471  ‪pause *= 1.05;
1472 
1473  if(‪pause > maxPause)
1474  {
1475  ‪pause = maxPause;
1476  }
1477  }
1478 
1479  if(vol < maxVol)
1480  {
1481  vol *= 1.05;
1482 
1483  if(vol > maxVol)
1484  {
1485  vol = maxVol;
1486  }
1487  }
1488  }
1489 }
1490 
1491 function ‪last_stand_monitor(clientNum, state, oldState)
1492 {
1493  player = level.localPlayers[clientNum];
1494  players = level.localPlayers;
1495 
1496  if(!isdefined(player))
1497  {
1498  return;
1499  }
1500 
1501  if(state == "1")
1502  {
1503  if(!level._laststand[clientNum])
1504  {
1505  if(!isdefined(level.lslooper))
1506  {
1507  level.lslooper = ‪spawn(0, player.origin, "script.origin");
1508  }
1509  player thread ‪last_stand_thread(clientNum);
1510 
1511  //Check to make sure this sound doesn't play during a splitscreen game
1512  if( players.size <= 1 )
1513  {
1514  level.lslooper playloopsound("evt_laststand_loop", 0.3);
1515  }
1516 
1517  level._laststand[clientNum] = true;
1518  }
1519  }
1520  else
1521  {
1522  if(level._laststand[clientNum])
1523  {
1524  if(isdefined(level.lslooper))
1525  {
1526  level.lslooper StopAllLoopSounds(0.7);
1527 
1528  playsound (0, "evt_laststand_in", (0,0,0));
1529  }
1530  player notify("lastStandEnd");
1531  level._laststand[clientNum] = false;
1532  }
1533  }
1534 }
1535 
1536 function ‪Laststand(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
1537 {
1538  if(newVal)
1539  {
1540  if( !( self IsPlayer() && self IsLocalPlayer() && IsDemoPlaying() ) )
1541  {
1542  self ‪duplicate_render::set_dr_flag( "keyline_ls", 1 );
1543  self ‪duplicate_render::update_dr_filters(localClientNum);
1544  }
1545  }
1546  else
1547  {
1548  self ‪duplicate_render::set_dr_flag( "keyline_ls", 0 );
1549  self ‪duplicate_render::update_dr_filters(localClientNum);
1550  }
1551  if( self IsPlayer() && self IsLocalPlayer() && !IsDemoPlaying() )
1552  {
1553  if( IsDefined(self GetLocalClientNumber()) && localClientNum == self GetLocalClientNumber() )
1554  self ‪zm_audio::sndZmbLaststand(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump);
1555  }
1556 }
1557 
1558 function ‪update_aat_hud( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
1559 {
1560  str_localized = ‪aat::get_string( newVal );
1561  icon = ‪aat::get_icon( newVal );
1562 
1563  if( str_localized == ‪AAT_RESERVED_NAME )
1564  str_localized = "";
1565 
1566  controllerModel = GetUIModelForController( localClientNum );
1567  AATModel = CreateUIModel( controllerModel, "CurrentWeapon.aat" );
1568  SetUIModelValue( AATModel, str_localized );
1569 
1570  AATIconModel = CreateUIModel( controllerModel, "CurrentWeapon.aatIcon" );
1571  SetUIModelValue( AATIconModel, icon );
1572 }
‪zombie_vision_set_remove
‪function zombie_vision_set_remove(str_visionset, flt_transition_time, int_clientnum)
Definition: _zm.csc:1158
‪zombie_highest_vision_set_apply
‪function zombie_highest_vision_set_apply()
Definition: _zm.csc:1226
‪init_riser_fx
‪function init_riser_fx()
Definition: _zm.csc:277
‪zombie_power_clientfield_on
‪function zombie_power_clientfield_on(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:390
‪game_end_time
‪function game_end_time(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:418
‪round_complete_time
‪function round_complete_time(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:406
‪player_umbrahotfixes
‪function player_umbrahotfixes(localClientNum)
Definition: _zm.csc:236
‪end_last_stand
‪function end_last_stand(clientNum)
Definition: _zm.csc:1437
‪is_mature
‪function is_mature()
Definition: util_shared.csc:1300
‪sndZmbLaststand
‪function sndZmbLaststand(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm_audio.csc:309
‪ignore
‪function ignore(str_system)
Definition: system_shared.csc:165
‪basic_player_connect
‪function basic_player_connect(localClientNum)
Definition: _zm.csc:246
‪playerFallDamageSound
‪function playerFallDamageSound(client_num, firstperson)
Definition: _zm_audio.csc:121
‪zombie_eyes_demo_watcher
‪function zombie_eyes_demo_watcher(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:566
‪ZPO_listener
‪function ZPO_listener()
Definition: _zm.csc:353
‪CF_CALLBACK_ZERO_ON_NEW_ENT
‪#define CF_CALLBACK_ZERO_ON_NEW_ENT
Definition: version.gsh:103
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪handle_zombie_risers_water
‪function handle_zombie_risers_water(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:1274
‪get_array
‪function get_array(kvp_value, kvp_key="targetname")
Definition: struct.csc:34
‪update_dr_filters
‪function update_dr_filters(localClientNum)
Definition: duplicaterender_mgr.csc:329
‪ignore_systems
‪function autoexec ignore_systems()
Definition: _zm.csc:55
‪DR_TYPE_OFFSCREEN
‪#define DR_TYPE_OFFSCREEN
Definition: duplicaterender.gsh:6
‪check_should_gib
‪function check_should_gib()
Definition: _zm.csc:887
‪quest_complete_time
‪function quest_complete_time(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:424
‪zombie_ragdoll_explode_cb
‪function zombie_ragdoll_explode_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:698
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪mark_piece_gibbed
‪function mark_piece_gibbed(piece_index)
Definition: _zm.csc:753
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪add
‪function add(entity, dyingplayer, team, timeout)
Definition: _deathicons.gsc:43
‪createZombieEyes
‪function createZombieEyes(localClientNum)
Definition: _zm.csc:475
‪update_aat_hud
‪function update_aat_hud(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:1558
‪main_end
‪function main_end()
Definition: _zm_ffotd.csc:6
‪zombie_eyes_demo_clientfield_cb
‪function zombie_eyes_demo_clientfield_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:608
‪force_update_player_clientfields
‪function force_update_player_clientfields(localClientNum)
Definition: _zm.csc:258
‪init_zombie_explode_fx
‪function init_zombie_explode_fx()
Definition: _zm.csc:722
‪last_stand_monitor
‪function last_stand_monitor(clientNum, state, oldState)
Definition: _zm.csc:1491
‪init_blocker_fx
‪function init_blocker_fx()
Definition: _zm.csc:272
‪on_spawned
‪function on_spawned(func, obj)
Definition: callbacks_shared.csc:245
‪player_eyes_clientfield_cb
‪function player_eyes_clientfield_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:493
‪DR_CULL_NEVER
‪#define DR_CULL_NEVER
Definition: duplicaterender.gsh:15
‪get_eyeball_color
‪function get_eyeball_color()
Definition: _zm.csc:681
‪resetGibCounter
‪function resetGibCounter()
Definition: _zm.csc:896
‪VERSION_TU15_FFOTD_090816_0
‪#define VERSION_TU15_FFOTD_090816_0
Definition: version.gsh:71
‪PLAYER_KEYLINE_DVAR
‪#define PLAYER_KEYLINE_DVAR
Definition: _zm.csc:198
‪handle_zombie_risers_foliage
‪function handle_zombie_risers_foliage(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:1253
‪rise_dust_fx
‪function rise_dust_fx(clientnum, type, billow_fx, burst_fx)
Definition: _zm.csc:1360
‪register_system
‪function register_system(sSysName, cbFunc)
Definition: util_shared.csc:1074
‪zombie_vision_set_apply
‪function zombie_vision_set_apply(str_visionset, int_priority, flt_transition_time, int_clientnum)
Definition: _zm.csc:1065
‪zombie_eyes_handle_demo_jump
‪function zombie_eyes_handle_demo_jump(localClientNum)
Definition: _zm.csc:550
‪PLAYER_KEYLINE_MATERIAL_LASTSTAND
‪#define PLAYER_KEYLINE_MATERIAL_LASTSTAND
Definition: _zm.csc:196
‪CF_HOST_ONLY
‪#define CF_HOST_ONLY
Definition: version.gsh:102
‪waittill_any
‪function waittill_any(str_notify1, str_notify2, str_notify3, str_notify4, str_notify5)
Definition: util_shared.csc:375
‪umbra_fix_logic
‪function umbra_fix_logic(localClientNum)
Definition: _zm_utility.csc:177
‪game_start_time
‪function game_start_time(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:430
‪zombie_gut_explosion_cb
‪function zombie_gut_explosion_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:706
‪main_start
‪function main_start()
Definition: _zm_ffotd.csc:4
‪do_gib_fx
‪function do_gib_fx(tag)
Definition: _zm.csc:813
‪get_icon
‪function get_icon(n_aat_index)
Definition: aat_shared.csc:101
‪get_eyeball_on_luminance
‪function get_eyeball_on_luminance()
Definition: _zm.csc:661
‪VERSION_SHIP_OBSOLETE
‪#define VERSION_SHIP_OBSOLETE
Definition: version.gsh:111
‪init_clientfields
‪function init_clientfields()
Definition: _zm.csc:302
‪zombie_eyes_clientfield_cb
‪function zombie_eyes_clientfield_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:614
‪PLAYER_KEYLINE_MATERIAL
‪#define PLAYER_KEYLINE_MATERIAL
Definition: _zm.csc:195
‪do_gib
‪function do_gib(model, tag)
Definition: _zm.csc:825
‪player_duplicaterender
‪function player_duplicaterender(localClientNum)
Definition: _zm.csc:217
‪Laststand
‪function Laststand(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:1536
‪get_eyeball_off_luminance
‪function get_eyeball_off_luminance()
Definition: _zm.csc:671
‪init_duplicaterender_settings
‪function init_duplicaterender_settings()
Definition: _zm.csc:203
‪deleteZombieEyes
‪function deleteZombieEyes(localClientNum)
Definition: _zm.csc:481
‪get_string
‪function get_string(n_aat_index)
Definition: aat_shared.csc:89
‪add_callback
‪function add_callback(event, func, obj)
Definition: callbacks_shared.csc:93
‪waittill_dobj
‪function waittill_dobj(localClientNum)
Definition: util_shared.csc:1117
‪delay_for_clients_then_execute
‪function delay_for_clients_then_execute(func)
Definition: _zm.csc:175
‪set_dr_filter_offscreen
‪function set_dr_filter_offscreen(name, priority, require_flags, refuse_flags, drtype1, drval1, drcull1, drtype2, drval2, drcull2, drtype3, drval3, drcull3)
Definition: duplicaterender_mgr.csc:177
‪do_hat_gib
‪function do_hat_gib(model, tag)
Definition: _zm.csc:874
‪createZombieEyesInternal
‪function createZombieEyesInternal(localClientNum)
Definition: _zm.csc:438
‪has_gibbed_piece
‪function has_gibbed_piece(piece_index)
Definition: _zm.csc:764
‪zombie_zombie_keyline_render_clientfield_cb
‪function zombie_zombie_keyline_render_clientfield_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:639
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪AAT_RESERVED_NAME
‪#define AAT_RESERVED_NAME
Definition: aat_shared.gsh:4
‪pause
‪function pause(time, n_index)
Definition: turret_shared.gsc:1193
‪on_gib_event
‪function on_gib_event(localClientNum, type, locations)
Definition: _zm.csc:908
‪zombie_power_clientfield_off
‪function zombie_power_clientfield_off(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:398
‪init
‪function init()
Definition: _zm.csc:103
‪zombie_wait_explode
‪function zombie_wait_explode(localClientNum)
Definition: _zm.csc:728
‪handle_zombie_risers
‪function handle_zombie_risers(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:1296
‪do_headshot_gib_fx
‪function do_headshot_gib_fx()
Definition: _zm.csc:783
‪set_dr_flag
‪function set_dr_flag(toset, setto=true)
Definition: duplicaterender_mgr.csc:251
‪round_complete_num
‪function round_complete_num(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:412
‪clientVoiceSetup
‪function clientVoiceSetup(localClientNum)
Definition: audio_shared.csc:111
‪SITREP_FRIENDLY_ONLY
‪#define SITREP_FRIENDLY_ONLY
Definition: _zm.csc:200
‪handle_zombie_risers_lowg
‪function handle_zombie_risers_lowg(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:1328
‪player_eye_color_clientfield_cb
‪function player_eye_color_clientfield_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm.csc:522
‪sndSetZombieContext
‪function sndSetZombieContext(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm_audio.csc:297
‪box_monitor
‪function box_monitor(clientNum, state, oldState)
Definition: _zm.csc:345
‪ZPOff_listener
‪function ZPOff_listener()
Definition: _zm.csc:372
‪last_stand_thread
‪function last_stand_thread(clientNum)
Definition: _zm.csc:1446