refactor: allow set roomId from client, added base room parameters
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user