Skip to content

Commit

Permalink
Combine damage events, fix calc
Browse files Browse the repository at this point in the history
  • Loading branch information
LucHeart committed Oct 2, 2024
1 parent 355cc38 commit 9af90f1
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 9 deletions.
51 changes: 43 additions & 8 deletions Integrations.RiskOfRain2/DamageHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,54 @@ namespace OpenShock.Integrations.RiskOfRain2;

public sealed partial class RiskOfPain
{
private Timer _actionTimer = null!;
private readonly object _receivedDamageLock = new();
private float _receivedDamage = 0;

private void ActionTimerElapsed(object state)
{
try
{
OnDamageActionExecute();
}
catch (Exception e)
{
Logger.LogError(e);
}
}

private void OnDamageActionExecute()
{
float receivedDamage;
lock (_receivedDamageLock)
{
receivedDamage = _receivedDamage;
_receivedDamage = 0;
}

var intensityByte = CalculateIntensity(receivedDamage);

Logger.LogDebug($"ActionTimerElapsed - Damage: {receivedDamage:0.00} Intensity: {intensityByte}");

ControlShockersFnf(_settingOnDamageMode.Value, intensityByte, (ushort)_settingOnDamageDuration.Value);
}

private void ClientOnDamage(DamageDealtMessage damageMessage)
{
if (_localUserCharacterBody == null || damageMessage.victim == null) return;
if (damageMessage.victim != _localUserCharacterBody.gameObject) return;

var intensityByte = CalculateIntensity(damageMessage);

Logger.LogDebug($"Player received damage: {damageMessage.damage}");

lock (_receivedDamageLock)
{
_receivedDamage += damageMessage.damage;
}

ControlShockersFnf(_settingOnDamageMode.Value, intensityByte, (ushort)_settingOnDamageDuration.Value);
_actionTimer.Change(TimeSpan.FromMilliseconds(50), Timeout.InfiniteTimeSpan);
}

private byte CalculateIntensity(DamageDealtMessage damageMessage)
private byte CalculateIntensity(float damage)
{
#pragma warning disable CS8602 // This is fine, we checked this before
var playerMaxHp = _localUserCharacterBody.healthComponent.fullCombinedHealth;
Expand All @@ -33,15 +68,15 @@ private byte CalculateIntensity(DamageDealtMessage damageMessage)
{
var scaled = onDamageBehaviour switch
{
DamageBehaviour.LowHp => playerCurrentHp / playerMaxHp * 100,
DamageBehaviour.DamagePercent => damageMessage.damage / playerMaxHp * 100,
DamageBehaviour.LowHp => playerCurrentHp / playerMaxHp,
DamageBehaviour.DamagePercent => damage / playerMaxHp,
_ => throw new Exception("This is unreachable.")
};
intensity = MathUtils.Lerp(0, _settingOnDamageIntensityLimit.Value, Math.Clamp(scaled, 0, 100));
intensity = MathUtils.Lerp(0, _settingOnDamageIntensityLimit.Value, MathUtils.Saturate(scaled));
}
else // Only other option is DamageAbsolute
{
intensity = Math.Clamp(damageMessage.damage, 0, _settingOnDamageIntensityLimit.Value);
intensity = Math.Clamp(damage, 0, _settingOnDamageIntensityLimit.Value);
}

var intensityByte = Convert.ToByte(intensity);
Expand Down
4 changes: 3 additions & 1 deletion Integrations.RiskOfRain2/RiskOfPain.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,15 @@ public sealed partial class RiskOfPain : BaseUnityPlugin
{
public static RiskOfPain Instance { get; private set; } = null!; // Singleton
public static ManualLogSource ModLogger { get; private set; } = null!; // Mod Logger for e.g. LucTask

private void Awake()
{
Logger.LogDebug("RiskOfPain loading...");

Instance = this;
ModLogger = Logger;

_actionTimer = new Timer(ActionTimerElapsed, null, Timeout.Infinite, Timeout.Infinite);

SetupConfiguration();
RegisterConfigEvents();
Expand Down
1 change: 1 addition & 0 deletions Integrations.RiskOfRain2/Utils/MathUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@
public class MathUtils
{
public static float Lerp(float min, float max, float t) => min + (max - min) * t;
public static float Saturate(float value) => value < 0 ? 0 : value > 1 ? 1 : value;
}

0 comments on commit 9af90f1

Please sign in to comment.