diff options
Diffstat (limited to 'Northstar.CustomServers/scripts/vscripts/_health_regen.gnut')
-rw-r--r-- | Northstar.CustomServers/scripts/vscripts/_health_regen.gnut | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/Northstar.CustomServers/scripts/vscripts/_health_regen.gnut b/Northstar.CustomServers/scripts/vscripts/_health_regen.gnut new file mode 100644 index 00000000..ded25dc3 --- /dev/null +++ b/Northstar.CustomServers/scripts/vscripts/_health_regen.gnut @@ -0,0 +1,172 @@ + +global function HealthRegen_Init + +global function PilotHealthRegenThinkSP +global function PilotShieldHealthUpdate + +struct +{ + float healthRegenRate +} file + +void function HealthRegen_Init() +{ + if ( IsSingleplayer() ) + { + file.healthRegenRate = 1.0 + } + else + { + file.healthRegenRate = 6.0 + AddCallback_PlayerClassChanged( HealthRegen_OnPlayerClassChangedMP ) + RegisterSignal( "PilotHealthRegenThink" ) + } +} + +void function PilotHealthRegenThinkSP( entity player ) +{ + player.EndSignal( "OnDestroy" ) + + while ( IsValid( player ) ) + { + wait( HEALTH_REGEN_TICK_TIME ) + + if ( !IsAlive( player ) ) + continue + + if ( !IsPilot( player ) ) + continue + + if ( shGlobal.proto_pilotHealthRegenDisabled ) + continue + + //Assert( IsTestMap() || player.GetPlayerSettings() == DEFAULT_PILOT_SETTINGS, "for now, we should all be pilot_solo at all times, or in a test map." ) + + if ( player.GetHealth() == player.GetMaxHealth() ) + continue + + float healthRegenRate = 4.0 + float healthRegenStartDelay = GraphCapped( player.GetHealth(), 0, player.GetMaxHealth(), 3.0, 0.8 ) + + //printt( "recentDamage " + recentDamage + " delay " + healthRegenStartDelay + " rate " + healthRegenRate ) + + if ( Time() - player.p.lastDamageTime < healthRegenStartDelay ) + { + continue + } + + player.SetHealth( min( player.GetMaxHealth(), player.GetHealth() + healthRegenRate ) ) + } +} + +bool function IsHealActive( entity player ) +{ + return StatusEffect_Get( player, eStatusEffect.stim_visual_effect ) > 0.0 +} + +void function PilotHealthRegenThinkMP( entity player ) +{ + player.EndSignal( "OnDestroy" ) + player.Signal( "PilotHealthRegenThink" ) + player.EndSignal( "PilotHealthRegenThink" ) + + //float healthRegenStartDelay = player.GetPlayerSettingsField( "powerRegenRateOp" ) // seconds after we take damager to start regen + float healthRegenStartDelay = 5.0 //Needs to use GetPlayerSettingsField() instead of hard coding, waiting on Bug 129567 + if ( PlayerHasPassive( player, ePassives.PAS_FAST_HEALTH_REGEN ) ) + healthRegenStartDelay = 2.5 + + while ( IsValid( player ) ) + { + wait( HEALTH_REGEN_TICK_TIME ) + + if ( !IsAlive( player ) ) + continue + + if ( !IsPilot( player ) ) + continue + + if ( shGlobal.proto_pilotHealthRegenDisabled ) + continue + + float healthRegenRate = file.healthRegenRate // health regen per tick + + if ( player.GetHealth() == player.GetMaxHealth() ) + continue + + // No regen during phase shift + if ( player.IsPhaseShifted() ) + continue + + if ( IsHealActive( player ) ) + { + if ( Time() - player.p.lastDamageTime < min( ABILITY_STIM_REGEN_DELAY, healthRegenStartDelay ) ) + continue + else + healthRegenRate = healthRegenRate * ABILITY_STIM_REGEN_MOD + } + else if ( Time() - player.p.lastDamageTime < healthRegenStartDelay ) + { + continue + } + + player.SetHealth( min( player.GetMaxHealth(), player.GetHealth() + healthRegenRate ) ) + if ( player.GetHealth() == player.GetMaxHealth() ) + { + ClearRecentDamageHistory( player ) + ClearLastAttacker( player ) + } + } +} + +void function HealthRegen_OnPlayerClassChangedMP( entity player ) +{ + thread PilotHealthRegenThinkMP( player ) +} + +float function PilotShieldHealthUpdate( entity player, var damageInfo ) +{ + if ( DamageInfo_GetForceKill( damageInfo ) ) + { + player.SetShieldHealth( 0 ) + return 0.0 + } + + int shieldHealth = player.GetShieldHealth() + + float shieldDamage = 0 + + if ( shieldHealth ) + { + DamageInfo_AddCustomDamageType( damageInfo, DF_SHIELD_DAMAGE ) + + shieldDamage = PilotShieldModifyDamage( player, damageInfo ) + + if ( shieldDamage ) + DamageInfo_SetDamage( damageInfo, 0 ) + } + + return shieldDamage +} + +float function PilotShieldModifyDamage( entity player, var damageInfo ) +{ + float shieldHealth = float( player.GetShieldHealth() ) + float damage = DamageInfo_GetDamage( damageInfo ) + + float newShieldHealth = shieldHealth - damage + float permanentDamage = 0.0 + + if ( newShieldHealth < 0 ) + permanentDamage = fabs( newShieldHealth ) + + player.SetShieldHealth( maxint( 0, int( newShieldHealth ) ) ) + + if ( shieldHealth && newShieldHealth <= 0 ) + { + EmitSoundOnEntity( player, "titan_energyshield_down" ) + } + + DamageInfo_SetDamage( damageInfo, permanentDamage ) + + return min( shieldHealth, damage ) +}
\ No newline at end of file |