diff --git a/Ragon/Sources/Application.cs b/Ragon/Sources/Application.cs index 36f1773..f311fef 100755 --- a/Ragon/Sources/Application.cs +++ b/Ragon/Sources/Application.cs @@ -26,7 +26,7 @@ namespace Ragon.Core for (var i = 0; i < threadsCount; i++) { - var roomThread = new RoomThread(factory); + var roomThread = new RoomThread(factory, configuration); _roomThreadCounter.Add(roomThread, 0); _roomThreads.Add(roomThread); } diff --git a/Ragon/Sources/ENetServer.cs b/Ragon/Sources/ENetServer.cs index 9c0e078..560928e 100755 --- a/Ragon/Sources/ENetServer.cs +++ b/Ragon/Sources/ENetServer.cs @@ -64,19 +64,27 @@ namespace Ragon.Core if (data.Type == EventType.DATA) { var newPacket = new Packet(); - var packetFlags = PacketFlags.Instant; + byte channel = 1; + if (data.Delivery == DeliveryType.Reliable) + { packetFlags = PacketFlags.Reliable; + channel = 0; + } else if (data.Delivery == DeliveryType.Unreliable) + { + channel = 1; packetFlags = PacketFlags.Instant; - + } + newPacket.Create(data.Data, data.Data.Length, packetFlags); - _peers[data.PeerId].Send(0, ref newPacket); + _peers[data.PeerId].Send(channel, ref newPacket); } else if (data.Type == EventType.DISCONNECTED) { _peers[data.PeerId].DisconnectNow(0); + _receiveBuffer.Enqueue(data); } } @@ -119,7 +127,7 @@ namespace Ragon.Core case ENet.EventType.Receive: { var data = new byte[_netEvent.Packet.Length]; - + _netEvent.Packet.CopyTo(data); _netEvent.Packet.Dispose(); diff --git a/Ragon/Sources/Rooms/Room.cs b/Ragon/Sources/Rooms/Room.cs index 229b984..bcdea6f 100755 --- a/Ragon/Sources/Rooms/Room.cs +++ b/Ragon/Sources/Rooms/Room.cs @@ -12,6 +12,12 @@ namespace Ragon.Core { public class Room : IDisposable { + public int PlayersMin { get; private set; } + public int PlayersMax { get; private set; } + public int PlayersCount => _players.Count; + + public string Map { get; private set; } + private ILogger _logger = LogManager.GetCurrentClassLogger(); private Dictionary _players = new(); private Dictionary _entities = new(); @@ -19,7 +25,6 @@ namespace Ragon.Core private readonly PluginBase _plugin; private readonly RoomThread _roomThread; - private readonly string _map; private ulong _ticks = 0; // Cache @@ -27,17 +32,20 @@ namespace Ragon.Core private uint[] _allPlayers = Array.Empty(); private Entity[] _entitiesAll = Array.Empty(); - public Room(RoomThread roomThread, PluginBase pluginBase, string map) + public Room(RoomThread roomThread, PluginBase pluginBase, string map, int min, int max) { _roomThread = roomThread; _plugin = pluginBase; - _map = map; + + Map = map; + PlayersMin = min; + PlayersMax = max; _logger.Info("Room created"); _plugin.Attach(this); } - public void Joined(uint peerId, byte[] payload) + public void Joined(uint peerId, ReadOnlySpan payload) { if (_players.Count == 0) { @@ -54,24 +62,27 @@ namespace Ragon.Core }; _players.Add(peerId, player); - _allPlayers = _players.Select(p => p.Key).ToArray(); { - Span data = stackalloc byte[10]; + Span data = stackalloc byte[18]; Span operationData = data.Slice(0, 2); Span peerData = data.Slice(2, 4); Span ownerData = data.Slice(4, 4); + Span minData = data.Slice(10, 4); + Span maxData = data.Slice(14, 4); RagonHeader.WriteUShort((ushort) RagonOperation.JOIN_ROOM, ref operationData); RagonHeader.WriteInt((int) peerId, ref peerData); RagonHeader.WriteInt((int) _owner, ref ownerData); + RagonHeader.WriteInt(PlayersMin, ref minData); + RagonHeader.WriteInt(PlayersMax, ref maxData); Send(peerId, data); } { - var sceneRawData = Encoding.UTF8.GetBytes(_map).AsSpan(); + var sceneRawData = Encoding.UTF8.GetBytes(Map).AsSpan(); Span data = stackalloc byte[sceneRawData.Length + 2]; Span operationData = data.Slice(0, 2); Span sceneData = data.Slice(2, sceneRawData.Length); @@ -287,8 +298,7 @@ namespace Ragon.Core public Player GetPlayerByPeerId(uint peerId) => _players[peerId]; public Player GetOwner() => _players[_owner]; - public int PlayersCount => _players.Count; - + public void Send(uint peerId, RagonOperation operation, DeliveryType deliveryType = DeliveryType.Unreliable) { Span data = stackalloc byte[2]; diff --git a/Ragon/Sources/Rooms/RoomManager.cs b/Ragon/Sources/Rooms/RoomManager.cs index c0c5408..f96b8f0 100644 --- a/Ragon/Sources/Rooms/RoomManager.cs +++ b/Ragon/Sources/Rooms/RoomManager.cs @@ -23,7 +23,7 @@ namespace Ragon.Core _roomThread = roomThread; _factory = factory; - _manager = _factory.CreateManager(roomThread); + _manager = _factory.CreateManager(roomThread.Configuration); _rooms = new List(); _peersByRoom = new Dictionary(); } @@ -52,9 +52,9 @@ namespace Ragon.Core } } - public void OnAuthorize(uint peerId, byte[] payload) + public void OnAuthorize(uint peerId, ReadOnlySpan payload) { - if (_manager.OnAuthorize(peerId, payload)) + if (_manager.OnAuthorize(peerId, ref payload)) { Span data = stackalloc byte[2]; RagonHeader.WriteUShort((ushort) RagonOperation.AUTHORIZED_SUCCESS, ref data); @@ -92,28 +92,38 @@ namespace Ragon.Core } } - public Room Join(uint peerId, byte[] payload) + public Room Join(uint peerId, ReadOnlySpan payload) { var map = Encoding.UTF8.GetString(payload); + var min = 0; + var max = 0; + + Room room = null; if (_rooms.Count > 0) { - var existsRoom = _rooms[0]; - existsRoom.Joined(peerId, payload); - _peersByRoom.Add(peerId, existsRoom); - - return existsRoom; + foreach (var existRoom in _rooms) + { + if (existRoom.Map == map && existRoom.PlayersCount < existRoom.PlayersMax) + { + room = existRoom; + room.Joined(peerId, payload); + + _peersByRoom.Add(peerId, room); + + return room; + } + } } var plugin = _factory.CreatePlugin(map); if (plugin == null) throw new NullReferenceException($"Plugin for map {map} is null"); - var room = new Room(_roomThread, plugin, map); + room = new Room(_roomThread, plugin, map, min, max); room.Joined(peerId, payload); room.Start(); _peersByRoom.Add(peerId, room); - _rooms.Add(room); return room; diff --git a/Ragon/Sources/Storage/Storage.cs b/Ragon/Sources/Storage/Storage.cs index 5e5c28a..939b344 100644 --- a/Ragon/Sources/Storage/Storage.cs +++ b/Ragon/Sources/Storage/Storage.cs @@ -15,7 +15,7 @@ public class Storage { var db = _connection.GetDatabase(); - db.set("entity_", ) + // db.set("entity_", ) } public void UpdatePlayer()