refactor: allow set roomId from client, added base room parameters

This commit is contained in:
2022-07-30 16:02:53 +04:00
parent 16b8d3a062
commit 85336f998e
5 changed files with 97 additions and 21 deletions
@@ -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();
}
}
}
+18
View File
@@ -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)
{
+2 -2
View File
@@ -29,7 +29,7 @@ namespace Ragon.Core
private uint[] _allPlayers = Array.Empty<uint>();
private Entity[] _entitiesAll = Array.Empty<Entity>();
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);
}
+24 -9
View File
@@ -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<byte>());
_roomManager.Join(player, roomId, Array.Empty<byte>());
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<byte>());
_roomManager.Create(player, map, min, max, Array.Empty<byte>());
_roomManager.Create(player, roomId, roomProperties, Array.Empty<byte>());
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<byte>());
_roomManager.JoinOrCreate(player, map, min, max, Array.Empty<byte>());
_roomManager.JoinOrCreate(player, roomId, roomProperties, Array.Empty<byte>());
break;
}
case RagonOperation.LEAVE_ROOM:
+25 -7
View File
@@ -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,9 +101,11 @@ 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);
}