From 85336f998e0b3f0d75849bc0d5954643e2bcba1c Mon Sep 17 00:00:00 2001 From: Edmand46 Date: Sat, 30 Jul 2022 16:02:53 +0400 Subject: [PATCH] refactor: allow set roomId from client, added base room parameters --- Ragon.Common/Protocol/RagonRoomParameters.cs | 25 ++++++++++++++ Ragon.Common/Protocol/RagonSerializer.cs | 18 ++++++++++ Ragon/Sources/Game/GameRoom.cs | 4 +-- Ragon/Sources/Lobby/Lobby.cs | 35 +++++++++++++------ Ragon/Sources/Room/RoomManager.cs | 36 +++++++++++++++----- 5 files changed, 97 insertions(+), 21 deletions(-) create mode 100644 Ragon.Common/Protocol/RagonRoomParameters.cs diff --git a/Ragon.Common/Protocol/RagonRoomParameters.cs b/Ragon.Common/Protocol/RagonRoomParameters.cs new file mode 100644 index 0000000..218fa91 --- /dev/null +++ b/Ragon.Common/Protocol/RagonRoomParameters.cs @@ -0,0 +1,25 @@ +using NetStack.Serialization; + +namespace Ragon.Common +{ + public class RagonRoomParameters: IRagonSerializable + { + public string Map { get; set; } + public int Min { get; set; } + public int Max { get; set; } + + public void Serialize(BitBuffer buffer) + { + buffer.AddString(Map); + buffer.AddInt(Min); + buffer.AddInt(Max); + } + + public void Deserialize(BitBuffer buffer) + { + Map = buffer.ReadString(); + Min = buffer.ReadInt(); + Max = buffer.ReadInt(); + } + } +} \ No newline at end of file diff --git a/Ragon.Common/Protocol/RagonSerializer.cs b/Ragon.Common/Protocol/RagonSerializer.cs index d06cba5..1b70bd8 100644 --- a/Ragon.Common/Protocol/RagonSerializer.cs +++ b/Ragon.Common/Protocol/RagonSerializer.cs @@ -38,6 +38,24 @@ namespace Ragon.Common return value; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteBool(bool value) + { + ResizeIfNeed(1); + + _data[_offset] = value ? (byte) 1 : (byte) 0; + _offset += 1; + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool ReadBool() + { + var value = _data[_offset]; + _offset += 1; + return value == 1; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteInt(int value) { diff --git a/Ragon/Sources/Game/GameRoom.cs b/Ragon/Sources/Game/GameRoom.cs index 318bb2a..cc581c1 100755 --- a/Ragon/Sources/Game/GameRoom.cs +++ b/Ragon/Sources/Game/GameRoom.cs @@ -29,7 +29,7 @@ namespace Ragon.Core private uint[] _allPlayers = Array.Empty(); private Entity[] _entitiesAll = Array.Empty(); - public GameRoom(IGameThread gameThread, PluginBase pluginBase, string map, int min, int max) + public GameRoom(IGameThread gameThread, PluginBase pluginBase, string roomId, string map, int min, int max) { _gameThread = gameThread; _plugin = pluginBase; @@ -38,7 +38,7 @@ namespace Ragon.Core Map = map; PlayersMin = min; PlayersMax = max; - Id = Guid.NewGuid().ToString(); + Id = roomId; _plugin.Attach(this); } diff --git a/Ragon/Sources/Lobby/Lobby.cs b/Ragon/Sources/Lobby/Lobby.cs index 7f610fd..2113262 100644 --- a/Ragon/Sources/Lobby/Lobby.cs +++ b/Ragon/Sources/Lobby/Lobby.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using NetStack.Serialization; using NLog; using Ragon.Common; @@ -9,6 +10,7 @@ public class Lobby : ILobby { private readonly ILogger _logger = LogManager.GetCurrentClassLogger(); private readonly RagonSerializer _serializer; + private readonly BitBuffer _buffer; private readonly RoomManager _roomManager; private readonly AuthorizationManager _authorizationManager; @@ -17,6 +19,7 @@ public class Lobby : ILobby public Lobby(IAuthorizationProvider provider, RoomManager manager, IGameThread gameThread) { _roomManager = manager; + _buffer = new BitBuffer(); _serializer = new RagonSerializer(); _authorizationManager = new AuthorizationManager(provider, gameThread, this, _serializer); } @@ -52,31 +55,43 @@ public class Lobby : ILobby _roomManager.Left(player, Array.Empty()); _roomManager.Join(player, roomId, Array.Empty()); - break; } case RagonOperation.CREATE_ROOM: { - var min = _serializer.ReadUShort(); - var max = _serializer.ReadUShort(); - var map = _serializer.ReadString(); + var roomId = Guid.NewGuid().ToString(); + var custom = _serializer.ReadBool(); + if (custom) + roomId = _serializer.ReadString(); + + var propertiesPayload = _serializer.ReadData(_serializer.Size); + _buffer.Clear(); + _buffer.FromSpan(ref propertiesPayload, propertiesPayload.Length); + + var roomProperties = new RagonRoomParameters(); + roomProperties.Deserialize(_buffer); if (_roomManager.RoomsBySocket.ContainsKey(peerId)) _roomManager.Left(player, Array.Empty()); - - _roomManager.Create(player, map, min, max, Array.Empty()); + + _roomManager.Create(player, roomId, roomProperties, Array.Empty()); break; } case RagonOperation.JOIN_OR_CREATE_ROOM: { - var min = _serializer.ReadUShort(); - var max = _serializer.ReadUShort(); - var map = _serializer.ReadString(); + var roomId = Guid.NewGuid().ToString(); + var roomProperties = new RagonRoomParameters(); + var propertiesPayload = _serializer.ReadData(_serializer.Size); + + _buffer.Clear(); + _buffer.FromSpan(ref propertiesPayload, propertiesPayload.Length); + + roomProperties.Deserialize(_buffer); if (_roomManager.RoomsBySocket.ContainsKey(peerId)) _roomManager.Left(player, Array.Empty()); - _roomManager.JoinOrCreate(player, map, min, max, Array.Empty()); + _roomManager.JoinOrCreate(player, roomId, roomProperties, Array.Empty()); break; } case RagonOperation.LEAVE_ROOM: diff --git a/Ragon/Sources/Room/RoomManager.cs b/Ragon/Sources/Room/RoomManager.cs index dd4e385..3a2a508 100644 --- a/Ragon/Sources/Room/RoomManager.cs +++ b/Ragon/Sources/Room/RoomManager.cs @@ -26,6 +26,8 @@ public class RoomManager public void Join(Player player, string roomId, byte[] payload) { + _logger.Trace($"Player ({player.PlayerName}|{player.Id}) joined to room with Id {roomId}"); + if (_rooms.Count > 0) { foreach (var existRoom in _rooms) @@ -34,34 +36,46 @@ public class RoomManager { existRoom.Joined(player, payload); _roomsBySocket.Add(player.PeerId, existRoom); - break; + return; } } } } - public void Create(Player player, string map, int min, int max, byte[] payload) + public void Create(Player creator, string roomId, RagonRoomParameters parameters, byte[] payload) { + var map = parameters.Map; + var min = parameters.Min; + var max = parameters.Max; + + _logger.Trace($"Player ({creator.PlayerName}|{creator.Id}) create room with Id {roomId} and params ({map}|{min}|{max})"); + var plugin = _factory.CreatePlugin(map); if (plugin == null) throw new NullReferenceException($"Plugin for map {map} is null"); - var room = new GameRoom(_gameThread, plugin, map, min, max); - room.Joined(player, payload); + var room = new GameRoom(_gameThread, plugin, roomId, map, min, max); + room.Joined(creator, payload); room.Start(); - _roomsBySocket.Add(player.PeerId, room); + _roomsBySocket.Add(creator.PeerId, room); _rooms.Add(room); } - public void JoinOrCreate(Player player, string map, int min, int max, byte[] payload) + public void JoinOrCreate(Player player, string roomId, RagonRoomParameters parameters, byte[] payload) { + var map = parameters.Map; + var min = parameters.Min; + var max = parameters.Max; + if (_rooms.Count > 0) { foreach (var existRoom in _rooms) { if (existRoom.Map == map && existRoom.PlayersCount < existRoom.PlayersMax) { + _logger.Trace($"Player ({player.PlayerName}|{player.Id}) joined to room with Id {roomId}"); + existRoom.Joined(player, payload); _roomsBySocket.Add(player.PeerId, existRoom); return; @@ -69,11 +83,13 @@ public class RoomManager } } + _logger.Trace($"Player ({player.PlayerName}|{player.Id}) create room with Id {roomId} and params ({map}|{min}|{max})"); + var plugin = _factory.CreatePlugin(map); if (plugin == null) throw new NullReferenceException($"Plugin for map {map} is null"); - var room = new GameRoom(_gameThread, plugin, map, min, max); + var room = new GameRoom(_gameThread, plugin, roomId, map, min, max); room.Joined(player, payload); room.Start(); @@ -85,14 +101,16 @@ public class RoomManager { if (_roomsBySocket.Remove(player.PeerId, out var room)) { + _logger.Trace($"Player ({player.PlayerName}|{player.Id}) left room with Id {room.Id}"); room.Leave(player.PeerId); if (room.PlayersCount < room.PlayersMin) { + _logger.Trace($"Room with Id {room.Id} destroyed"); room.Stop(); _rooms.Remove(room); } - - _gameThread.Server.Send(player.PeerId, new byte[] { (byte) RagonOperation.LEAVE_ROOM }, DeliveryType.Reliable); + + _gameThread.Server.Send(player.PeerId, new byte[] {(byte) RagonOperation.LEAVE_ROOM}, DeliveryType.Reliable); } }