‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
load_shared.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\array_shared;
4 #using scripts\shared\callbacks_shared;
5 #using scripts\shared\debug_shared;
6 #using scripts\shared\flag_shared;
7 #using scripts\shared\hud_util_shared;
8 #using scripts\shared\math_shared;
9 #using scripts\shared\spawner_shared;
10 #using scripts\shared\system_shared;
11 #using scripts\shared\trigger_shared;
12 #using scripts\shared\util_shared;
13 
14 //REGISTER SHARED SYSTEMS - DO NOT REMOVE
15 #using scripts\shared\doors_shared;
16 #using scripts\shared\duplicaterender_mgr;
17 #using scripts\shared\exploder_shared;
18 #using scripts\shared\fx_shared;
19 #using scripts\shared\visionset_mgr_shared;
20 #using scripts\shared\player_shared;
21 #using scripts\shared\drown;
22 
23 #using scripts\shared\vehicles\_raps;
24 
25 #insert scripts\shared\shared.gsh;
26 
27 #namespace load;
28 
29 ‪REGISTER_SYSTEM( "load", &‪__init__, undefined )
30 
31 function autoexec ‪first_frame()
32 {
33  level.first_frame = true;
35  level.first_frame = undefined;
36 }
37 
38 function ‪__init__()
39 {
40  if ( SessionModeIsCampaignGame() )
41  {
42  level.game_mode_suffix = "_cp";
43  }
44  else if ( SessionModeIsZombiesGame() )
45  {
46  level.game_mode_suffix = "_zm";
47  }
48  else
49  {
50  level.game_mode_suffix = "_mp";
51  }
52 
53  level.script = Tolower( GetDvarString( "mapname" ) );
54 
55  level.clientscripts = ( GetDvarString( "cg_usingClientScripts") != "" );
56 
57  level.campaign = "american"; // TODO T7: some scripts are using this but this should probably go away
58 
59  //TODO T7 remove level.clientscripts init in MP/ZM once they get a T7 pass
60  level.clientscripts = ( GetDvarString( "cg_usingClientScripts" ) != "" );
61 
62  level ‪flag::init( "all_players_connected" );
63  level ‪flag::init( "all_players_spawned" );
64  level ‪flag::init( "first_player_spawned" );
65 
66  ‪DEFAULT( level.timeofday, "day" ); // time of day, used for client side night specific FX
67 
68  if ( GetDvarString( "scr_RequiredMapAspectratio" ) == "" )
69  {
70  SetDvar( "scr_RequiredMapAspectratio", "1" );
71  }
72 
73  // AE 10-29-09: added this to turn off the water fog
74  SetDvar( "r_waterFogTest", 0 );
75  SetDvar( "tu6_player_shallowWaterHeight", "0.0" );
76 
77  ‪util::registerClientSys( "levelNotify" ); // register client system for ClientNotify
78 
79  level thread ‪all_players_spawned();
80 
81  level thread ‪keep_time();
82  level thread ‪count_network_frames();
83 
85 
86  self thread ‪playerDamageRumble();
87 
88  array::thread_all( GetEntArray( "water", "targetname" ), &‪water_think );
89  array::thread_all_ents( GetEntArray( "badplace", "targetname" ), &‪badplace_think );
90 
93  ‪link_ents();
94 }
95 
97 {
98  level.network_frame = 0;
99 
100  while ( true )
101  {
103  level.network_frame++;
104  }
105 }
106 
107 function ‪keep_time()
108 {
109  while ( true )
110  {
111  level.time = GetTime();
113  }
114 }
115 
116 function ‪weapon_ammo()
117 {
118  ents = GetEntArray();
119  for( i = 0; i < ents.size; i ++ )
120  {
121  if( ( isdefined( ents[i].classname ) ) &&( GetSubStr( ents[i].classname, 0, 7 ) == "weapon_" ) )
122  {
123  weap = ents[i];
124  ‪change_ammo = false;
125  clip = undefined;
126  extra = undefined;
127 
128  if( isdefined( weap.script_ammo_clip ) )
129  {
130  clip = weap.script_ammo_clip;
131  ‪change_ammo = true;
132  }
133 
134  if( isdefined( weap.script_ammo_extra ) )
135  {
136  extra = weap.script_ammo_extra;
137  ‪change_ammo = true;
138  }
139 
140  if( ‪change_ammo )
141  {
142  if( !isdefined( clip ) )
143  {
144  assertmsg( "weapon: " + weap.classname + " " + weap.origin + " sets script_ammo_extra but not script_ammo_clip" );
145  }
146 
147  if( !isdefined( extra ) )
148  {
149  assertmsg( "weapon: " + weap.classname + " " + weap.origin + " sets script_ammo_clip but not script_ammo_extra" );
150  }
151  weap ItemWeaponSetAmmo( clip, extra );
152  weap ItemWeaponSetAmmo( clip, extra, 1 );
153 
154  }
155  }
156  }
157 }
158 
159 function ‪badplace_think( badplace )
160 {
161  if( !isdefined( level.badPlaces ) )
162  {
163  level.badPlaces = 0;
164  }
165 
166  level.badPlaces++;
167 
168  badplace_box( "badplace" + level.badPlaces, -1, badplace.origin, badplace.radius, "all" );
169 }
170 
172 {
173  while( true )
174  {
175  self waittill( "damage", amount );
176 
177  if( isdefined( self.specialDamage ) )
178  {
179  continue;
180  }
181 
182  self PlayRumbleOnEntity( "damage_heavy" );
183  }
184 }
185 
187 {
188  return ‪IS_TRUE( level.early_level[level.script] );
189 }
190 
192 {
193  self endon( "death" );
194  self endon( "disconnect" );
195 
196  self.lastgrenadetime = 0;
197 
198  while( 1 )
199  {
200  while( ! self IsThroWingGrenade() )
201  {
202  wait( .05 );
203  }
204 
205  self.lastgrenadetime = GetTime();
206 
207  while( self IsThroWingGrenade() )
208  {
209  wait( .05 );
210  }
211  }
212 }
213 
214 // SUMEET_TODO - Next project clean up this function and make it modular
216 {
217  self endon( "disconnect" );
218 
219  self thread ‪player_throwgrenade_timer(); // this thread used in coop also
220 
221  if( isSplitScreen() || ‪util::coopGame() )
222  {
223  return;
224  }
225 
226  // added an inflicter check
227  self waittill( "death", attacker, cause, weapon, inflicter ); // TODO: fix the callback params here if this function is ever called again; see other script files
228 
229  if( cause != "MOD_GAS" && cause != "MOD_GRENADE" && cause != "MOD_GRENADE_SPLASH" && cause != "MOD_SUICIDE" && cause != "MOD_EXPLOSIVE" && cause != "MOD_PROJECTILE" && cause != "MOD_PROJECTILE_SPLASH" )
230  {
231  return;
232  }
233 
234  // On hardened/veteran difficulty, we only show hints on first couple of levels
235  if ( level.gameskill >= 2 )
236  {
238  return;
239  }
240 
241  if( cause == "MOD_EXPLOSIVE" )
242  {
243  // script_vehicle death hint/ also if the script is just manually a model swap instead of script vehicle
244  if( isdefined( attacker ) && ( attacker.classname == "script_vehicle" || isdefined( attacker.create_fake_vehicle_damage ) ) )
245  {
246  level notify( "new_quote_string" );
247 
248  // You were killed by an exploding vehicle. Vehicles on fire are likely to explode.
249  SetDvar( "ui_deadquote", "@SCRIPT_EXPLODING_VEHICLE_DEATH" );
251  return;
252  }
253 
254 
255 
256  // Destructible explosion death hints
257  if( isdefined( inflicter ) && isdefined( inflicter.destructibledef ) )
258  {
259  // Destructible Barrel
260  if( IsSubStr( inflicter.destructibledef, "barrel_explosive" ) )
261  {
262  level notify( "new_quote_string" );
263 
264  // You were killed by an exploding barrel. Red barrels will explode when shot.
265  SetDvar( "ui_deadquote", "@SCRIPT_EXPLODING_BARREL_DEATH" );
266  // thread special_death_indicator_hudelement( "hud_burningbarrelicon", 64, 64 );
267  return;
268  }
269 
270  // Destructible car
271  if( isdefined( inflicter.destructiblecar ) && inflicter.destructiblecar )
272  {
273  level notify( "new_quote_string" );
274 
275  // You were killed by an exploding vehicle. Vehicles on fire are likely to explode.
276  SetDvar( "ui_deadquote", "@SCRIPT_EXPLODING_VEHICLE_DEATH" );
278  return;
279  }
280 
281  }
282  }
283 
284  if( cause == "MOD_GRENADE" || cause == "MOD_GRENADE_SPLASH" )
285  {
286  if( !weapon.isTimedDetonation || !weapon.isGrenadeWeapon )
287  {
288  return;
289  }
290 
291  level notify( "new_quote_string" );
292 
293  if (weapon.name == "explosive_bolt" )
294  {
295  //You were killed by an explosive bolt.
296  SetDvar( "ui_deadquote", "@SCRIPT_EXPLOSIVE_BOLT_DEATH" );
298  }
299  else
300  {
301  //You were killed by a grenade. Watch out for the grenade danger indicator.
302  SetDvar( "ui_deadquote", "@SCRIPT_GRENADE_DEATH" );
304  }
305 
306  return;
307  }
308 }
309 
310 function ‪grenade_death_text_hudelement( textLine1, textLine2 )
311 {
312  self.failingMission = true;
313 
314  SetDvar( "ui_deadquote", "" );
315 
316  wait( .5 );
317 
318  fontElem = NewHudElem();
319  fontElem.elemType = "font";
320  fontElem.font = "default";
321  fontElem.fontscale = 1.5;
322  fontElem.x = 0;
323  fontElem.y = -60;
324 
325  fontElem.alignX = "center";
326  fontElem.alignY = "middle";
327  fontElem.horzAlign = "center";
328  fontElem.vertAlign = "middle";
329  fontElem SetText( textLine1 );
330  fontElem.foreground = true;
331  fontElem.alpha = 0;
332  fontElem FadeOverTime( 1 );
333  fontElem.alpha = 1;
334  fontElem.hidewheninmenu = true;
335 
336  if( isdefined( textLine2 ) )
337  {
338  fontElem = NewHudElem();
339  fontElem.elemType = "font";
340  fontElem.font = "default";
341  fontElem.fontscale = 1.5;
342  fontElem.x = 0;
343  fontElem.y = -60 + level.fontHeight * fontElem.fontscale;
344 
345  fontElem.alignX = "center";
346  fontElem.alignY = "middle";
347  fontElem.horzAlign = "center";
348  fontElem.vertAlign = "middle";
349  fontElem SetText( textLine2 );
350  fontElem.foreground = true;
351  fontElem.alpha = 0;
352  fontElem FadeOverTime( 1 );
353  fontElem.alpha = 1;
354  fontElem.hidewheninmenu = true;
355 
356  }
357 }
358 
360 {
361  self endon( "disconnect" );
362  wait( .5 );
363  overlayIcon = NewClientHudElem( self );
364  overlayIcon.x = 0;
365  overlayIcon.y = 68;
366  overlayIcon SetShader( "hud_grenadeicon_256", 50, 50 );
367  overlayIcon.alignX = "center";
368  overlayIcon.alignY = "middle";
369  overlayIcon.horzAlign = "center";
370  overlayIcon.vertAlign = "middle";
371  overlayIcon.foreground = true;
372  overlayIcon.alpha = 0;
373  overlayIcon FadeOverTime( 1 );
374  overlayIcon.alpha = 1;
375  overlayIcon.hidewheninmenu = true;
376 
377  overlayPointer = NewClientHudElem( self );
378  overlayPointer.x = 0;
379  overlayPointer.y = 25;
380  overlayPointer SetShader( "hud_grenadepointer", 50, 25 );
381  overlayPointer.alignX = "center";
382  overlayPointer.alignY = "middle";
383  overlayPointer.horzAlign = "center";
384  overlayPointer.vertAlign = "middle";
385  overlayPointer.foreground = true;
386  overlayPointer.alpha = 0;
387  overlayPointer FadeOverTime( 1 );
388  overlayPointer.alpha = 1;
389  overlayPointer.hidewheninmenu = true;
390 
391  self thread ‪grenade_death_indicator_hudelement_cleanup( overlayIcon, overlayPointer );
392 }
393 
394 
396 {
397  self endon( "disconnect" );
398  wait( .5 );
399  overlayIcon = NewClientHudElem( self );
400  overlayIcon.x = 0;
401  overlayIcon.y = 68;
402  overlayIcon SetShader( "hud_explosive_arrow_icon", 50, 50 );
403  overlayIcon.alignX = "center";
404  overlayIcon.alignY = "middle";
405  overlayIcon.horzAlign = "center";
406  overlayIcon.vertAlign = "middle";
407  overlayIcon.foreground = true;
408  overlayIcon.alpha = 0;
409  overlayIcon FadeOverTime( 1 );
410  overlayIcon.alpha = 1;
411  overlayIcon.hidewheninmenu = true;
412 
413  overlayPointer = NewClientHudElem( self );
414  overlayPointer.x = 0;
415  overlayPointer.y = 25;
416  overlayPointer SetShader( "hud_grenadepointer", 50, 25 );
417  overlayPointer.alignX = "center";
418  overlayPointer.alignY = "middle";
419  overlayPointer.horzAlign = "center";
420  overlayPointer.vertAlign = "middle";
421  overlayPointer.foreground = true;
422  overlayPointer.alpha = 0;
423  overlayPointer FadeOverTime( 1 );
424  overlayPointer.alpha = 1;
425  overlayPointer.hidewheninmenu = true;
426 
427  self thread ‪grenade_death_indicator_hudelement_cleanup( overlayIcon, overlayPointer );
428 }
429 
431 {
432  self endon( "disconnect" );
433  wait( .5 );
434  overlayIcon = NewClientHudElem( self );
435  overlayIcon.x = 0;
436  overlayIcon.y = 68;
437  overlayIcon SetShader( "hud_monsoon_titus_arrow", 50, 50 );
438  overlayIcon.alignX = "center";
439  overlayIcon.alignY = "middle";
440  overlayIcon.horzAlign = "center";
441  overlayIcon.vertAlign = "middle";
442  overlayIcon.foreground = true;
443  overlayIcon.alpha = 0;
444  overlayIcon FadeOverTime( 1 );
445  overlayIcon.alpha = 1;
446  overlayIcon.hidewheninmenu = true;
447 
448  overlayPointer = NewClientHudElem( self );
449  overlayPointer.x = 0;
450  overlayPointer.y = 25;
451  overlayPointer SetShader( "hud_grenadepointer", 50, 25 );
452  overlayPointer.alignX = "center";
453  overlayPointer.alignY = "middle";
454  overlayPointer.horzAlign = "center";
455  overlayPointer.vertAlign = "middle";
456  overlayPointer.foreground = true;
457  overlayPointer.alpha = 0;
458  overlayPointer FadeOverTime( 1 );
459  overlayPointer.alpha = 1;
460  overlayPointer.hidewheninmenu = true;
461 
462  self thread ‪grenade_death_indicator_hudelement_cleanup( overlayIcon, overlayPointer );
463 }
464 
466 {
467  self endon( "disconnect" );
468  wait( .5 );
469  overlayIcon = NewClientHudElem( self );
470  overlayIcon.x = 0;
471  overlayIcon.y = 68;
472  overlayIcon SetShader( "hud_monsoon_nitrogen_barrel", 50, 50 );
473  overlayIcon.alignX = "center";
474  overlayIcon.alignY = "middle";
475  overlayIcon.horzAlign = "center";
476  overlayIcon.vertAlign = "middle";
477  overlayIcon.foreground = true;
478  overlayIcon.alpha = 0;
479  overlayIcon FadeOverTime( 1 );
480  overlayIcon.alpha = 1;
481  overlayIcon.hidewheninmenu = true;
482 
483  overlayPointer = NewClientHudElem( self );
484  overlayPointer.x = 0;
485  overlayPointer.y = 25;
486  overlayPointer SetShader( "hud_grenadepointer", 50, 25 );
487  overlayPointer.alignX = "center";
488  overlayPointer.alignY = "middle";
489  overlayPointer.horzAlign = "center";
490  overlayPointer.vertAlign = "middle";
491  overlayPointer.foreground = true;
492  overlayPointer.alpha = 0;
493  overlayPointer FadeOverTime( 1 );
494  overlayPointer.alpha = 1;
495  overlayPointer.hidewheninmenu = true;
496 
497  self thread ‪grenade_death_indicator_hudelement_cleanup( overlayIcon, overlayPointer );
498 }
499 
501 {
502  self endon( "disconnect" );
503  wait( .5 );
504  overlayIcon = NewClientHudElem( self );
505  overlayIcon.x = 0;
506  overlayIcon.y = -10;
507  overlayIcon SetShader( "hud_exploding_vehicles", 50, 50 );
508  overlayIcon.alignX = "center";
509  overlayIcon.alignY = "middle";
510  overlayIcon.horzAlign = "center";
511  overlayIcon.vertAlign = "middle";
512  overlayIcon.foreground = true;
513  overlayIcon.alpha = 0;
514  overlayIcon FadeOverTime( 1 );
515  overlayIcon.alpha = 1;
516  overlayIcon.hidewheninmenu = true;
517 
518  overlayPointer = NewClientHudElem( self );
519 // overlayPointer.x = 0;
520 // overlayPointer.y = 25;
521 // overlayPointer SetShader( "hud_grenadepointer", 50, 25 );
522 // overlayPointer.alignX = "center";
523 // overlayPointer.alignY = "middle";
524 // overlayPointer.horzAlign = "center";
525 // overlayPointer.vertAlign = "middle";
526 // overlayPointer.foreground = true;
527 // overlayPointer.alpha = 0;
528 // overlayPointer FadeOverTime( 1 );
529 // overlayPointer.alpha = 1;
530 // overlayPointer.hidewheninmenu = true;
531 
532  self thread ‪grenade_death_indicator_hudelement_cleanup( overlayIcon, overlayPointer );
533 }
534 
535 // CODE_MOD
536 function ‪grenade_death_indicator_hudelement_cleanup( hudElemIcon, hudElemPointer )
537 {
538  self endon( "disconnect" );
539  self waittill( "spawned" );
540 
541  hudElemIcon Destroy();
542  hudElemPointer Destroy();
543 }
544 
545 function ‪special_death_indicator_hudelement( shader, iWidth, iHeight, fDelay, x, y )
546 {
547  if( !isdefined( fDelay ) )
548  {
549  fDelay = 0.5;
550  }
551 
552  wait( fDelay );
553  overlay = NewClientHudElem( self );
554 
555  if( isdefined( x ) )
556  overlay.x = x;
557  else
558  overlay.x = 0;
559 
560  if( isdefined( y ) )
561  overlay.y = y;
562  else
563  overlay.y = 40;
564 
565  overlay SetShader( shader, iWidth, iHeight );
566  overlay.alignX = "center";
567  overlay.alignY = "middle";
568  overlay.horzAlign = "center";
569  overlay.vertAlign = "middle";
570  overlay.foreground = true;
571  overlay.alpha = 0;
572  overlay FadeOverTime( 1 );
573  overlay.alpha = 1;
574  overlay.hidewheninmenu = true;
575 
577 }
578 
580 {
581  self endon( "disconnect" );
582  self waittill( "spawned" );
583 
584  overlay Destroy();
585 }
586 
587 
588 // SCRIPTER_MOD
589 // MikeD( 3/16/2007 ) TODO: Test this feature
590 function ‪water_think()
591 {
592  assert( isdefined( self.target ) );
593  targeted = GetEnt( self.target, "targetname" );
594  assert( isdefined( targeted ) );
595  waterHeight = targeted.origin[2];
596  targeted = undefined;
597 
598  level.depth_allow_prone = 8;
599  level.depth_allow_crouch = 33;
600  level.depth_allow_stand = 50;
601 
602 
603  while ( true )
604  {
606  //restore all defaults
607  players = GetPlayers();
608  for( i = 0; i < players.size; i++ )
609  {
610  if( players[i].inWater )
611  {
612  players[i] AllowProne( true );
613  players[i] AllowCrouch( true );
614  players[i] AllowStand( true );
615 // thread waterThink_rampSpeed( level.default_run_speed );
616  }
617  }
618 
619  //wait( until in water )
620  self waittill( "trigger", other );
621 
622  if( !IsPlayer( other ) )
623  {
624  continue;
625  }
626 
627  while( 1 )
628  {
629  players = GetPlayers();
630 
631  players_in_water_count = 0;
632  for( i = 0; i < players.size; i++ )
633  {
634  if( players[i] IsTouching( self ) )
635  {
636  players_in_water_count++;
637  players[i].inWater = true;
638  playerOrg = players[i] GetOrigin();
639  d = ( playerOrg[2] - waterHeight );
640  if( d > 0 )
641  {
642  continue;
643  }
644 
645  //slow the players movement based on how deep it is
646  newSpeed = Int( level.default_run_speed - abs( d * 5 ) );
647  if( newSpeed < 50 )
648  {
649  newSpeed = 50;
650  }
651  assert( newSpeed <= 190 );
652 // thread waterThink_rampSpeed( newSpeed );
653 
654  //controll the allowed stances in this water height
655  if( abs( d ) > level.depth_allow_crouch )
656  {
657  players[i] AllowCrouch( false );
658  }
659  else
660  {
661  players[i] AllowCrouch( true );
662  }
663 
664  if( abs( d ) > level.depth_allow_prone )
665  {
666  players[i] AllowProne( false );
667  }
668  else
669  {
670  players[i] AllowProne( true );
671  }
672  }
673  else
674  {
675  if( players[i].inWater )
676  {
677  players[i].inWater = false;
678  }
679  }
680  }
681 
682  if( players_in_water_count == 0 )
683  {
684  break;
685  }
686 
687  wait( 0.5 );
688  }
689 
691  }
692 
693 }
694 
695 function ‪indicate_start( start )
696 {
697  hudelem = NewHudElem();
698  hudelem.alignX = "left";
699  hudelem.alignY = "middle";
700  hudelem.x = 70;
701  hudelem.y = 400;
702 // hudelem.label = "Loading from start: " + start;
703  hudelem.label = start;
704  hudelem.alpha = 0;
705  hudelem.fontScale = 3;
706  wait( 1 );
707  hudelem FadeOverTime( 1 );
708  hudelem.alpha = 1;
709  wait( 5 );
710  hudelem FadeOverTime( 1 );
711  hudelem.alpha = 0;
712  wait( 1 );
713  hudelem Destroy();
714 }
715 
717 {
718  // Do not compute and set the map center if the level script has already done so.
719  if ( !isdefined( level.mapCenter ) )
720  {
721  // grab all of the path nodes in the level and use them to determine the
722  // the center of the playable map
723 
724  nodes = GetAllNodes();
725 
726  if ( isdefined( nodes[ 0 ] ) )
727  {
728  level.nodesMins = nodes[ 0 ].origin;
729  level.nodesMaxs = nodes[ 0 ].origin;
730  }
731  else
732  {
733  level.nodesMins = ( 0, 0, 0 );
734  level.nodesMaxs = ( 0, 0, 0 );
735  }
736 
737  for ( index = 0; index < nodes.size; index++ )
738  {
739  if ( nodes[ index ].type == "BAD NODE" )
740  {
741  /#
742  println( "Level has BAD NODE(s) - not included in map center calculations: ", nodes[ index ].origin );
743  #/
744  continue;
745  }
746 
747  origin = nodes[ index ].origin;
748 
749  level.nodesMins = ‪math::expand_mins( level.nodesMins, origin );
750  level.nodesMaxs = ‪math::expand_maxs( level.nodesMaxs, origin );
751  }
752 
753  level.mapCenter = ‪math::find_box_center( level.nodesMins, level.nodesMaxs );
754 
755  /#
756  println( "map center: ", level.mapCenter );
757  #/
758 
759  SetMapCenter( level.mapCenter );
760  }
761 }
762 
763 
765 {
766  // The darker the base color, the more-readable the text is against a stark-white backdrop.
767  // However; this sacrifices the "white-hot"ness of the text against darker backdrops.
768 
769  MY_TEXTBRIGHTNESS_DEFAULT = "1.0 1.0 1.0";
770  MY_TEXTBRIGHTNESS_90 = "0.9 0.9 0.9";
771  MY_TEXTBRIGHTNESS_85 = "0.85 0.85 0.85";
772 
773  if( level.script == "armada" )
774  {
775  SetSavedDvar( "con_typewriterColorBase", MY_TEXTBRIGHTNESS_90 );
776  return;
777  }
778 
779  SetSavedDvar( "con_typewriterColorBase", MY_TEXTBRIGHTNESS_DEFAULT );
780 }
781 
782 function ‪lerp_trigger_dvar_value( trigger, dvar, value, time )
783 {
784  trigger.lerping_dvar[dvar] = true;
785  steps = time * 20;
786  curr_value = GetDvarFloat( dvar );
787  diff = ( curr_value - value ) / steps;
788 
789  for( i = 0; i < steps; i++ )
790  {
791  curr_value = curr_value - diff;
792  SetSavedDvar( dvar, curr_value );
794  }
795 
796  SetSavedDvar( dvar, value );
797  trigger.lerping_dvar[dvar] = false;
798 }
799 
800 function ‪set_fog_progress( progress )
801 {
802  anti_progress = 1 - progress;
803  startdist = self.script_start_dist * anti_progress + self.script_start_dist * progress;
804  halfwayDist = self.script_halfway_dist * anti_progress + self.script_halfway_dist * progress;
805  color = self.script_color * anti_progress + self.script_color * progress;
806 
807  SetVolFog( startdist, halfwaydist, self.script_halfway_height, self.script_base_height, color[0], color[1], color[2], 0.4 );
808 }
809 
811 {
812  level ‪flag::wait_till( "all_players_connected" );
813  waittillframeend; // We need to make sure the clients actually get setup before we can do things to them.
814 
815  level.host = util::gethostplayer();
816 
817  while ( true )
818  {
819  if ( GetNumConnectedPlayers() == 0 )
820  {
821  // GetNumConnectedPlayers returns 0 when loading movie is playing
822  // But the players spawn before the movie is done. So wait here
823  // until movie is done.
825  continue;
826  }
827 
828  players = GetPlayers();
829 
830  count = 0;
831  for( i = 0; i < players.size; i++ )
832  {
833  if( players[i].sessionstate == "playing" )
834  {
835  count++;
836  }
837  }
838 
840 
841  if ( count > 0 )
842  {
843  level ‪flag::set( "first_player_spawned" );
844  }
845 
846  if ( count == players.size )
847  {
848  break;
849  }
850  }
851 
852  level ‪flag::set( "all_players_spawned" );
853 }
854 
855 function ‪shock_onpain()
856 {
857  self endon( "death" );
858  self endon( "disconnect" );
859  self endon("killOnPainMonitor");
860 
861 
862  if( GetDvarString( "blurpain" ) == "" )
863  {
864  SetDvar( "blurpain", "on" );
865  }
866 
867  while( 1 )
868  {
869  oldhealth = self.health;
870  self waittill( "damage", ‪damage, attacker, direction_vec, point, mod );
871 
872  if( isdefined( level.shock_onpain ) && !level.shock_onpain )
873  {
874  continue;
875  }
876 
877  if( isdefined( self.‪shock_onpain ) && !self.‪shock_onpain )
878  {
879  continue;
880  }
881 
882  if( self.health < 1 )
883  {
884  continue;
885  }
886 
887  if( mod == "MOD_PROJECTILE" )
888  {
889  continue;
890  }
891  else if( mod == "MOD_GRENADE_SPLASH" || mod == "MOD_GRENADE" || mod == "MOD_EXPLOSIVE" || mod == "MOD_PROJECTILE_SPLASH" )
892  {
894  }
895  else
896  {
897  if( GetDvarString( "blurpain" ) == "on" )
898  {
899  self ShellShock( "pain", 0.5 );
900  }
901  }
902  }
903 }
904 
906 {
907  time = 0;
908 
909  multiplier = self.maxhealth / 100;
910  scaled_damage = ‪damage * multiplier;
911 
912  if( scaled_damage >= 90 )
913  {
914  time = 4;
915  }
916  else if( scaled_damage >= 50 )
917  {
918  time = 3;
919  }
920  else if( scaled_damage >= 25 )
921  {
922  time = 2;
923  }
924  else if( scaled_damage > 10 )
925  {
926  time = 1;
927  }
928 
929  if( time )
930  {
931  //self ShellShock( "explosion", time ); // commented out for now to get around "explosion" not precached error -RMA
932  }
933 }
934 
936 {
937  self waittill( "death" );
938 
939  if( isdefined( level.shock_ondeath ) && !level.shock_ondeath )
940  {
941  return;
942  }
943 
944  if( isdefined( self.‪shock_ondeath ) && !self.‪shock_ondeath )
945  {
946  return;
947  }
948 
949  if( isdefined( self.specialDeath ) )
950  {
951  return;
952  }
953 
954  if( GetDvarString( "r_texturebits" ) == "16" )
955  {
956  return;
957  }
958  //self shellshock( "default", 3 );
959 }
960 
961 function ‪on_spawned()
962 {
963  if( !isdefined( self.player_inited ) || !self.player_inited )
964  {
965  if( SessionModeIsCampaignGame() )
966  {
967  self thread ‪shock_ondeath();
968  self thread ‪shock_onpain();
969  }
970 
971  //self thread cheat::player_init();
972 
973  //self damagefeedback::player_init();
974 
975 
977 
978  if ( isdefined( self ) )
979  {
980  self.player_inited = true;
981  }
982  }
983 }
984 
985 // Automatically link entities based on linkto/linkname KVPs
986 function ‪link_ents()
987 {
988  foreach ( ent in GetEntArray() )
989  {
990  if ( isdefined( ent.linkto ) )
991  {
992  e_link = GetEnt( ent.linkto, "linkname" );
993 
994  if ( isdefined( e_link ) )
995  {
996  ent EnableLinkTo();
997  ent LinkTo( e_link );
998  }
999  }
1000  }
1001 }
1002 
1004 // ART REVIEW - Set up the level to run for art/geo review (no event scripting) - should be called from load::main //
1006 
1007 function ‪art_review()
1008 {
1009 }
1010 
1012 // !ART REVIEW //
‪expand_maxs
‪function expand_maxs(maxs, point)
Definition: math_shared.gsc:114
‪playerDamageRumble
‪function playerDamageRumble()
Definition: load_shared.gsc:171
‪calculate_map_center
‪function calculate_map_center()
Definition: load_shared.gsc:716
‪coopGame
‪function coopGame()
Definition: util_shared.gsc:1431
‪explosive_arrow_death_indicator_hudelement
‪function explosive_arrow_death_indicator_hudelement()
Definition: load_shared.gsc:395
‪find_box_center
‪function find_box_center(mins, maxs)
Definition: math_shared.gsc:86
‪explosive_vehice_death_indicator_hudelement
‪function explosive_vehice_death_indicator_hudelement()
Definition: load_shared.gsc:500
‪shock_ondeath
‪function shock_ondeath()
Definition: load_shared.gsc:935
‪link_ents
‪function link_ents()
Definition: load_shared.gsc:986
‪badplace_think
‪function badplace_think(badplace)
Definition: load_shared.gsc:159
‪lerp_trigger_dvar_value
‪function lerp_trigger_dvar_value(trigger, dvar, value, time)
Definition: load_shared.gsc:782
‪grenade_death_indicator_hudelement
‪function grenade_death_indicator_hudelement()
Definition: load_shared.gsc:359
‪map_is_early_in_the_game
‪function map_is_early_in_the_game()
Definition: load_shared.gsc:186
‪shock_onpain
‪function shock_onpain()
Definition: load_shared.gsc:855
‪explosive_dart_death_indicator_hudelement
‪function explosive_dart_death_indicator_hudelement()
Definition: load_shared.gsc:430
‪player_throwgrenade_timer
‪function player_throwgrenade_timer()
Definition: load_shared.gsc:191
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪indicate_start
‪function indicate_start(start)
Definition: load_shared.gsc:695
‪on_spawned
‪function on_spawned()
Definition: load_shared.gsc:961
‪shock_onexplosion
‪function shock_onexplosion(damage)
Definition: load_shared.gsc:905
‪change_ammo
‪function change_ammo(equipment, change)
Definition: _zm_equipment.gsc:634
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪weapon_ammo
‪function weapon_ammo()
Definition: load_shared.gsc:116
‪keep_time
‪function keep_time()
Definition: load_shared.gsc:107
‪wait_network_frame
‪function wait_network_frame(n_count=1)
Definition: util_shared.gsc:64
‪grenade_death_indicator_hudelement_cleanup
‪function grenade_death_indicator_hudelement_cleanup(hudElemIcon, hudElemPointer)
Definition: load_shared.gsc:536
‪special_death_indicator_hudelement
‪function special_death_indicator_hudelement(shader, iWidth, iHeight, fDelay, x, y)
Definition: load_shared.gsc:545
‪water_think
‪function water_think()
Definition: load_shared.gsc:590
‪expand_mins
‪function expand_mins(mins, point)
Definition: math_shared.gsc:94
‪wait_till
‪function wait_till(str_flag)
Definition: flag_shared.csc:189
‪set_fog_progress
‪function set_fog_progress(progress)
Definition: load_shared.gsc:800
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪init
‪function init()
Definition: struct.csc:1
‪explosive_nitrogen_tank_death_indicator_hudelement
‪function explosive_nitrogen_tank_death_indicator_hudelement()
Definition: load_shared.gsc:465
‪registerClientSys
‪function registerClientSys(sSysName)
Definition: util_shared.gsc:1344
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪special_death_death_indicator_hudelement_cleanup
‪function special_death_death_indicator_hudelement_cleanup(overlay)
Definition: load_shared.gsc:579
‪all_players_spawned
‪function all_players_spawned()
Definition: load_shared.gsc:810
‪set_objective_text_colors
‪function set_objective_text_colors()
Definition: load_shared.gsc:764
‪__init__
‪function __init__()
Definition: load_shared.gsc:38
‪count_network_frames
‪function count_network_frames()
Definition: load_shared.gsc:96
‪first_frame
‪function autoexec first_frame()
Definition: load_shared.gsc:31
‪art_review
‪function art_review()
Definition: load_shared.gsc:1007
‪player_special_death_hint
‪function player_special_death_hint()
Definition: load_shared.gsc:215
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265
‪grenade_death_text_hudelement
‪function grenade_death_text_hudelement(textLine1, textLine2)
Definition: load_shared.gsc:310