1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\flag_shared;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\util_shared;
7 #using scripts\shared\visionset_mgr_shared;
8 #using scripts\shared\clientfield_shared;
10 #using scripts\zm\_util;
11 #using scripts\zm\_zm_perks;
13 #insert scripts\shared\version.gsh;
14 #insert scripts\shared\shared.gsh;
15 #insert scripts\zm\_zm_playerhealth.gsh;
17 #precache( "material", "overlay_low_health" );
19 #namespace zm_playerhealth;
30 level.difficultyType[ 0 ] =
"easy";
31 level.difficultyType[ 1 ] =
"normal";
32 level.difficultyType[ 2 ] =
"hardened";
33 level.difficultyType[ 3 ] =
"veteran";
35 level.difficultyString[
"easy" ] = &
"GAMESKILL_EASY";
36 level.difficultyString[
"normal" ] = &
"GAMESKILL_NORMAL";
37 level.difficultyString[
"hardened" ] = &
"GAMESKILL_HARDENED";
38 level.difficultyString[
"veteran" ] = &
"GAMESKILL_VETERAN";
42 switch ( level.gameSkill )
45 SetDvar (
"currentDifficulty",
"easy");
48 SetDvar (
"currentDifficulty",
"normal");
51 SetDvar (
"currentDifficulty",
"hardened");
54 SetDvar (
"currentDifficulty",
"veteran");
60 level.player_deathInvulnerableTime = 1700;
61 level.longRegenTime = 5000;
62 level.healthOverlayCutoff = 0.2;
63 level.invulTime_preShield = 0.35;
64 level.invulTime_onShield = 0.5;
65 level.invulTime_postShield = 0.3;
66 level.playerHealth_RegularRegenDelay = 2400;
67 level.worthyDamageRatio = 0.1;
82 self notify(
"noHealthOverlay" );
94 self endon(
"noHealthOverlay");
96 self.hurtAgain =
false;
99 self waittill(
"damage", amount, attacker, dir, point, mod );
101 if(isdefined(attacker) && isplayer(attacker) && attacker.team ==
self.team)
106 self.hurtAgain =
true;
107 self.damagePoint = point;
108 self.damageAttacker = attacker;
114 self notify(
"playerHealthRegen");
115 self endon (
"playerHealthRegen");
116 self endon (
"death");
117 self endon (
"disconnect");
119 if( !isdefined(
self.flag ) )
122 self.flags_lock = [];
124 if( !isdefined(
self.flag[
"player_has_red_flashing_overlay"]) )
126 self flag::init(
"player_has_red_flashing_overlay");
139 playerJustGotRedFlashing =
false;
146 if(!isdefined (
self.veryhurt))
151 self.boltHit =
false;
153 if( GetDvarString(
"scr_playerInvulTimeScale" ) ==
"" )
155 SetDvar(
"scr_playerInvulTimeScale", 1.0 );
159 playerInvulTimeScale = GetDvarFloat(
"scr_playerInvulTimeScale" );
166 if(
self.health ==
self.maxHealth )
168 if(
self flag::get(
"player_has_red_flashing_overlay" ) )
175 playerJustGotRedFlashing =
false;
180 if(
self.health <= 0 )
186 wasVeryHurt = veryHurt;
187 health_ratio =
self.health /
self.maxHealth;
189 if( health_ratio <= level.healthOverlayCutoff )
195 hurtTime = gettime();
196 self startfadingblur( 3.6, 2 );
200 self flag::set(
"player_has_red_flashing_overlay" );
201 playerJustGotRedFlashing =
true;
207 hurtTime = gettime();
208 self.hurtAgain =
false;
211 if( health_ratio >= oldratio )
213 if( gettime() - hurttime < level.playerHealth_RegularRegenDelay )
221 newHealth = health_ratio;
222 if( gettime() > hurtTime + level.longRegenTime )
224 newHealth += regenRate;
233 if( newHealth > 1.0 )
244 self setnormalhealth( newHealth );
246 oldratio =
self.health /
self.maxHealth;
251 invulWorthyHealthDrop = lastinvulRatio - health_ratio > level.worthyDamageRatio;
253 if(
self.health <= 1 )
257 self setnormalhealth( 2 /
self.maxHealth );
258 invulWorthyHealthDrop =
true;
261 oldratio =
self.health /
self.maxHealth;
263 level notify(
"hit_again" );
266 hurtTime = gettime();
267 self startfadingblur( 3, 0.8 );
270 if( !invulWorthyHealthDrop || playerInvulTimeScale <= 0.0 )
276 if(
self flag::get(
"player_is_invulnerable" ) )
279 level notify(
"player_becoming_invulnerable" );
281 if( playerJustGotRedFlashing )
283 invulTime = level.invulTime_onShield;
284 playerJustGotRedFlashing =
false;
288 invulTime = level.invulTime_postShield;
292 invulTime = level.invulTime_preShield;
295 invulTime *= playerInvulTimeScale;
298 lastinvulratio =
self.health /
self.maxHealth;
305 self endon(
"death" );
306 self endon(
"disconnect" );
319 self endon(
"disconnect" );
320 self endon(
"noHealthOverlay" );
322 if(!isdefined(
self._health_overlay))
324 self._health_overlay = newClientHudElem(
self );
325 self._health_overlay.x = 0;
326 self._health_overlay.y = 0;
327 self._health_overlay setshader(
"overlay_low_health", 640, 480 );
328 self._health_overlay.alignX =
"left";
329 self._health_overlay.alignY =
"top";
330 self._health_overlay.horzAlign =
"fullscreen";
331 self._health_overlay.vertAlign =
"fullscreen";
332 self._health_overlay.alpha = 0;
335 overlay =
self._health_overlay;
345 if ( overlay.alpha > 0 )
346 overlay fadeOverTime( 0.5 );
356 function fadeFunc( overlay, severity, mult, hud_scaleOnly )
361 fadeInTime = pulseTime * 0.1;
362 stayFullTime = pulseTime * ( .1 + severity * .2 );
363 fadeOutHalfTime = pulseTime * ( 0.1 + severity * .1 );
364 fadeOutFullTime = pulseTime * 0.3;
365 remainingTime = pulseTime - fadeInTime - stayFullTime - fadeOutHalfTime - fadeOutFullTime;
366 assert( remainingTime >= -.001 );
367 if ( remainingTime < 0 )
372 halfAlpha = 0.8 + severity * 0.1;
373 leastAlpha = 0.5 + severity * 0.3;
375 overlay fadeOverTime( fadeInTime );
376 overlay.alpha = mult * 1.0;
377 wait fadeInTime + stayFullTime;
379 overlay fadeOverTime( fadeOutHalfTime );
380 overlay.alpha = mult * halfAlpha;
381 wait fadeOutHalfTime;
383 overlay fadeOverTime( fadeOutFullTime );
384 overlay.alpha = mult * leastAlpha;
385 wait fadeOutFullTime;
392 self endon(
"death_or_disconnect");
394 while (isdefined(overlay))
396 self waittill(
"clear_red_flashing_overlay");
401 overlay fadeOverTime( 0.05 );
404 self notify(
"hit_again" );
410 self endon(
"hit_again" );
411 self endon(
"damage" );
412 self endon (
"death");
413 self endon (
"disconnect");
414 self endon(
"clear_red_flashing_overlay" );
421 self.stopFlashingBadlyTime = gettime() + level.longRegenTime;
426 while ( gettime() <
self.stopFlashingBadlyTime && isalive(
self ) && ( !
IS_TRUE(
self.is_in_process_of_zombify ) && !
IS_TRUE(
self.
is_zombie ) ) )
433 if ( isalive(
self ) )
442 overlay fadeOverTime( 0.5 );
453 self notify(
"hit_again" );
460 self endon (
"disconnect");
465 overlay fadeOverTime( 3.5 );