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

104 lines
No EOL
2.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
namespace WingsEmu.Game.Mates;
public interface IMateComponent
{
IReadOnlyList<IMateEntity> TeamMembers();
IReadOnlyList<IMateEntity> TeamMembers(Func<IMateEntity, bool> predicate);
IReadOnlyList<IMateEntity> GetMates();
IReadOnlyList<IMateEntity> GetMates(Func<IMateEntity, bool> predicate);
IMateEntity GetMate(Func<IMateEntity, bool> predicate);
IMateEntity GetTeamMember(Func<IMateEntity, bool> predicate);
void AddMate(IMateEntity mateEntity);
void RemoveMate(IMateEntity mateEntity);
}
public class MateComponent : IMateComponent
{
private readonly ReaderWriterLockSlim _lock = new(LockRecursionPolicy.SupportsRecursion);
private readonly List<IMateEntity> _mates = new();
public IReadOnlyList<IMateEntity> TeamMembers()
{
return GetMates(x => x.IsTeamMember);
}
public IReadOnlyList<IMateEntity> TeamMembers(Func<IMateEntity, bool> predicate)
{
return GetMates(x => x.IsTeamMember && predicate(x));
}
public IReadOnlyList<IMateEntity> GetMates()
{
_lock.EnterReadLock();
try
{
return _mates.ToArray();
}
finally
{
_lock.ExitReadLock();
}
}
public IReadOnlyList<IMateEntity> GetMates(Func<IMateEntity, bool> predicate)
{
_lock.EnterReadLock();
try
{
return _mates.FindAll(x => x != null && (predicate == null || predicate(x)));
}
finally
{
_lock.ExitReadLock();
}
}
public IMateEntity GetMate(Func<IMateEntity, bool> predicate)
{
_lock.EnterReadLock();
try
{
return _mates.FirstOrDefault(x => x != null && (predicate == null || predicate(x)));
}
finally
{
_lock.ExitReadLock();
}
}
public IMateEntity GetTeamMember(Func<IMateEntity, bool> predicate)
{
return GetMate(x => x.IsTeamMember && predicate(x));
}
public void AddMate(IMateEntity mateEntity)
{
_lock.EnterWriteLock();
try
{
_mates.Add(mateEntity);
}
finally
{
_lock.ExitWriteLock();
}
}
public void RemoveMate(IMateEntity mateEntity)
{
_lock.EnterWriteLock();
try
{
_mates.Remove(mateEntity);
}
finally
{
_lock.ExitWriteLock();
}
}
}