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

111 lines
No EOL
2.4 KiB
C#

// WingsEmu
//
// Developed by NosWings Team
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using WingsEmu.Game.Characters;
using WingsEmu.Packets.Enums;
namespace WingsEmu.Game.Groups;
public class PlayerGroup
{
private readonly List<IPlayerEntity> _characters;
private readonly ReaderWriterLockSlim _lock = new();
private int _order;
public PlayerGroup(int groupId, byte slots, List<IPlayerEntity> members, long ownerId, GroupSharingType sharingMode = GroupSharingType.ByOrder)
{
GroupId = groupId;
Slots = slots;
_characters = members;
SharingMode = sharingMode;
OwnerId = ownerId;
}
public int GroupId { get; }
public GroupSharingType SharingMode { get; set; }
public byte Slots { get; }
public IReadOnlyList<IPlayerEntity> Members
{
get
{
_lock.EnterReadLock();
try
{
return _characters;
}
finally
{
_lock.ExitReadLock();
}
}
}
public long OwnerId { get; set; }
public long ArenaKills { get; set; }
public long ArenaDeaths { get; set; }
public void AddMember(IPlayerEntity character)
{
_lock.EnterWriteLock();
try
{
if (_characters.Contains(character))
{
return;
}
_characters.Add(character);
}
finally
{
_lock.ExitWriteLock();
}
}
public void RemoveMember(IPlayerEntity character)
{
_lock.EnterWriteLock();
try
{
_characters.Remove(character);
}
finally
{
_lock.ExitWriteLock();
}
}
public long? GetNextOrderedCharacterId(IPlayerEntity character)
{
_lock.EnterReadLock();
try
{
_order++;
IPlayerEntity[] characters = _characters.Where(x => x != null).ToArray();
if (_characters.Count == 0) // group seems to be empty
{
return null;
}
if (_order > _characters.Count - 1) // if order wents out of amount of ppl, reset it -> zero based index
{
_order = 0;
}
return characters[_order].Id;
}
finally
{
_lock.ExitReadLock();
}
}
}