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