diff --git a/src/GameLogic/IGameContext.cs b/src/GameLogic/IGameContext.cs
index 27ed23704..76a5bf083 100644
--- a/src/GameLogic/IGameContext.cs
+++ b/src/GameLogic/IGameContext.cs
@@ -103,7 +103,7 @@ public interface IGameContext
DuelRoomManager DuelRoomManager { get; }
///
- /// Gets the state of the active self defenses.
+ /// Gets the state of the active self defenses. The datetime holds the timestamp when self-defense ends.
///
ConcurrentDictionary<(Player Attacker, Player Defender), DateTime> SelfDefenseState { get; }
diff --git a/src/GameLogic/Player.cs b/src/GameLogic/Player.cs
index 70e806708..90a185c01 100644
--- a/src/GameLogic/Player.cs
+++ b/src/GameLogic/Player.cs
@@ -610,7 +610,7 @@ public bool IsAnySelfDefenseActive()
var hitInfo = await attacker.CalculateDamageAsync(this, skill, isCombo, damageFactor).ConfigureAwait(false);
- if (hitInfo.HealthDamage == 0)
+ if (hitInfo is { HealthDamage: 0, ShieldDamage: 0 })
{
await this.InvokeViewPlugInAsync(p => p.ShowHitAsync(this, hitInfo)).ConfigureAwait(false);
if (attacker is IWorldObserver observer)
diff --git a/src/GameLogic/PlugIns/SelfDefensePlugIn.cs b/src/GameLogic/PlugIns/SelfDefensePlugIn.cs
index e9f70c71d..3a7c7da51 100644
--- a/src/GameLogic/PlugIns/SelfDefensePlugIn.cs
+++ b/src/GameLogic/PlugIns/SelfDefensePlugIn.cs
@@ -24,9 +24,8 @@ public class SelfDefensePlugIn : IPeriodicTaskPlugIn, IAttackableGotHitPlugIn, I
///
public async ValueTask ExecuteTaskAsync(GameContext gameContext)
{
- var configuration = this.Configuration ??= CreateDefaultConfiguration();
- var timedOut = gameContext.SelfDefenseState.Where(s => DateTime.UtcNow.Subtract(s.Value) >= configuration.SelfDefenseTimeOut).ToList();
- foreach (var (pair, lastAttack) in timedOut)
+ var timedOut = gameContext.SelfDefenseState.Where(s => s.Value < DateTime.UtcNow).ToList();
+ foreach (var (pair, _) in timedOut)
{
if (gameContext.SelfDefenseState.Remove(pair, out _))
{
@@ -80,16 +79,16 @@ public void AttackableGotHit(IAttackable attackable, IAttacker attacker, HitInfo
return;
}
- var now = DateTime.UtcNow;
+ var timeout = DateTime.UtcNow.Add(this.Configuration?.SelfDefenseTimeOut ?? TimeSpan.FromMinutes(1));
var gameContext = defender.GameContext;
gameContext.SelfDefenseState.AddOrUpdate(
(attackerPlayer, defender),
tuple =>
{
_ = this.BeginSelfDefenseAsync(attackerPlayer, defender);
- return now;
+ return timeout;
},
- (_, _) => now);
+ (_, _) => timeout);
}
///