‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
gameskill_shared.gsc
Go to the documentation of this file.
1 #using scripts\shared\flag_shared;
2 #using scripts\shared\flagsys_shared;
3 #using scripts\shared\util_shared;
4 #using scripts\shared\clientfield_shared;
5 
6 #insert scripts\shared\shared.gsh;
7 
8 #using scripts\shared\ai\systems\weaponList;
9 
10 #using scripts\codescripts\struct;
11 
12 #namespace gameskill;
13 
14 function autoexec ‪init()
15 {
16  level.gameSkill = 0;
17 }
18 
19 // this script handles all major global gameskill considerations
20 function ‪setSkill( reset, skill_override )
21 {
22  if ( !isdefined( level.script ) )
23  {
24  level.script = tolower( GetDvarString( "mapname" ) );
25  }
26 
27  if ( !‪IS_TRUE( reset ) )
28  {
29  if ( ‪IS_TRUE( level.b_gameSkillSet ) )
30  {
31  return;
32  }
33 
34  // TFLAME - 2/17/11 - useless func pointers for SP, but are set up in zombies. If they are always set up in zombies we shouldnt need them here... check if we can do without after zombie integrate
35  level.global_damage_func_ads = &‪empty_kill_func;
36  level.global_damage_func = &‪empty_kill_func;
37  level.global_kill_func = &‪empty_kill_func;
38 
39  // first init stuff
41 
42  if ( ‪util::coopGame() )
43  {
44  thread ‪coop_player_threat_bias_adjuster(); // Makes the coop players get targeted more often
47  }
48 
49  level.b_gameSkillSet = true;
50  }
51 
52  replay_single_mission = GetDvarInt( "ui_singlemission" );
53  if ( replay_single_mission == 1 )
54  {
55  single_mission_difficulty = GetDvarInt( "ui_singlemission_difficulty" );
56  if ( single_mission_difficulty >= 0 )
57  {
58  skill_override = single_mission_difficulty;
59  }
60  }
61 
62  level thread ‪update_skill_level( skill_override );
63 
64  if ( !isdefined( level.player_attacker_accuracy_multiplier ) )
65  {
66  level.player_attacker_accuracy_multiplier = 1;
67  }
68 
69  anim.run_accuracy = 0.5;
70 
71  level.auto_adjust_threatbias = true;
72 
73  // TFLAME - 2/22/11 - In Hard/Vet, pain_protection makes some AI not respond to pain if multiple AI are shot by the player in a short interval
74  // anim.pain_test
75  anim.pain_test = &‪pain_protection;
76 
77  // set all the difficulty based variables according to the current difficulty
79 }
80 
81 function ‪apply_difficulty_var_with_func( difficulty_func )
82 {
83  level.playerHealth_RegularRegenDelay = ‪get_player_health_regular_regen_delay();
84  level.worthyDamageRatio = ‪get_worthy_damage_ratio();
85 
86  if ( level.auto_adjust_threatbias )
87  {
88  thread ‪apply_threat_bias_to_all_players(difficulty_func);
89  }
90 
91  level.longRegenTime = ‪get_long_regen_time();
92 
93  anim.player_attacker_accuracy = ‪get_base_enemy_accuracy() * level.player_attacker_accuracy_multiplier;
94 
95 // anim.missTimeConstant = get_miss_time_constant();
96 // anim.missTimeDistanceFactor = get_miss_time_distance_factor();
97  anim.dog_hits_before_kill = ‪get_dog_hits_before_kill();
98 
99  anim.dog_health = ‪get_dog_health();
100  anim.dog_presstime = ‪get_dog_press_time();
101 
102 // setsaveddvar( "ai_accuracyDistScale", [[ difficulty_func ]]( "accuracyDistScale" ) );
103  setsaveddvar( "ai_accuracyDistScale", 1 ); //GSTELMACK - setting this to one as safety net, due to removing difficulty setting - should be removed once verified as not being used any more
104 
105  thread ‪coop_damage_and_accuracy_scaling(difficulty_func );
106 }
107 
108 
109 function ‪apply_threat_bias_to_all_players(difficulty_func)
110 {
111  level ‪flag::wait_till( "all_players_connected" );
112 
113  players = level.players;
114  for( i = 0; i < players.size; i++ )
115  {
116  players[i].threatbias = int( ‪get_player_threat_bias() );
117  }
118 }
119 
120 function ‪coop_damage_and_accuracy_scaling( difficulty_func )
121 {
122 }
123 
125 {
127 }
128 
129 
130 // returns current level difficulty. locked refers to as opposed to an old system which used to blend difficulties which is now gone
131 function ‪get_locked_difficulty_val( msg, ignored ) // ignored is there because this is used as a function pointer with another function that does have a second parm
132 {
133  return level.difficultySettings[ msg ][ level.currentDifficulty ];
134 }
135 
136 function ‪always_pain()
137 {
138  return false;
139 }
140 
141 // TFLAME - 2/22/11 - If you shoot multiple AI within a short interval, sometimes the second guy won�t play a hit reaction. This helps stop abuse of players
142 // spraying a clumped group of AI with bullets as they all pain react on harder difficulties
144 {
145  if ( !‪pain_protection_check() )
146  {
147  return false;
148  }
149 
150  return( randomint( 100 ) > ‪get_enemy_pain_chance() * 100 );
151 }
152 
154 {
155  if ( !isalive( self.enemy ) )
156  {
157  return false;
158  }
159 
160  if ( !IsPlayer(self.enemy) )
161  {
162  return false;
163  }
164 
165  if ( !isalive( level.painAI ) || level.painAI.a.script != "pain" )
166  {
167  level.painAI = self;
168  }
169 
170  // The pain AI can always take pain, so if the player focuses on one guy he'll see pain animations.
171  if ( self == level.painAI )
172  {
173  return false;
174  }
175 
176  if ( self.damageWeapon != level.weaponNone && self.damageWeapon.isBoltAction )
177  {
178  return false;
179  }
180 
181  return true;
182 }
183 
184 
186 {
187  level notify( "stop_printing_health_bars" );
188  level endon( "stop_printing_health_bars" );
189 
190  const x = 150;
191  y = 40;
192 
193  level.healthBarHudElems = [];
194 
195  level.healthBarKeys[ 0 ] = "Health";
196  level.healthBarKeys[ 1 ] = "No Hit Time";
197  level.healthBarKeys[ 2 ] = "No Die Time";
198 
199  if ( !isdefined( level.playerInvulTimeEnd ) )
200  {
201  level.playerInvulTimeEnd = 0;
202  }
203 
204  if ( !isdefined( level.player_deathInvulnerableTimeout ) )
205  {
206  level.player_deathInvulnerableTimeout = 0;
207  }
208 
209  for ( i = 0; i < level.healthBarKeys.size; i++ )
210  {
211  key = level.healthBarKeys[ i ];
212 
213  textelem = newHudElem();
214  textelem.x = x;
215  textelem.y = y;
216  textelem.alignX = "left";
217  textelem.alignY = "top";
218  textelem.horzAlign = "fullscreen";
219  textelem.vertAlign = "fullscreen";
220  textelem setText( key );
221 
222  bgbar = newHudElem();
223  bgbar.x = x + 79;
224  bgbar.y = y + 1;
225  bgbar.z = 1;
226  bgbar.alignX = "left";
227  bgbar.alignY = "top";
228  bgbar.horzAlign = "fullscreen";
229  bgbar.vertAlign = "fullscreen";
230  bgbar.maxwidth = 3;
231  bgbar setshader( "white", bgbar.maxwidth, 10 );
232  bgbar.color = ( 0.5, 0.5, 0.5 );
233 
234  bar = newHudElem();
235  bar.x = x + 80;
236  bar.y = y + 2;
237  bar.alignX = "left";
238  bar.alignY = "top";
239  bar.horzAlign = "fullscreen";
240  bar.vertAlign = "fullscreen";
241  bar setshader( "black", 1, 8 );
242  bar.sort = 1;
243 
244  textelem.bar = bar;
245  textelem.bgbar = bgbar;
246  textelem.key = key;
247 
248  y += 10;
249 
250  level.healthBarHudElems[ key ] = textelem;
251  }
252 
253  level ‪flag::wait_till( "all_players_spawned" );
254 
255  while ( 1 )
256  {
257  wait .05;
258 
259  players = level.players;
260 
261  for ( i = 0; i < level.healthBarKeys.size && players.size > 0; i++ )
262  {
263  key = level.healthBarKeys[ i ];
264 
265  player = players[0];
266 
267  width = 0;
268  if ( i == 0 )
269  {
270  width = player.health / player.maxhealth * 300;
271  level.healthBarHudElems[ key ] SetText( level.healthBarKeys[ 0 ] + " " + player.health );
272  }
273  else if ( i == 1 )
274  {
275  width = ( level.playerInvulTimeEnd - GetTime() ) / 1000 * 40;
276  }
277  else if ( i == 2 )
278  {
279  width = ( level.player_deathInvulnerableTimeout - GetTime() ) / 1000 * 40;
280  }
281 
282  width = int( max( width, 1 ) );
283  width = int( min( width, 300 ) );
284 
285  bar = level.healthBarHudElems[ key ].bar;
286  bar setShader( "black", width, 8 );
287 
288  bgbar = level.healthBarHudElems[ key ].bgbar;
289  if( width+2 > bgbar.maxwidth )
290  {
291  bgbar.maxwidth = width+2;
292  bgbar setshader( "white", bgbar.maxwidth, 10 );
293  bgbar.color = ( 0.5, 0.5, 0.5 );
294  }
295  }
296  }
297 }
298 
300 {
301  level notify( "stop_printing_health_bars" );
302 
303  if ( !isdefined( level.healthBarHudElems ) )
304  {
305  return;
306  }
307 
308  for ( i = 0; i < level.healthBarKeys.size; i++ )
309  {
310  level.healthBarHudElems[ level.healthBarKeys[ i ] ].bgbar ‪destroy();
311  level.healthBarHudElems[ level.healthBarKeys[ i ] ].bar ‪destroy();
312  level.healthBarHudElems[ level.healthBarKeys[ i ] ] ‪destroy();
313 
314  }
315 }
316 
317 
318 
319 // this is run on each enemy AI.
321 {
322  self endon( "long_death" );
323  self endon( "death" );
324 
325  if( isDefined(level.script) && level.script != "core_frontend" )
326  {
328  }
329 }
330 
331 
332 // this is run on each friendly AI.
334 {
335  self endon( "long_death" );
336  self endon( "death" );
337 
339 }
340 
341 
343 {
344  self endon( "death" );
345  self endon( "killHurtCheck" );
346 
347  self.hurtAgain = false;
348  for ( ;; )
349  {
350  self waittill( "damage", amount, attacker, dir, point, mod );
351 
352  if(isdefined(attacker) && isplayer(attacker) && attacker.team == self.team)
353  {
354  continue;
355  }
356 
357  self.hurtAgain = true;
358  self.damagePoint = point;
359  self.damageAttacker = attacker;
360 
361 // MikeD (8/7/2007): New player_burned effect.
362  if( isdefined (mod) && mod == "MOD_BURNED" )
363  {
364  self setburn( 0.5 );
365  self PlaySound( "chr_burn" );
366  }
367 
368  invulWorthyHealthDrop = amount / self.maxhealth >= level.worthyDamageRatio; // true if dmg was over 10, or any dmg on easy
369 
370  death_invuln_time = 0;
371 
372  if( self.health <= 1 && self ‪player_eligible_for_death_invulnerability() )
373  {
374  invulWorthyHealthDrop = true;
375 
376  player_death_invulnerability_time = ‪get_player_death_invulnerable_time();
377  coop_death_invulnerability_time_modifier = ‪get_coop_player_death_invulnerable_time_modifier();
378 
379  death_invuln_time = player_death_invulnerability_time * coop_death_invulnerability_time_modifier;
380 
381  self.eligible_for_death_invulnerability = false;
382 
384 
385  level.player_deathInvulnerableTimeout = GetTime() + death_invuln_time; //for health debug overlay tracking only
386  }
387 
388  oldratio = self.health / self.maxHealth;
389 
390  level notify( "hit_again" );
391 
392  health_add = 0;
393  hurtTime = gettime();
394  if( !isdefined( level.disable_damage_blur ) )
395  {
396  self startfadingblur( 3, 0.8 ); //We get this mini-blur on every hit
397  }
398 
399  if( !invulWorthyHealthDrop )
400  {
401  continue;
402  }
403 
404  if( self ‪flag::get( "player_is_invulnerable" ) )
405  continue;
406 
407  self ‪flag::set( "player_is_invulnerable" );
408  level notify( "player_becoming_invulnerable" ); // because "player_is_invulnerable" notify happens on both set * and * clear
409 
410  if( death_invuln_time < ‪get_player_hit_invuln_time() )
411  {
412  invulTime = ‪get_player_hit_invuln_time();
413  }
414  else
415  {
416  invulTime = death_invuln_time;
417  }
418 
419  self thread ‪playerInvul( invulTime );
420  }
421 }
422 
423 
424 // controls player health regeneration
425 function ‪playerHealthRegen() //self = player
426 {
427  self endon ("death");
428  self endon ("disconnect");
429  self endon ("removehealthregen");
430 
431  if( !isdefined( self.flag ) )
432  {
433  self.flag = [];
434  self.flags_lock = [];
435  }
436  if( !isdefined(self.flag["player_has_red_flashing_overlay"]) )
437  {
438  self ‪flag::init("player_has_red_flashing_overlay");
439  self ‪flag::init("player_is_invulnerable");
440  }
441  self ‪flag::clear("player_has_red_flashing_overlay");
442  self ‪flag::clear("player_is_invulnerable");
443 
444  self thread ‪increment_take_cover_warnings_on_death(); // TFLAME - 2/22/11 - These systems are broken atm
446 
447  self thread ‪healthOverlay();
448  oldratio = 1;
449  health_add = 0;
450 
451  veryHurt = false;
452  playerJustGotRedFlashing = false;
453 
454  invulTime = 0;
455  hurtTime = 0;
456  newHealth = 0;
457 
458  self.attackerAccuracy = 1;
459  self.oldattackeraccuracy = 1;
460  self.ignoreBulletDamage = 0;
461 
462  self thread ‪playerHurtcheck();
463  if(!isdefined (self.veryhurt))
464  {
465  self.veryhurt = 0;
466  }
467 
468  self.boltHit = false;
469 
470  for( ;; )
471  {
473  waittillframeend; // if we're on hard, we need to wait until the bolt damage check before we decide what to do
474 
475  if( self.health == self.maxHealth )
476  {
477  if( self ‪flag::get( "player_has_red_flashing_overlay" ) )
478  {
479  ‪flag::clear( "player_has_red_flashing_overlay" );
480  }
481 
482  playerJustGotRedFlashing = false;
483  veryHurt = false;
484  continue;
485  }
486 
487  if( self.health <= 0 )
488  {
489  return;
490  }
491 
492  wasVeryHurt = veryHurt;
493  health_ratio = self.health / self.maxHealth;
494 
495  // Checks difficulty, decides if we're hurt enough to show red hurt overlay/blur. The harder the difficulty, the sooner this plays.
496  if( health_ratio <= ‪get_health_overlay_cutoff() )
497  {
498  veryHurt = true; // This controls whether the delay for regenning uses playerHealth_RegularRegenDelay or longRegenTime for the regen delay
499  self thread ‪cover_warning_check();
500 
501  if( !wasVeryHurt )
502  {
503  hurtTime = gettime();
504 // if( !isdefined( level.disable_damage_blur ) )
505 // {
506 // self startfadingblur( 3.6, 2 ); // GSTELMACK - 7/28/2014 This currently does not seem to have any function in-game
507 // }
508 
509  self ‪flag::set( "player_has_red_flashing_overlay" );
510  playerJustGotRedFlashing = true;
511  }
512  }
513 
514  if( self.hurtAgain )
515  {
516  hurtTime = gettime();
517  self.hurtAgain = false;
518  }
519 
520 
521  if( health_ratio >= oldratio ) // Make sure we haven't taken damage since the last frame
522  {
523  if( gettime() - hurttime < level.playerHealth_RegularRegenDelay ) // based on difficulty, can we start regenerating yet?
524  {
525  continue;
526  }
527 
528  if( veryHurt ) // once we're veryhurt, we stay veryhurt until we fully regenerate
529  {
530  self.veryhurt = 1;
531  newHealth = health_ratio;
532  if( gettime() > hurtTime + level.longRegenTime ) // has it been 5 seconds since we were hurt? (same for all difficulties)
533  {
534  const regenRate = 0.1; // 0.017;
535  newHealth += regenRate; // always adds 10 health per frame. At this rate we always regenerate within half a second after the 5 second delay
536  }
537 
538  if ( newHealth >= 1 )
539  {
541  }
542  }
543  else
544  {
545  newHealth = 1;
546  self.veryhurt = 0;
547  }
548 
549  if( newHealth > 1.0 )
550  {
551  newHealth = 1.0;
552  }
553 
554  if( newHealth <= 0 ) // Player is dead
555  {
556  return;
557  }
558 
559  self setnormalhealth( newHealth );
560 
561  oldratio = self.health / self.maxHealth;
562  continue;
563  }
564 
565  }
566 }
567 
569 {
570  players = level.players;
571 
572  if ( isdefined( players[0] ) && isAlive( players[0] ) )
573  {
574  takeCoverWarnings = GetLocalProfileInt( "takeCoverWarnings" );
575  if ( takeCoverWarnings > 0 )
576  {
577  takeCoverWarnings -- ;
578  SetLocalProfileVar( "takeCoverWarnings", takeCoverWarnings );
579  }
580  }
581 }
582 
583 // Makes attacker accuracy 0 and other bullets not hurt player. But I think grenades, melee, and other explosives will still kill player.
584 function ‪playerInvul( ‪timer )// self = player
585 {
586  self endon( "death" );
587  self endon( "disconnect" );
588 
589  self.oldattackeraccuracy = self.attackeraccuracy;
590 
591  if ( ‪timer > 0 )
592  {
593  self.attackerAccuracy = 0;
594  self.ignoreBulletDamage = true;
595 
596  level.playerInvulTimeEnd = gettime() + ‪timer * 1000;
597 
598 
599  wait( ‪timer );
600  }
601 
602  self.attackerAccuracy = self.oldattackeraccuracy;
603  self.ignoreBulletDamage = false;
604 
605  self ‪flag::clear( "player_is_invulnerable" );
606 }
607 
608 // sets grenade awareness for all ai. Appaerntly enemies don't have very good grenade awareness but friendlies all do
610 {
611  if ( self.team == "allies" )
612  {
613  self.grenadeawareness = 0.9;
614  return;
615  }
616 
617  if ( self.team == "axis" )
618  {
619  if ( isdefined(level.gameSkill) && level.gameSkill >= 2 )
620  {
621  // hard and fu
622  if ( randomint( 100 ) < 33 )
623  {
624  self.grenadeawareness = 0.2;
625  }
626  else
627  {
628  self.grenadeawareness = 0.5;
629  }
630  }
631  else
632  {
633  // normal
634  if ( randomint( 100 ) < 33 )
635  {
636  self.grenadeawareness = 0;
637  }
638  else
639  {
640  self.grenadeawareness = 0.2;
641  }
642  }
643  }
644 }
645 
646 function ‪playerheartbeatloop(healthcap)
647 {
648  self endon( "disconnect" );
649  self endon( "killed_player" );
650 
651  wait (2);
652  player = self;
653  ent = undefined;
654 
655  for (;;)
656  {
657  wait .2;
658  // Player still has a lot of health so no hearbeat sound and set to default hearbeat wait
659  if (player.health >= healthcap)
660  {
661  if( isdefined( ent ) )
662  {
663  ent stoploopsound( 1.5 );
664  level thread ‪delayed_delete( ent, 1.5 );
665  }
666  continue;
667  }
668 
669  ent = ‪Spawn( "script_origin", self.origin );
670  ent playloopsound( "", .5 );
671  }
672 }
673 
674 function ‪delayed_delete( ent, time )
675 {
676  wait(time);
677  ent delete();
678  ent = undefined;
679 }
680 
681 
682 function ‪healthfadeOffWatcher(overlay,timeToFadeOut)
683 {
684  self notify("new_style_health_overlay_done");
685  self endon ("new_style_health_overlay_done");
686  while(!‪IS_TRUE(level.disable_damage_overlay) && timeToFadeOut>0)
687  {
689  timeToFadeOut -= 0.05;
690  }
691  if (‪IS_TRUE(level.disable_damage_overlay))
692  {
693  overlay.alpha = 0;
694  overlay fadeOverTime( 0.05 );
695  }
696 }
697 
698 function ‪new_style_health_overlay() //self = player
699 {
700  /*
701  overlay = NewClientHudElem( self );
702  overlay.x = 0;
703  overlay.y = 0;
704 
705  if ( issplitscreen() )
706  {
707  overlay SetShader( "overlay_low_health_splat", 640, 480 * 2 );
708 
709  // offset the blood a little so it looks different for each player
710  if ( self == level.players[ 0 ] )
711  {
712  overlay.y -= 120;
713  }
714  }
715  else
716  {
717  overlay SetShader( "overlay_low_health_splat", 640, 480 );
718  }
719  overlay.splatter = true;
720  overlay.alignX = "left";
721  overlay.alignY = "top";
722  overlay.sort = 1;
723  overlay.foreground = 0;
724  overlay.horzAlign = "fullscreen";
725  overlay.vertAlign = "fullscreen";
726  overlay.alpha = 0;
727 
728  thread healthOverlay_remove( overlay );
729 
730  const updateTime = 0.05;
731  const timeToFadeOut = 0.75;
732 
733  while (1)
734  {
735  wait updateTime;
736 
737  if( IS_TRUE(level.disable_damage_overlay) )
738  {
739  targetDamageAlpha = 0;
740  overlay.alpha = 0;
741  }
742  else
743  {
744  targetDamageAlpha = 1.0 - self.health / self.maxHealth;
745  }
746 
747  if ( overlay.alpha < targetDamageAlpha ) // took damage since last update
748  {
749  overlay.alpha = targetDamageAlpha; // pop to alpha. jarring effect. nice.
750  }
751  else if ( overlay.alpha != 0 ) // full health
752  {
753  level thread healthfadeOffWatcher(overlay,timeToFadeOut);
754  overlay FadeOverTime( timeToFadeOut );
755  overlay.alpha = 0;
756  // play the breathing better sound
757  //self playsound ("chr_breathing_better");
758  }
759  }
760  */
761 }
762 
763 function ‪healthOverlay()//self = player
764 {
765  self endon( "disconnect" );
766  self endon( "noHealthOverlay" );
767 
769 }
770 
772 {
773  if ( level.console )
774  {
775  self.fontScale = 2;
776  }
777  else
778  {
779  self.fontScale = 1.6;
780  }
781 
782  self.x = 0;// 320;
783  self.y = -36;// 200;
784  self.alignX = "center";
785  self.alignY = "bottom";
786  self.horzAlign = "center";
787  self.vertAlign = "middle";
788 
789  if ( !isdefined( self.background ) )
790  {
791  return;
792  }
793  self.background.x = 0;// 320;
794  self.background.y = -40;// 200;
795  self.background.alignX = "center";
796  self.background.alignY = "middle";
797  self.background.horzAlign = "center";
798  self.background.vertAlign = "middle";
799  if ( level.console )
800  {
801  self.background setshader( "popmenu_bg", 650, 52 );
802  }
803  else
804  {
805  self.background setshader( "popmenu_bg", 650, 42 );
806  }
807  self.background.alpha = .5;
808 }
809 
810 function ‪create_warning_elem( player )
811 {
812  level notify( "hud_elem_interupt" );
813  hudelem = newHudElem();
815  hudelem thread ‪destroy_warning_elem_when_mission_failed( player );
816  hudelem setText( &"GAME_GET_TO_COVER" );
817  hudelem.fontscale = 1.85;
818  hudelem.alpha = 1;
819  hudelem.color = ( 1, 0.6, 0 );
820 
821  return hudelem;
822 }
823 
825 {
826  if(isdefined (self.veryhurt))
827  {
828  //Randomly plays a "hurt" sound when shot
829  if(self.veryhurt == 0)
830  {
831  if(randomintrange(0,1) == 1)
832  {
833  playsoundatposition ("chr_breathing_hurt_start", self.origin);
834  }
835  }
836  }
837 }
838 
840 {
841  level endon( "hit_again" );
842  self waittill( "damage" );
843 }
844 
845 
847 {
848  self endon( "being_destroyed" );
849  self endon ("death");
850 
851  level ‪flag::wait_till( "missionfailed" );
852 
853  // TFLAME - 3/22/11 - This shouldn't be player, should be self. But this was never called in BO because the cover warning stuff was broken
854  self thread ‪destroy_warning_elem( true );
855 }
856 
857 function ‪destroy_warning_elem( fadeout )
858 {
859  self notify( "being_destroyed" );
860  self.beingDestroyed = true;
861 
862  if ( fadeout )
863  {
864  self fadeOverTime( 0.5 );
865  self.alpha = 0;
866  wait 0.5;
867  }
869  self ‪destroy();
870 }
871 
872 function ‪mayChangeCoverWarningAlpha( coverWarning )
873 {
874  if ( !isdefined( coverWarning ) )
875  {
876  return false;
877  }
878  if ( isdefined( coverWarning.beingDestroyed ) )
879  {
880  return false;
881  }
882  return true;
883 }
884 
885 
886 // TFLAME - 2/24/11 - This currently crashes the game, in particular if you use changeFontScaleOverTime. As far as i can tell this is somehow told not to run in zombies, the only time it would get called
887 function ‪fontScaler( scale, ‪timer )
888 {
889  self endon( "death" );
890  scale *= 2;
891  dif = scale - self.fontscale;
892  self changeFontScaleOverTime( ‪timer );
893  self.fontscale += dif;
894 }
895 
896 // TFLAME - 2/24/11 - Get the cover warnings working again, will see if any bugs pop up since the system wasn't running at all since midway through black ops
897 // Seperated the old cover warning system which was integrated together with the old hud since we don't use that hud anymore. That old health hud really needs to be updated
899 {
900  level endon( "missionfailed" );
901 
902  if ( self ‪shouldShowCoverWarning() )
903  {
904  coverwarning = ‪create_warning_elem( self );
905  level.cover_warning_hud = coverwarning;
906 
907  coverwarning endon( "death" );
908 
909  stopFlashingBadlyTime = gettime() + level.longRegenTime;
910 
911  yellow_fac = 0.7;
912 
913  while ( gettime() < stopFlashingBadlyTime && isalive( self ) )
914  {
915  for (i=0; i< 7; i++)
916  {
917  yellow_fac +=0.03;
918  coverwarning.color = (1,yellow_fac,0);
920  }
921 
922  for (i=0; i< 7; i++)
923  {
924  yellow_fac -=0.03;
925  coverwarning.color = (1,yellow_fac,0);
927  }
928  }
929 
930  if ( ‪mayChangeCoverWarningAlpha( coverwarning ) )
931  {
932  coverwarning fadeOverTime( 0.5 );
933  coverwarning.alpha = 0;
934  }
935 
936  wait( 0.5 );// for fade out
937  wait 5;
938  coverwarning ‪destroy();
939  }
940 }
941 
942 
943 // TFLAME - 2/24/11 - Get the cover warnings working again, will see if any bugs pop up since the system wasn't running at all since midway through black ops
945 {
946  return false; // TODO: remove after GL
947 
948  // Glocke: need to disable this for the Makin outro so adding in a level var
949  if( isdefined(level.enable_cover_warning) )
950  {
951  return level.enable_cover_warning;
952  }
953 
954  if ( !isAlive( self ) )
955  {
956  return false;
957  }
958 
959  if ( level.gameskill > 1 )
960  {
961  return false;
962  }
963 
964  if ( level.missionfailed )
965  {
966  return false;
967  }
968 
969  if ( isSplitScreen() || ‪util::coopGame() )
970  {
971  return false;
972  }
973 
974  // note: takeCoverWarnings is 3 more than the number of warnings left.
975  // this lets it stay away for a while unless we die 3 times in a row without taking cover successfully.
976  takeCoverWarnings = GetLocalProfileInt( "takeCoverWarnings" );
977  if ( takeCoverWarnings <= 3 )
978  {
979  return false;
980  }
981 
982  if (isdefined(level.cover_warning_hud))
983  {
984  return false;
985  }
986 
987  return true;
988 }
989 
990 
991 // TFLAME - 2/24/11 - Also only used in zombies for the old COD 2 legacy hurt hud. Campaign uses the blood splat. At some point we should consolidate the design.
992 function ‪fadeFunc( overlay, coverWarning, severity, mult, hud_scaleOnly )
993 {
994  const pulseTime = 0.8;
995 
996  fadeInTime = pulseTime * 0.1;
997  stayFullTime = pulseTime * ( .1 + severity * .2 );
998  fadeOutHalfTime = pulseTime * ( 0.1 + severity * .1 );
999  fadeOutFullTime = pulseTime * 0.3;
1000  remainingTime = pulseTime - fadeInTime - stayFullTime - fadeOutHalfTime - fadeOutFullTime;
1001  assert( remainingTime >= -.001 );
1002  if ( remainingTime < 0 )
1003  {
1004  remainingTime = 0;
1005  }
1006 
1007  halfAlpha = 0.8 + severity * 0.1;
1008  leastAlpha = 0.5 + severity * 0.3;
1009 
1010  overlay fadeOverTime( fadeInTime );
1011  overlay.alpha = mult * 1.0;
1012  if ( ‪mayChangeCoverWarningAlpha( coverWarning ) )
1013  {
1014  if ( !hud_scaleOnly )
1015  {
1016  coverWarning fadeOverTime( fadeInTime );
1017  coverWarning.alpha = mult * 1.0;
1018  }
1019  }
1020  if ( isdefined( coverWarning ) )
1021  {
1022  coverWarning thread ‪fontScaler( 1.0, fadeInTime );
1023  }
1024  wait fadeInTime + stayFullTime;
1025 
1026  overlay fadeOverTime( fadeOutHalfTime );
1027  overlay.alpha = mult * halfAlpha;
1028  if ( ‪mayChangeCoverWarningAlpha( coverWarning ) )
1029  {
1030  if ( !hud_scaleOnly )
1031  {
1032  coverWarning fadeOverTime( fadeOutHalfTime );
1033  coverWarning.alpha = mult * halfAlpha;
1034  }
1035  }
1036 
1037  wait fadeOutHalfTime;
1038 
1039  overlay fadeOverTime( fadeOutFullTime );
1040  overlay.alpha = mult * leastAlpha;
1041  if ( ‪mayChangeCoverWarningAlpha( coverWarning ) )
1042  {
1043  if ( !hud_scaleOnly )
1044  {
1045  coverWarning fadeOverTime( fadeOutFullTime );
1046  coverWarning.alpha = mult * leastAlpha;
1047  }
1048  }
1049  if ( isdefined( coverWarning ) )
1050  {
1051  coverWarning thread ‪fontScaler( 0.9, fadeOutFullTime );
1052  }
1053  wait fadeOutFullTime;
1054 
1055  wait remainingTime;
1056 }
1057 
1058 // TFLAME - 2/24/11 - Fades out the overlay on death, not sure if that is already covered by mission failing, also fades out if a nohealthoverlay notify is sent. Althoguh it would only fade back in as soon as it would anyway from the other threads
1059 function ‪healthOverlay_remove( overlay ) //self = player
1060 {
1061  // this hud element will get cleaned up automatically by the code when the player disconnects
1062  // so we just need to make sure this thread ends
1063  self endon ("disconnect");
1064 
1065  self ‪util::waittill_any ( "noHealthOverlay", "death" );
1066 
1067  // CODER_MOD
1068  // Austin (4/19/08): fade out the overlay for the 4/21 milestone
1069 
1070  //overlay destroy();
1071 
1072  overlay fadeOverTime( 3.5 );
1073  overlay.alpha = 0;
1074 
1075 }
1076 
1077 // TFLAME - 2/24/11 - Get the cover warnings working again, will see if any bugs pop up since the system wasn't running at all since midway through black ops
1079 {
1080  // generates "Get to Cover" x number of times when you first get hurt
1081  // dvar defaults to - 1
1082 
1083  // TFLAME - 2/22/11 - MW 1 specific ... needs to be updated.
1084  isPreGameplayLevel = ( level.script == "training" || level.script == "cargoship" || level.script == "coup" );
1085 
1086  if ( GetLocalProfileInt( "takeCoverWarnings" ) == -1 || isPreGameplayLevel )
1087  {
1088  // takeCoverWarnings is 3 more than the number of warnings we want to occur.
1089  SetLocalProfileVar( "takeCoverWarnings", 3 + 6 );
1090  }
1091 }
1092 
1093 // TFLAME - 2/24/11 - Get the cover warnings working again, will see if any bugs pop up since the system wasn't running at all since midway through black ops
1095 {
1096  // MikeD (7/30/2007): This function is intended only for players.
1097  if( !IsPlayer( self ) )
1098  {
1099  return;
1100  }
1101 
1102  level notify( "new_cover_on_death_thread" );
1103  level endon( "new_cover_on_death_thread" );
1104  self waittill( "death" );
1105 
1106  // dont increment if player died to grenades, explosion, etc
1107  if( !(self ‪flag::get( "player_has_red_flashing_overlay" ) ) )
1108  {
1109  return;
1110  }
1111 
1112  if ( level.gameSkill > 1 )
1113  {
1114  return;
1115  }
1116 
1117  warnings = GetLocalProfileInt( "takeCoverWarnings" );
1118  if ( warnings < 10 )
1119  {
1120  SetLocalProfileVar( "takeCoverWarnings", warnings + 1 );
1121  }
1122 }
1123 
1124 
1125 //GSTELMACK 7/28/2014 - this func is empty, do we need it?
1126 function ‪empty_kill_func( type, loc, point, attacker, amount )
1127 {
1128 }
1129 
1130 function ‪update_skill_level( skill_override )
1131 {
1132  level notify( "update_skill_from_profile" );
1133  level endon( "update_skill_from_profile" );
1134 
1135  level.gameSkillLowest = 9999;
1136  level.gameSkillHighest = 0;
1137  n_last_gameskill = -1;
1138 
1139  while ( !isdefined( skill_override ) )
1140  {
1141  level.gameSkill = GetLocalProfileInt( "g_gameskill" );
1142 
1143  if ( level.gameSkill != n_last_gameskill )
1144  {
1145  if ( !isdefined( level.gameskill ) )
1146  {
1147  level.gameskill = 0;
1148  }
1149 
1150  SetDvar( "saved_gameskill", level.gameSkill );
1151 
1152  switch ( level.gameSkill )
1153  {
1154  case 0:
1155 
1156  SetDvar( "currentDifficulty", "easy" );
1157  level.currentDifficulty = "easy";
1158  break;
1159 
1160  case 1:
1161 
1162  SetDvar( "currentDifficulty", "normal" );
1163  level.currentDifficulty = "normal";
1164  break;
1165 
1166  case 2:
1167 
1168  SetDvar( "currentDifficulty", "hardened" );
1169  level.currentDifficulty = "hardened";
1170  break;
1171 
1172  case 3:
1173 
1174  SetDvar( "currentDifficulty", "veteran" );
1175  level.currentDifficulty = "veteran";
1176  break;
1177 
1178  case 4:
1179 
1180  SetDvar( "currentDifficulty", "realistic" );
1181  level.currentDifficulty = "realistic";
1182  break;
1183  }
1184 
1185  /# PrintLn( "difficulty: " + level.gameSkill ); #/
1186 
1187  n_last_gameskill = level.gameSkill;
1188 
1189  if ( level.gameSkill < level.gameSkillLowest )
1190  {
1191  level.gameSkillLowest = level.gameSkill;
1192  MatchRecordSetLevelDifficultyForIndex(‪MIN_DIFFICULTY_REPORT_INDEX, level.gameskill);
1193  }
1194 
1195  if ( level.gameSkill > level.gameSkillHighest )
1196  {
1197  level.gameSkillHighest = level.gameSkill;
1198  MatchRecordSetLevelDifficultyForIndex(‪MAX_DIFFICULTY_REPORT_INDEX, level.gameskill);
1199  }
1200 
1201  foreach( player in GetPlayers() )
1202  {
1203  player ‪clientfield::set_player_uimodel( "serverDifficulty", level.gameSkill );
1204  }
1205 
1206 
1207  }
1208 
1209  wait 1; // Update skill level once per second
1210  }
1211 }
1212 
1213 // updated the levelvar to lower or increase enemy accuracy
1215 {
1216  level ‪flagsys::wait_till( "load_main_complete" );
1217  level ‪flag::wait_till("all_players_connected");
1218 
1219  while (level.players.size > 1)
1220  {
1221  players = GetPlayers("allies");
1222 
1223  level.coop_enemy_accuracy_scalar = ‪get_coop_enemy_accuracy_modifier();
1224 
1225  wait (0.5);
1226  }
1227 
1228 }
1229 
1231 {
1232  level ‪flagsys::wait_till( "load_main_complete" );
1233  level ‪flag::wait_till("all_players_connected");
1234 
1235  while (level.players.size > 1)
1236  {
1237  // CODER_MOD : DSL - only use friendly players.
1238 
1239  players = GetPlayers("allies");
1240 
1241  level.coop_friendly_accuracy_scalar = ‪get_coop_friendly_accuracy_modifier();
1242 
1243  wait (0.5);
1244  }
1245 }
1246 
1247 
1248 // this gets called everytime an axis spawns in
1250 {
1251  self endon ("death");
1252 
1253  // use the GDT value as the starting point
1254  initialValue = self.baseAccuracy;
1255 
1256  self.baseAccuracy = initialValue * ‪get_coop_enemy_accuracy_modifier();
1257 
1258  //level waittill ("player_disconnected");
1259  wait randomfloatrange(3,5);
1260 
1261 
1262 }
1263 
1264 
1265 // this gets called everytime an axis spawns in
1267 {
1268  self endon ("death");
1269 
1270  // use the GDT value as the starting point
1271  initialValue = self.baseAccuracy;
1272 
1273  while (level.players.size > 1)
1274  {
1275  if( !isdefined( level.coop_friendly_accuracy_scalar ) )
1276  {
1277  wait 0.5;
1278  continue;
1279  }
1280 
1281  self.baseAccuracy = initialValue * level.coop_friendly_accuracy_scalar;
1282 
1283  //level waittill ("player_disconnected");
1284  wait randomfloatrange(3,5);
1285  }
1286 }
1287 
1288 // to make the enemies shoot at players more often
1290 {
1291  while (1)
1292  {
1293  // we don't need to do this all the time, only if players drop out
1294  wait 5;
1295 
1296  if ( level.auto_adjust_threatbias )
1297  {
1298  players = GetPlayers("allies");
1299 
1300  // the usual threat bias times some scalar
1301  for( i = 0; i < players.size; i++ )
1302  {
1303  // adjust according to the setup system
1305  }
1306  }
1307  }
1308 }
1309 
1311 {
1312  level.auto_adjust_threatbias = true;
1313 
1314  // get the scalar value for threat bias
1315  players = level.players;
1316  level.coop_player_threatbias_scalar = ‪get_coop_friendly_threat_bias_scalar();
1317 
1318  if (!isdefined(level.coop_player_threatbias_scalar))
1319  {
1320  level.coop_player_threatbias_scalar = 1;
1321  }
1322 
1323  player.threatbias = int( ‪get_player_threat_bias() * level.coop_player_threatbias_scalar);
1324 }
1325 
1326 // The following functions grab variable values from the gdt scriptbundles for difficulty
1327 
1328 function ‪setDiffStructArrays() //called each time a variable is grabbed for live updates while debugging, for performance, should probably be done once at start for shipping game
1329 {
1330  reload = false;
1331 
1332  if ( reload || !isdefined( level.s_game_difficulty ) )
1333  {
1334  level.s_game_difficulty = [];
1335  level.s_game_difficulty[ 0 ] = ‪struct::get_script_bundle( "gamedifficulty", "gamedifficulty_easy" );
1336  level.s_game_difficulty[ 1 ] = ‪struct::get_script_bundle( "gamedifficulty", "gamedifficulty_medium" );
1337  level.s_game_difficulty[ 2 ] = ‪struct::get_script_bundle( "gamedifficulty", "gamedifficulty_hard" );
1338  level.s_game_difficulty[ 3 ] = ‪struct::get_script_bundle( "gamedifficulty", "gamedifficulty_veteran" );
1339  level.s_game_difficulty[ 4 ] = ‪struct::get_script_bundle( "gamedifficulty", "gamedifficulty_realistic" );
1340  }
1341 }
1342 
1344 {
1345  gameskill::setdiffstructarrays();
1346  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].threatbias;
1347 
1348  if( isDefined( diff_struct_value ))
1349  {
1350  return diff_struct_value;
1351  }
1352  else
1353  {
1354  return 0;
1355  }
1356 }
1357 
1358 
1359 // Returns the difficulty scalar applied to the player's XP
1361 {
1362  gameskill::setdiffstructarrays();
1363  diff_xp_mult = level.s_game_difficulty[ level.gameSkill ].difficulty_xp_multiplier;
1364 
1365  if( isDefined( diff_xp_mult ))
1366  {
1367  return diff_xp_mult;
1368  }
1369  else
1370  {
1371  // If no difficulty multiplier retrieved, assume no scalar.
1372  return 1;
1373  }
1374 }
1375 
1376 
1378 {
1379  gameskill::setdiffstructarrays();
1380 
1381  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].healthOverlayCutoff;
1382 
1383  if( isDefined( diff_struct_value ))
1384  {
1385  return diff_struct_value;
1386  }
1387  else
1388  {
1389  return 0;
1390  }
1391 }
1392 
1393 
1395 {
1396  gameskill::setdiffstructarrays();
1397  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].enemyPainChance;
1398 
1400 
1401  if( isDefined( diff_struct_value ))
1402  {
1403  diff_struct_value = modifier * diff_struct_value;
1404  return diff_struct_value;
1405  }
1406 
1407  if( isDefined( diff_struct_value ))
1408  {
1409  return diff_struct_value;
1410  }
1411  else
1412  {
1413  return 0;
1414  }
1415 }
1416 
1417 
1419 {
1420  gameskill::setdiffstructarrays();
1421  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].player_deathInvulnerableTime;
1422 
1423  if( isDefined( diff_struct_value ))
1424  {
1425  return diff_struct_value;
1426  }
1427  else
1428  {
1429  return 0;
1430  }
1431 }
1432 
1433 
1435 {
1436  gameskill::setdiffstructarrays();
1437  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].base_enemy_accuracy;
1438 
1439  if( isDefined( diff_struct_value ))
1440  {
1441  return diff_struct_value;
1442  }
1443  else
1444  {
1445  return 0;
1446  }
1447 }
1448 
1449 
1451 {
1452  gameskill::setdiffstructarrays();
1453  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].playerDifficultyHealth;
1454 
1455  if( isDefined( diff_struct_value ))
1456  {
1457  return diff_struct_value;
1458  }
1459  else
1460  {
1461  return 0;
1462  }
1463 }
1464 
1466 {
1467  gameskill::setdiffstructarrays();
1468  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].playerHitInvulnTime;
1469 
1471 
1472  if( isDefined( diff_struct_value ))
1473  {
1474  diff_struct_value = modifier * diff_struct_value;
1475  return diff_struct_value;
1476  }
1477  else
1478  {
1479  return 0;
1480  }
1481 }
1482 
1484 {
1485  gameskill::setdiffstructarrays();
1486  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].missTimeConstant;
1487 
1488  if( isDefined( diff_struct_value ))
1489  {
1490  return diff_struct_value;
1491  }
1492  else
1493  {
1494  return 0;
1495  }
1496 }
1497 
1499 {
1500  gameskill::setdiffstructarrays();
1501  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].missTimeResetDelay;
1502 
1503  if( isDefined( diff_struct_value ))
1504  {
1505  return diff_struct_value;
1506  }
1507  else
1508  {
1509  return 0;
1510  }
1511 }
1512 
1514 {
1515  gameskill::setdiffstructarrays();
1516  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].missTimeDistanceFactor;
1517 
1518  if( isDefined( diff_struct_value ))
1519  {
1520  return diff_struct_value;
1521  }
1522  else
1523  {
1524  return 0;
1525  }
1526 }
1527 
1529 {
1530  gameskill::setdiffstructarrays();
1531  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].dog_health;
1532 
1533  if( isDefined( diff_struct_value ))
1534  {
1535  return diff_struct_value;
1536  }
1537  else
1538  {
1539  return 0;
1540  }
1541 }
1542 
1544 {
1545  gameskill::setdiffstructarrays();
1546  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].dog_presstime;
1547 
1548  if( isDefined( diff_struct_value ))
1549  {
1550  return diff_struct_value;
1551  }
1552  else
1553  {
1554  return 0;
1555  }
1556 }
1557 
1559 {
1560  gameskill::setdiffstructarrays();
1561  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].dog_hits_before_kill;
1562 
1563  if( isDefined( diff_struct_value ))
1564  {
1565  return diff_struct_value;
1566  }
1567  else
1568  {
1569  return 0;
1570  }
1571 }
1572 
1573 
1575 {
1576  gameskill::setdiffstructarrays();
1577  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].longRegenTime;
1578 
1579  if( isDefined( diff_struct_value ))
1580  {
1581  return diff_struct_value;
1582  }
1583  else
1584  {
1585  return 0;
1586  }
1587 }
1588 
1590 {
1591  gameskill::setdiffstructarrays();
1592  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].playerHealth_RegularRegenDelay;
1593 
1594  if( isDefined( diff_struct_value ))
1595  {
1596  return diff_struct_value;
1597  }
1598  else
1599  {
1600  return 0;
1601  }
1602 }
1603 
1605 {
1606  gameskill::setdiffstructarrays();
1607  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].worthyDamageRatio;
1608 
1609  if( isDefined( diff_struct_value ))
1610  {
1611  return diff_struct_value;
1612  }
1613  else
1614  {
1615  return 0;
1616  }
1617 }
1618 
1620 {
1621  gameskill::setdiffstructarrays();
1622 
1623  switch( level.players.size )
1624  {
1625  case 1:
1626  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].one_player_coopEnemyAccuracyScalar;
1627 
1628  if( isDefined( diff_struct_value ))
1629  {
1630  return diff_struct_value;
1631  }
1632  else
1633  {
1634  return 0;
1635  }
1636  break;
1637 
1638  case 2:
1639  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].two_player_coopEnemyAccuracyScalar;
1640 
1641  if( isDefined( diff_struct_value ))
1642  {
1643  return diff_struct_value;
1644  }
1645  else
1646  {
1647  return 0;
1648  }
1649  break;
1650 
1651  case 3:
1652  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].three_player_coopEnemyAccuracyScalar;
1653 
1654  if( isDefined( diff_struct_value ))
1655  {
1656  return diff_struct_value;
1657  }
1658  else
1659  {
1660  return 0;
1661  }
1662  break;
1663 
1664  case 4:
1665  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].four_player_coopEnemyAccuracyScalar;
1666 
1667  if( isDefined( diff_struct_value ))
1668  {
1669  return diff_struct_value;
1670  }
1671  else
1672  {
1673  return 0;
1674  }
1675  break;
1676  }
1677  return 1;
1678 }
1679 
1681 {
1682  gameskill::setdiffstructarrays();
1683 
1684  switch( level.players.size )
1685  {
1686  case 1:
1687  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].one_player_coopFriendlyAccuracyScalar;
1688 
1689  if( isDefined( diff_struct_value ))
1690  {
1691  return diff_struct_value;
1692  }
1693  else
1694  {
1695  return 0;
1696  }
1697  break;
1698 
1699  case 2:
1700  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].two_player_coopFriendlyAccuracyScalar;
1701 
1702  if( isDefined( diff_struct_value ))
1703  {
1704  return diff_struct_value;
1705  }
1706  else
1707  {
1708  return 0;
1709  }
1710  break;
1711 
1712  case 3:
1713  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].three_player_coopFriendlyAccuracyScalar;
1714 
1715  if( isDefined( diff_struct_value ))
1716  {
1717  return diff_struct_value;
1718  }
1719  else
1720  {
1721  return 0;
1722  }
1723  break;
1724 
1725  case 4:
1726  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].four_player_coopFriendlyAccuracyScalar;
1727 
1728  if( isDefined( diff_struct_value ))
1729  {
1730  return diff_struct_value;
1731  }
1732  else
1733  {
1734  return 0;
1735  }
1736  break;
1737 
1738  default: return 1;
1739  }
1740 
1741 }
1742 
1744 {
1745  gameskill::setdiffstructarrays();
1746 
1747  switch( level.players.size )
1748  {
1749  case 1:
1750  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].one_player_coopFriendlyThreatBiasScalar;
1751 
1752  if( isDefined( diff_struct_value ))
1753  {
1754  return diff_struct_value;
1755  }
1756  else
1757  {
1758  return 0;
1759  }
1760  break;
1761 
1762  case 2:
1763  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].two_player_coopFriendlyThreatBiasScalar;
1764 
1765  if( isDefined( diff_struct_value ))
1766  {
1767  return diff_struct_value;
1768  }
1769  else
1770  {
1771  return 0;
1772  }
1773  break;
1774 
1775  case 3:
1776  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].three_player_coopFriendlyThreatBiasScalar;
1777 
1778  if( isDefined( diff_struct_value ))
1779  {
1780  return diff_struct_value;
1781  }
1782  else
1783  {
1784  return 0;
1785  }
1786  break;
1787 
1788  case 4:
1789  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].four_player_coopFriendlyThreatBiasScalar;
1790 
1791  if( isDefined( diff_struct_value ))
1792  {
1793  return diff_struct_value;
1794  }
1795  else
1796  {
1797  return 0;
1798  }
1799  break;
1800 
1801  default: return 1;
1802  }
1803 
1804 }
1805 
1807 {
1808  gameskill::setdiffstructarrays();
1809 
1810  switch( level.players.size )
1811  {
1812  case 1:
1813  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].one_player_coopPlayerDifficultyHealth;
1814 
1815  if( isDefined( diff_struct_value ))
1816  {
1817  return diff_struct_value;
1818  }
1819  else
1820  {
1821  return 0;
1822  }
1823  break;
1824 
1825  case 2:
1826  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].two_player_coopPlayerDifficultyHealth;
1827 
1828  if( isDefined( diff_struct_value ))
1829  {
1830  return diff_struct_value;
1831  }
1832  else
1833  {
1834  return 0;
1835  }
1836  break;
1837 
1838  case 3:
1839  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].three_player_coopPlayerDifficultyHealth;
1840 
1841  if( isDefined( diff_struct_value ))
1842  {
1843  return diff_struct_value;
1844  }
1845  else
1846  {
1847  return 0;
1848  }
1849  break;
1850 
1851  case 4:
1852  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].four_player_coopPlayerDifficultyHealth;
1853 
1854  if( isDefined( diff_struct_value ))
1855  {
1856  return diff_struct_value;
1857  }
1858  else
1859  {
1860  return 0;
1861  }
1862  break;
1863 
1864  default: return 1;
1865  }
1866 
1867 }
1868 
1870 {
1871  gameskill::setdiffstructarrays();
1872 
1873  switch( level.players.size )
1874  {
1875  case 1:
1876  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].one_player_deathInvulnerableTimeModifier;
1877 
1878  if( isDefined( diff_struct_value ))
1879  {
1880  return diff_struct_value;
1881  }
1882  else
1883  {
1884  return 0;
1885  }
1886  break;
1887 
1888  case 2:
1889  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].two_player_deathInvulnerableTimeModifier;
1890 
1891  if( isDefined( diff_struct_value ))
1892  {
1893  return diff_struct_value;
1894  }
1895  else
1896  {
1897  return 0;
1898  }
1899  break;
1900 
1901  case 3:
1902  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].three_player_deathInvulnerableTimeModifier;
1903 
1904  if( isDefined( diff_struct_value ))
1905  {
1906  return diff_struct_value;
1907  }
1908  else
1909  {
1910  return 0;
1911  }
1912  break;
1913 
1914  case 4:
1915  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].four_player_deathInvulnerableTimeModifier;
1916 
1917  if( isDefined( diff_struct_value ))
1918  {
1919  return diff_struct_value;
1920  }
1921  else
1922  {
1923  return 0;
1924  }
1925  break;
1926 
1927  default: return 1;
1928  }
1929 }
1930 
1931 
1933 {
1934  gameskill::setdiffstructarrays();
1935 
1936  switch( level.players.size )
1937  {
1938  case 1:
1939  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].one_player_hit_invulnerability_modifier;
1940 
1941  if( isDefined( diff_struct_value ))
1942  {
1943  return diff_struct_value;
1944  }
1945  else
1946  {
1947  return 0;
1948  }
1949  break;
1950 
1951  case 2:
1952  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].two_player_hit_invulnerability_modifier;
1953 
1954  if( isDefined( diff_struct_value ))
1955  {
1956  return diff_struct_value;
1957  }
1958  else
1959  {
1960  return 0;
1961  }
1962  break;
1963 
1964  case 3:
1965  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].three_player_hit_invulnerability_modifier;
1966 
1967  if( isDefined( diff_struct_value ))
1968  {
1969  return diff_struct_value;
1970  }
1971  else
1972  {
1973  return 0;
1974  }
1975  break;
1976 
1977  case 4:
1978  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].four_player_hit_invulnerability_modifier;
1979 
1980  if( isDefined( diff_struct_value ))
1981  {
1982  return diff_struct_value;
1983  }
1984  else
1985  {
1986  return 0;
1987  }
1988  break;
1989  }
1990  return 1;
1991 }
1992 
1993 
1995 {
1996  gameskill::setdiffstructarrays();
1997 
1998  switch( level.players.size )
1999  {
2000  case 1:
2001  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].one_player_enemy_pain_chance_modifier;
2002 
2003  if( isDefined( diff_struct_value ))
2004  {
2005  return diff_struct_value;
2006  }
2007  else
2008  {
2009  return 0;
2010  }
2011  break;
2012 
2013  case 2:
2014  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].two_player_enemy_pain_chance_modifier;
2015 
2016  if( isDefined( diff_struct_value ))
2017  {
2018  return diff_struct_value;
2019  }
2020  else
2021  {
2022  return 0;
2023  }
2024  break;
2025 
2026  case 3:
2027  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].three_player_enemy_pain_chance_modifier;
2028 
2029  if( isDefined( diff_struct_value ))
2030  {
2031  return diff_struct_value;
2032  }
2033  else
2034  {
2035  return 0;
2036  }
2037  break;
2038 
2039  case 4:
2040  diff_struct_value = level.s_game_difficulty[ level.gameSkill ].four_player_enemy_pain_chance_modifier;
2041 
2042  if( isDefined( diff_struct_value ))
2043  {
2044  return diff_struct_value;
2045  }
2046  else
2047  {
2048  return 0;
2049  }
2050  break;
2051  }
2052  return 1;
2053 }
2054 
2055 
2057 {
2058  // "0-5" + "1-4" = 0 - 9 scale
2059  value = level.gameSkill + level.players.size -1;
2060 
2061  if( value < 0 )
2062  value = 0;
2063 
2064  return value;
2065 }
2066 
2068 {
2069  player = self;
2070 
2071  if( level.gameSkill >= 4 ) //death invulnerability is disabled for Realistic
2072  {
2073  return false;
2074  }
2075 
2076  if( !isDefined( self.eligible_for_death_invulnerability ))
2077  {
2078  self.eligible_for_death_invulnerability = true;
2079  }
2080 
2081  return self.eligible_for_death_invulnerability;
2082 
2083 }
2084 
2086 {
2087  self endon( "disconnect" );
2088  self endon( "death" );
2089 
2090  while( !self.eligible_for_death_invulnerability )
2091  {
2092  if( self.health >= self.maxhealth )
2093  {
2094  self.eligible_for_death_invulnerability = true ;
2095  }
2096 
2097  wait 0.05;
2098  }
2099 
2100 }
2101 
2102 function ‪adjust_damage_for_player_health( player, eAttacker, eInflictor, iDamage, weapon, sHitLoc, sMeansOfDamage )
2103 {
2104  coop_healthscalar = ‪get_coop_player_health_modifier();
2105  player_difficulty_health = ‪get_player_difficulty_health() * coop_healthscalar;
2106  player_damage_difficulty_modifier = 100 / player_difficulty_health;
2107 
2108  iDamage = iDamage * player_damage_difficulty_modifier;
2109 
2110  return iDamage;
2111 }
2112 
2113 #define MAX_MELEE_DAMAGE_FROM_BEHIND 40
2114 function ‪adjust_melee_damage( player, eAttacker, eInflictor, iDamage, weapon, sHitLoc, sMeansOfDamage )
2115 {
2116  if ( ( sMeansOfDamage == "MOD_MELEE" || sMeansOfDamage == "MOD_MELEE_WEAPON_BUTT" ) && IsEntity( eAttacker ) )
2117  {
2118  iDamage = iDamage/5; //adjust melee damage vs. player because melee against enemies was increased greatly
2119 
2120  if ( iDamage > ‪MAX_MELEE_DAMAGE_FROM_BEHIND )
2121  {
2122  playerForward = AnglesToForward( player.angles );
2123  toAttacker = VectorNormalize( eAttacker.origin - player.origin );
2124 
2125  // cos(70) = 0.342
2126  // Dampen all melee damage that comes from behind the player.
2127  if ( VectorDot( playerForward, toAttacker ) < 0.342 )
2128  {
2130  }
2131  }
2132  }
2133 
2134  return iDamage;
2135 }
2136 
2138 {
2139  self endon( "death" );
2140 
2141  self.baseaccuracy = self.accuracy;//store out the gdt accuracy value as the baseline that we can return to
2142 }
2143 
2145 {
2146  self endon( "death" );
2147 
2148  if ( GetDvarInt( "ai_codeGameskill" ) )
2149  {
2150  return;
2151  }
2152 
2153  while ( true )
2154  {
2155  if( isDefined( ai.enemy ) )
2156  {
2157  if( isPlayer( ai.enemy ))//only modify the enemy accuracy if they are targeting a player
2158  {
2159  if( !isDefined( ai.lastEnemyShotAt ) )
2160  {
2161  ai.lastEnemyShotAt = ai.enemy;
2162  ai.buildupAccuracyModifier = 0;//if lastEnemyShotAt is undefined, this should be the first time the AI is shooting at this enemy
2163  ai.shootTimeStart = GetTime();
2164  ai.lastShotTime = ai.shootTimeStart;
2165  }
2166 
2167  if( ai.enemy != ai.lastEnemyShotAt )// if it's the first shot at a target, set the accuracy to 0
2168  {
2169  ai.lastEnemyShotAt = ai.enemy;
2170  ai.buildupAccuracyModifier = 0;
2171  ai.shootTimeStart = GetTime();
2172  ai.lastShotTime = ai.shootTimeStart;
2173  }
2174  else
2175  {
2176  //Gather factors from gamedifficulty GDT's
2177  ai.miss_time_constant = ‪get_miss_time_constant();
2178  ai.miss_time_distance_factor = ‪get_miss_time_distance_factor();
2179  ai.miss_time_reset_delay = ‪get_miss_time_reset_delay();
2180  if( ai.accurateFire )
2181  {
2182  ai.miss_time_reset_delay *=2; //double miss time reset for accurate fire AI due to lower fire rate
2183  }
2184  shotTime = GetTime();
2185  timeShooting = shotTime - ai.shootTimeStart;
2186 
2187  //Get Distance from shooter to target and calculate accuracy build up time
2188  distance = Distance( ai.origin, ai.enemy.origin );
2189  missTime = ai.miss_time_constant * 1000; //converts miss time to ms for later calculations
2190  accuracyBuildupTime = missTime + ( distance * ai.miss_time_distance_factor );
2191 
2192  //Modify build up time if shooter is behind or to the side of the target
2193  targetFacingAngle = AnglesToForward( ai.enemy.angles );
2194  angleFromTarget = VectorNormalize( ai.origin - ai.enemy.origin );
2195 
2196  if( VectorDot( targetFacingAngle, angleFromTarget ) < 0.7)
2197  {
2198  accuracyBuildupTime *= 2;
2199  }
2200 
2201  //If time between this shot and the last one is greater than Miss Time Reset Delay, set accuracy back to 0, and set shootTimeStart and last shot time to current time
2202  if( shotTime - ai.lastShotTime > ai.miss_time_reset_delay )
2203  {
2204  ai.buildupAccuracyModifier = 0;
2205  ai.shootTimeStart = shotTime;
2206  timeShooting = 0;
2207  }
2208 
2209  //If the difference between GetTime and shootTimeStart is greater than buildup time, set buildupAccuracyModifier to 1
2210  if( timeShooting > accuracyBuildupTime )
2211  {
2212  ai.buildupAccuracyModifier = 1;
2213  }
2214 
2215  //If the time spent shooting is less than the accuracy build up time, modify the accuracy according to how much time was spent shooting
2216  //This was broken into steps as a linear build up wasn't very noticeable
2217  if( timeShooting <= accuracyBuildupTime && timeShooting > accuracyBuildupTime * 0.66)
2218  {
2219  ai.buildupAccuracyModifier = 0.66;
2220  }
2221 
2222  if( timeShooting <= accuracyBuildupTime * 0.66 && timeShooting > accuracyBuildupTime * 0.33)
2223  {
2224  ai.buildupAccuracyModifier = 0.33;
2225  }
2226 
2227  if( timeShooting <= accuracyBuildupTime * 0.33 )
2228  {
2229  ai.buildupAccuracyModifier = 0;
2230  }
2231 
2232  ai.lastShotTime = shotTime; //sets the last shot time to the current shot time for next iteration
2233  }
2234  }
2235  else
2236  {
2237  ai.buildupAccuracyModifier = 1;// this resets the AI accuracy if they are not shooting a player
2238  }
2239 
2240  ai.accuracy = ai.baseaccuracy * ai.buildupAccuracyModifier;
2241  }
2242 
2243  self waittill( "about_to_shoot" );
2244  }
2245 }
‪get_coop_hit_invulnerability_modifier
‪function get_coop_hit_invulnerability_modifier()
Definition: gameskill_shared.gsc:1932
‪mayChangeCoverWarningAlpha
‪function mayChangeCoverWarningAlpha(coverWarning)
Definition: gameskill_shared.gsc:872
‪coop_friendly_accuracy_scalar_watcher
‪function coop_friendly_accuracy_scalar_watcher()
Definition: gameskill_shared.gsc:1230
‪MIN_DIFFICULTY_REPORT_INDEX
‪#define MIN_DIFFICULTY_REPORT_INDEX
Definition: shared.gsh:903
‪destroyHealthDebug
‪function destroyHealthDebug()
Definition: gameskill_shared.gsc:299
‪shouldShowCoverWarning
‪function shouldShowCoverWarning()
Definition: gameskill_shared.gsc:944
‪fontScaler
‪function fontScaler(scale, timer)
Definition: gameskill_shared.gsc:887
‪new_style_health_overlay
‪function new_style_health_overlay()
Definition: gameskill_shared.gsc:698
‪get_player_hit_invuln_time
‪function get_player_hit_invuln_time()
Definition: gameskill_shared.gsc:1465
‪get_worthy_damage_ratio
‪function get_worthy_damage_ratio()
Definition: gameskill_shared.gsc:1604
‪get_miss_time_distance_factor
‪function get_miss_time_distance_factor()
Definition: gameskill_shared.gsc:1513
‪get_coop_player_death_invulnerable_time_modifier
‪function get_coop_player_death_invulnerable_time_modifier()
Definition: gameskill_shared.gsc:1869
‪coop_enemy_accuracy_scalar_watcher
‪function coop_enemy_accuracy_scalar_watcher()
Definition: gameskill_shared.gsc:1214
‪timer
‪function timer(n_time, str_endon, x, y, height)
Definition: lui_shared.gsc:163
‪coopGame
‪function coopGame()
Definition: util_shared.gsc:1431
‪accuracy_buildup_over_time_init
‪function accuracy_buildup_over_time_init()
Definition: gameskill_shared.gsc:2137
‪coop_player_threat_bias_adjuster
‪function coop_player_threat_bias_adjuster()
Definition: gameskill_shared.gsc:1289
‪get_base_enemy_accuracy
‪function get_base_enemy_accuracy()
Definition: gameskill_shared.gsc:1434
‪set_difficulty_from_locked_settings
‪function set_difficulty_from_locked_settings()
Definition: gameskill_shared.gsc:124
‪clear
‪function clear(str_flag)
Definition: flag_shared.csc:130
‪coop_damage_and_accuracy_scaling
‪function coop_damage_and_accuracy_scaling(difficulty_func)
Definition: gameskill_shared.gsc:120
‪grenadeAwareness
‪function grenadeAwareness()
Definition: gameskill_shared.gsc:609
‪get_coop_player_health_modifier
‪function get_coop_player_health_modifier()
Definition: gameskill_shared.gsc:1806
‪empty_kill_func
‪function empty_kill_func(type, loc, point, attacker, amount)
Definition: gameskill_shared.gsc:1126
‪coop_axis_accuracy_scaler
‪function coop_axis_accuracy_scaler()
Definition: gameskill_shared.gsc:1249
‪playerInvul
‪function playerInvul(timer)
Definition: gameskill_shared.gsc:584
‪setDiffStructArrays
‪function setDiffStructArrays()
Definition: gameskill_shared.gsc:1328
‪get_enemy_pain_chance
‪function get_enemy_pain_chance()
Definition: gameskill_shared.gsc:1394
‪coop_allies_accuracy_scaler
‪function coop_allies_accuracy_scaler()
Definition: gameskill_shared.gsc:1266
‪pain_protection_check
‪function pain_protection_check()
Definition: gameskill_shared.gsc:153
‪destroy_warning_elem
‪function destroy_warning_elem(fadeout)
Definition: gameskill_shared.gsc:857
‪adjust_melee_damage
‪function adjust_melee_damage(player, eAttacker, eInflictor, iDamage, weapon, sHitLoc, sMeansOfDamage)
Definition: gameskill_shared.gsc:2114
‪get_dog_health
‪function get_dog_health()
Definition: gameskill_shared.gsc:1528
‪get_coop_enemy_accuracy_modifier
‪function get_coop_enemy_accuracy_modifier()
Definition: gameskill_shared.gsc:1619
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪apply_difficulty_var_with_func
‪function apply_difficulty_var_with_func(difficulty_func)
Definition: gameskill_shared.gsc:81
‪pain_protection
‪function pain_protection()
Definition: gameskill_shared.gsc:143
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪playerheartbeatloop
‪function playerheartbeatloop(healthcap)
Definition: gameskill_shared.gsc:646
‪healthfadeOffWatcher
‪function healthfadeOffWatcher(overlay, timeToFadeOut)
Definition: gameskill_shared.gsc:682
‪accuracy_buildup_before_fire
‪function accuracy_buildup_before_fire(ai)
Definition: gameskill_shared.gsc:2144
‪setTakeCoverWarnings
‪function setTakeCoverWarnings()
Definition: gameskill_shared.gsc:1078
‪destroy_warning_elem_when_mission_failed
‪function destroy_warning_elem_when_mission_failed(player)
Definition: gameskill_shared.gsc:846
‪fadeFunc
‪function fadeFunc(overlay, coverWarning, severity, mult, hud_scaleOnly)
Definition: gameskill_shared.gsc:992
‪always_pain
‪function always_pain()
Definition: gameskill_shared.gsc:136
‪get_player_health_regular_regen_delay
‪function get_player_health_regular_regen_delay()
Definition: gameskill_shared.gsc:1589
‪waitTillPlayerIsHitAgain
‪function waitTillPlayerIsHitAgain()
Definition: gameskill_shared.gsc:839
‪get_player_death_invulnerable_time
‪function get_player_death_invulnerable_time()
Definition: gameskill_shared.gsc:1418
‪get_coop_friendly_threat_bias_scalar
‪function get_coop_friendly_threat_bias_scalar()
Definition: gameskill_shared.gsc:1743
‪increment_take_cover_warnings_on_death
‪function increment_take_cover_warnings_on_death()
Definition: gameskill_shared.gsc:1094
‪add_hudelm_position_internal
‪function add_hudelm_position_internal(alignY)
Definition: gameskill_shared.gsc:771
‪adjust_damage_for_player_health
‪function adjust_damage_for_player_health(player, eAttacker, eInflictor, iDamage, weapon, sHitLoc, sMeansOfDamage)
Definition: gameskill_shared.gsc:2102
‪get_player_xp_difficulty_multiplier
‪function get_player_xp_difficulty_multiplier()
Definition: gameskill_shared.gsc:1360
‪get_miss_time_reset_delay
‪function get_miss_time_reset_delay()
Definition: gameskill_shared.gsc:1498
‪apply_threat_bias_to_all_players
‪function apply_threat_bias_to_all_players(difficulty_func)
Definition: gameskill_shared.gsc:109
‪waittill_any
‪function waittill_any(str_notify1, str_notify2, str_notify3, str_notify4, str_notify5)
Definition: util_shared.csc:375
‪get_general_difficulty_level
‪function get_general_difficulty_level()
Definition: gameskill_shared.gsc:2056
‪get_long_regen_time
‪function get_long_regen_time()
Definition: gameskill_shared.gsc:1574
‪init
‪function autoexec init()
Definition: gameskill_shared.gsc:14
‪wait_till
‪function wait_till(str_flag)
Definition: flag_shared.csc:189
‪alliesAccuracyControl
‪function alliesAccuracyControl()
Definition: gameskill_shared.gsc:333
‪update_skill_level
‪function update_skill_level(skill_override)
Definition: gameskill_shared.gsc:1130
‪get_coop_friendly_accuracy_modifier
‪function get_coop_friendly_accuracy_modifier()
Definition: gameskill_shared.gsc:1680
‪healthOverlay_remove
‪function healthOverlay_remove(overlay)
Definition: gameskill_shared.gsc:1059
‪setSkill
‪function setSkill(reset, skill_override)
Definition: gameskill_shared.gsc:20
‪Spawn
‪function Spawn(parent, onDeathCallback)
Definition: _flak_drone.gsc:427
‪player_eligible_for_death_invulnerability
‪function player_eligible_for_death_invulnerability()
Definition: gameskill_shared.gsc:2067
‪cover_warning_check
‪function cover_warning_check()
Definition: gameskill_shared.gsc:898
‪get_health_overlay_cutoff
‪function get_health_overlay_cutoff()
Definition: gameskill_shared.gsc:1377
‪healthOverlay
‪function healthOverlay()
Definition: gameskill_shared.gsc:763
‪get_coop_enemy_pain_chance_modifier
‪function get_coop_enemy_pain_chance_modifier()
Definition: gameskill_shared.gsc:1994
‪enable_auto_adjust_threatbias
‪function enable_auto_adjust_threatbias(player)
Definition: gameskill_shared.gsc:1310
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪printHealthDebug
‪function printHealthDebug()
Definition: gameskill_shared.gsc:185
‪playerHealthRegen
‪function playerHealthRegen()
Definition: gameskill_shared.gsc:425
‪set_player_uimodel
‪function set_player_uimodel(str_field_name, n_value)
Definition: clientfield_shared.gsc:75
‪create_warning_elem
‪function create_warning_elem(player)
Definition: gameskill_shared.gsc:810
‪destroy
‪function destroy(watcher, owner)
Definition: _decoy.gsc:108
‪get_script_bundle
‪function get_script_bundle(str_type, str_name)
Definition: struct.csc:45
‪MAX_MELEE_DAMAGE_FROM_BEHIND
‪#define MAX_MELEE_DAMAGE_FROM_BEHIND
Definition: gameskill_shared.gsc:2113
‪reduceTakeCoverWarnings
‪function reduceTakeCoverWarnings()
Definition: gameskill_shared.gsc:568
‪get_locked_difficulty_val
‪function get_locked_difficulty_val(msg, ignored)
Definition: gameskill_shared.gsc:131
‪axisAccuracyControl
‪function axisAccuracyControl()
Definition: gameskill_shared.gsc:320
‪get_miss_time_constant
‪function get_miss_time_constant()
Definition: gameskill_shared.gsc:1483
‪get_player_threat_bias
‪function get_player_threat_bias()
Definition: gameskill_shared.gsc:1343
‪playerHurtcheck
‪function playerHurtcheck()
Definition: gameskill_shared.gsc:342
‪set_console_status
‪function set_console_status()
Definition: util_shared.gsc:1899
‪get_dog_hits_before_kill
‪function get_dog_hits_before_kill()
Definition: gameskill_shared.gsc:1558
‪delayed_delete
‪function delayed_delete(ent, time)
Definition: gameskill_shared.gsc:674
‪death_notify_wrapper
‪function death_notify_wrapper(attacker, damageType)
Definition: util_shared.gsc:1070
‪get_player_difficulty_health
‪function get_player_difficulty_health()
Definition: gameskill_shared.gsc:1450
‪get_dog_press_time
‪function get_dog_press_time()
Definition: gameskill_shared.gsc:1543
‪monitor_player_death_invulnerability_eligibility
‪function monitor_player_death_invulnerability_eligibility()
Definition: gameskill_shared.gsc:2085
‪play_hurt_vox
‪function play_hurt_vox()
Definition: gameskill_shared.gsc:824
‪MAX_DIFFICULTY_REPORT_INDEX
‪#define MAX_DIFFICULTY_REPORT_INDEX
Definition: shared.gsh:904
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265