server-master/srcs/WingsAPI.Game/Skills/IEndBuffDamageComponent.cs
2026-02-10 18:21:30 +01:00

68 lines
No EOL
1.6 KiB
C#

using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading;
namespace WingsEmu.Game.Skills;
public interface IEndBuffDamageComponent
{
public IReadOnlyDictionary<short, int> EndBuffDamages { get; }
public void AddEndBuff(short buffVnum, int damage);
public int DecreaseDamageEndBuff(short buffVnum, int damage);
public void RemoveEndBuffDamage(short buffVnum);
}
public class EndBuffDamageComponent : IEndBuffDamageComponent
{
private readonly ConcurrentDictionary<short, int> _buffs = new();
private readonly ReaderWriterLockSlim _lock = new(LockRecursionPolicy.SupportsRecursion);
public IReadOnlyDictionary<short, int> EndBuffDamages => _buffs;
public void AddEndBuff(short buffVnum, int damage)
{
_lock.EnterWriteLock();
try
{
_buffs.TryAdd(buffVnum, damage);
}
finally
{
_lock.ExitWriteLock();
}
}
public int DecreaseDamageEndBuff(short buffVnum, int damage)
{
_lock.EnterWriteLock();
try
{
if (!_buffs.TryGetValue(buffVnum, out int damageCounter))
{
return 0;
}
damageCounter -= damage;
_buffs[buffVnum] = damageCounter;
return damageCounter;
}
finally
{
_lock.ExitWriteLock();
}
}
public void RemoveEndBuffDamage(short buffVnum)
{
_lock.EnterWriteLock();
try
{
_buffs.TryRemove(buffVnum, out _);
}
finally
{
_lock.ExitWriteLock();
}
}
}