This commit is contained in:
2022-05-01 10:47:02 +04:00
parent 0245048e9c
commit f3961e4740
5 changed files with 54 additions and 26 deletions
+1 -1
View File
@@ -26,7 +26,7 @@ namespace Ragon.Core
for (var i = 0; i < threadsCount; i++) for (var i = 0; i < threadsCount; i++)
{ {
var roomThread = new RoomThread(factory); var roomThread = new RoomThread(factory, configuration);
_roomThreadCounter.Add(roomThread, 0); _roomThreadCounter.Add(roomThread, 0);
_roomThreads.Add(roomThread); _roomThreads.Add(roomThread);
} }
+10 -2
View File
@@ -64,19 +64,27 @@ namespace Ragon.Core
if (data.Type == EventType.DATA) if (data.Type == EventType.DATA)
{ {
var newPacket = new Packet(); var newPacket = new Packet();
var packetFlags = PacketFlags.Instant; var packetFlags = PacketFlags.Instant;
byte channel = 1;
if (data.Delivery == DeliveryType.Reliable) if (data.Delivery == DeliveryType.Reliable)
{
packetFlags = PacketFlags.Reliable; packetFlags = PacketFlags.Reliable;
channel = 0;
}
else if (data.Delivery == DeliveryType.Unreliable) else if (data.Delivery == DeliveryType.Unreliable)
{
channel = 1;
packetFlags = PacketFlags.Instant; packetFlags = PacketFlags.Instant;
}
newPacket.Create(data.Data, data.Data.Length, packetFlags); 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) else if (data.Type == EventType.DISCONNECTED)
{ {
_peers[data.PeerId].DisconnectNow(0); _peers[data.PeerId].DisconnectNow(0);
_receiveBuffer.Enqueue(data);
} }
} }
+18 -8
View File
@@ -12,6 +12,12 @@ namespace Ragon.Core
{ {
public class Room : IDisposable 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 ILogger _logger = LogManager.GetCurrentClassLogger();
private Dictionary<uint, Player> _players = new(); private Dictionary<uint, Player> _players = new();
private Dictionary<int, Entity> _entities = new(); private Dictionary<int, Entity> _entities = new();
@@ -19,7 +25,6 @@ namespace Ragon.Core
private readonly PluginBase _plugin; private readonly PluginBase _plugin;
private readonly RoomThread _roomThread; private readonly RoomThread _roomThread;
private readonly string _map;
private ulong _ticks = 0; private ulong _ticks = 0;
// Cache // Cache
@@ -27,17 +32,20 @@ namespace Ragon.Core
private uint[] _allPlayers = Array.Empty<uint>(); private uint[] _allPlayers = Array.Empty<uint>();
private Entity[] _entitiesAll = Array.Empty<Entity>(); private Entity[] _entitiesAll = Array.Empty<Entity>();
public Room(RoomThread roomThread, PluginBase pluginBase, string map) public Room(RoomThread roomThread, PluginBase pluginBase, string map, int min, int max)
{ {
_roomThread = roomThread; _roomThread = roomThread;
_plugin = pluginBase; _plugin = pluginBase;
_map = map;
Map = map;
PlayersMin = min;
PlayersMax = max;
_logger.Info("Room created"); _logger.Info("Room created");
_plugin.Attach(this); _plugin.Attach(this);
} }
public void Joined(uint peerId, byte[] payload) public void Joined(uint peerId, ReadOnlySpan<byte> payload)
{ {
if (_players.Count == 0) if (_players.Count == 0)
{ {
@@ -54,24 +62,27 @@ namespace Ragon.Core
}; };
_players.Add(peerId, player); _players.Add(peerId, player);
_allPlayers = _players.Select(p => p.Key).ToArray(); _allPlayers = _players.Select(p => p.Key).ToArray();
{ {
Span<byte> data = stackalloc byte[10]; Span<byte> data = stackalloc byte[18];
Span<byte> operationData = data.Slice(0, 2); Span<byte> operationData = data.Slice(0, 2);
Span<byte> peerData = data.Slice(2, 4); Span<byte> peerData = data.Slice(2, 4);
Span<byte> ownerData = data.Slice(4, 4); Span<byte> ownerData = data.Slice(4, 4);
Span<byte> minData = data.Slice(10, 4);
Span<byte> maxData = data.Slice(14, 4);
RagonHeader.WriteUShort((ushort) RagonOperation.JOIN_ROOM, ref operationData); RagonHeader.WriteUShort((ushort) RagonOperation.JOIN_ROOM, ref operationData);
RagonHeader.WriteInt((int) peerId, ref peerData); RagonHeader.WriteInt((int) peerId, ref peerData);
RagonHeader.WriteInt((int) _owner, ref ownerData); RagonHeader.WriteInt((int) _owner, ref ownerData);
RagonHeader.WriteInt(PlayersMin, ref minData);
RagonHeader.WriteInt(PlayersMax, ref maxData);
Send(peerId, data); Send(peerId, data);
} }
{ {
var sceneRawData = Encoding.UTF8.GetBytes(_map).AsSpan(); var sceneRawData = Encoding.UTF8.GetBytes(Map).AsSpan();
Span<byte> data = stackalloc byte[sceneRawData.Length + 2]; Span<byte> data = stackalloc byte[sceneRawData.Length + 2];
Span<byte> operationData = data.Slice(0, 2); Span<byte> operationData = data.Slice(0, 2);
Span<byte> sceneData = data.Slice(2, sceneRawData.Length); Span<byte> sceneData = data.Slice(2, sceneRawData.Length);
@@ -287,7 +298,6 @@ namespace Ragon.Core
public Player GetPlayerByPeerId(uint peerId) => _players[peerId]; public Player GetPlayerByPeerId(uint peerId) => _players[peerId];
public Player GetOwner() => _players[_owner]; public Player GetOwner() => _players[_owner];
public int PlayersCount => _players.Count;
public void Send(uint peerId, RagonOperation operation, DeliveryType deliveryType = DeliveryType.Unreliable) public void Send(uint peerId, RagonOperation operation, DeliveryType deliveryType = DeliveryType.Unreliable)
{ {
+20 -10
View File
@@ -23,7 +23,7 @@ namespace Ragon.Core
_roomThread = roomThread; _roomThread = roomThread;
_factory = factory; _factory = factory;
_manager = _factory.CreateManager(roomThread); _manager = _factory.CreateManager(roomThread.Configuration);
_rooms = new List<Room>(); _rooms = new List<Room>();
_peersByRoom = new Dictionary<uint, Room>(); _peersByRoom = new Dictionary<uint, Room>();
} }
@@ -52,9 +52,9 @@ namespace Ragon.Core
} }
} }
public void OnAuthorize(uint peerId, byte[] payload) public void OnAuthorize(uint peerId, ReadOnlySpan<byte> payload)
{ {
if (_manager.OnAuthorize(peerId, payload)) if (_manager.OnAuthorize(peerId, ref payload))
{ {
Span<byte> data = stackalloc byte[2]; Span<byte> data = stackalloc byte[2];
RagonHeader.WriteUShort((ushort) RagonOperation.AUTHORIZED_SUCCESS, ref data); 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<byte> payload)
{ {
var map = Encoding.UTF8.GetString(payload); var map = Encoding.UTF8.GetString(payload);
var min = 0;
var max = 0;
Room room = null;
if (_rooms.Count > 0) if (_rooms.Count > 0)
{ {
var existsRoom = _rooms[0]; foreach (var existRoom in _rooms)
existsRoom.Joined(peerId, payload); {
_peersByRoom.Add(peerId, existsRoom); if (existRoom.Map == map && existRoom.PlayersCount < existRoom.PlayersMax)
{
room = existRoom;
room.Joined(peerId, payload);
return existsRoom; _peersByRoom.Add(peerId, room);
return room;
}
}
} }
var plugin = _factory.CreatePlugin(map); var plugin = _factory.CreatePlugin(map);
if (plugin == null) if (plugin == null)
throw new NullReferenceException($"Plugin for map {map} is 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.Joined(peerId, payload);
room.Start(); room.Start();
_peersByRoom.Add(peerId, room); _peersByRoom.Add(peerId, room);
_rooms.Add(room); _rooms.Add(room);
return room; return room;
+1 -1
View File
@@ -15,7 +15,7 @@ public class Storage
{ {
var db = _connection.GetDatabase(); var db = _connection.GetDatabase();
db.set("entity_", ) // db.set("entity_", )
} }
public void UpdatePlayer() public void UpdatePlayer()