Compare commits

..

8 Commits

Author SHA1 Message Date
edmand46 e2ef761bd7 fixed: windows server 2022-12-15 23:55:59 +04:00
edmand46 828112855f fixed: crash on send in websocket server 2022-12-04 23:01:05 +04:00
edmand46 06ff76fe0b fixed: second migration 2022-12-01 22:24:03 +04:00
edmand46 c92b5a5bc4 chore: update readme 2022-11-30 23:56:17 +04:00
edmand46 f83d3ea0c7 chore: update version 2022-11-13 18:54:23 +04:00
edmand46 3564eb2adc feat: added except invoker target 2022-11-13 18:53:56 +04:00
edmand46 3531432758 fixed: crash on concurrent authorization 2022-11-13 00:20:41 +04:00
edmand46 6bda468607 v1.0.23-rc 2022-10-24 22:19:50 +04:00
12 changed files with 73 additions and 32 deletions
+1
View File
@@ -4,6 +4,7 @@ namespace Ragon.Common
{ {
Owner, Owner,
ExceptOwner, ExceptOwner,
ExceptInvoker,
All, All,
} }
} }
+1
View File
@@ -1,5 +1,6 @@
{ {
"key": "defaultkey", "key": "defaultkey",
"socket": "udp",
"protocol": "1.0.0", "protocol": "1.0.0",
"statisticsInterval": 5, "statisticsInterval": 5,
"sendRate": 50, "sendRate": 50,
+14 -2
View File
@@ -30,7 +30,19 @@ namespace Ragon.Core
var dispatcher = new Dispatcher(); var dispatcher = new Dispatcher();
_dispatcher = dispatcher; _dispatcher = dispatcher;
if (configuration.Socket == "udp")
{
_socketServer = new ENetServer(this); _socketServer = new ENetServer(this);
}
else if (configuration.Socket == "websocket")
{
_socketServer = new WebSocketServer(this);
}
else
{
_logger.Error($"Unknown socket type {configuration.Socket}");
}
_deltaTime = 1000.0f / configuration.SendRate; _deltaTime = 1000.0f / configuration.SendRate;
_roomManager = new RoomManager(factory, this); _roomManager = new RoomManager(factory, this);
@@ -87,12 +99,12 @@ namespace Ragon.Core
public void OnConnected(ushort peerId) public void OnConnected(ushort peerId)
{ {
_logger.Trace("Connected " + peerId); // _logger.Trace("Connected " + peerId);
} }
public void OnDisconnected(ushort peerId) public void OnDisconnected(ushort peerId)
{ {
_logger.Trace("Disconnected " + peerId); // _logger.Trace("Disconnected " + peerId);
var player = _lobby.AuthorizationManager.GetPlayer(peerId); var player = _lobby.AuthorizationManager.GetPlayer(peerId);
if (player != null) if (player != null)
+6
View File
@@ -42,6 +42,12 @@ public class AuthorizationManager
public void Accepted(ushort peerId, string playerId, string playerName) public void Accepted(ushort peerId, string playerId, string playerName)
{ {
if (_playersByPeers.ContainsKey(peerId))
{
_logger.Warn($"Connection already authorized {peerId}");
return;
}
_serializer.Clear(); _serializer.Clear();
_serializer.WriteOperation(RagonOperation.AUTHORIZED_SUCCESS); _serializer.WriteOperation(RagonOperation.AUTHORIZED_SUCCESS);
_serializer.WriteString(playerId); _serializer.WriteString(playerId);
+2 -1
View File
@@ -10,6 +10,7 @@ namespace Ragon.Core
{ {
public string Key; public string Key;
public string Protocol; public string Protocol;
public string Socket;
public int StatisticsInterval; public int StatisticsInterval;
public ushort SendRate; public ushort SendRate;
public ushort Port; public ushort Port;
@@ -20,7 +21,7 @@ namespace Ragon.Core
public int MaxRooms; public int MaxRooms;
private static readonly Logger _logger = LogManager.GetCurrentClassLogger(); private static readonly Logger _logger = LogManager.GetCurrentClassLogger();
private static readonly string _serverVersion = "1.0.22-rc"; private static readonly string _serverVersion = "1.0.27-rc";
private static void CopyrightInfo() private static void CopyrightInfo()
{ {
+9 -3
View File
@@ -81,7 +81,7 @@ public class Entity
serializer.WriteData(ref payload); serializer.WriteData(ref payload);
var sendData = serializer.ToArray(); var sendData = serializer.ToArray();
Send(targetMode, sendData); RouteEvent(peerId, targetMode, sendData);
} }
public void ReadState(uint peerId, RagonSerializer serializer) public void ReadState(uint peerId, RagonSerializer serializer)
@@ -197,6 +197,7 @@ public class Entity
public void Destroy(ReadOnlySpan<byte> payload) public void Destroy(ReadOnlySpan<byte> payload)
{ {
var serializer = _room.GetSharedSerializer(); var serializer = _room.GetSharedSerializer();
serializer.Clear(); serializer.Clear();
serializer.WriteOperation(RagonOperation.DESTROY_ENTITY); serializer.WriteOperation(RagonOperation.DESTROY_ENTITY);
serializer.WriteInt(EntityId); serializer.WriteInt(EntityId);
@@ -207,7 +208,7 @@ public class Entity
_room.BroadcastToReady(sendData, DeliveryType.Reliable); _room.BroadcastToReady(sendData, DeliveryType.Reliable);
} }
void Send(RagonTarget targetMode, byte[] sendData) void RouteEvent(ushort peerId, RagonTarget targetMode, byte[] sendData)
{ {
switch (targetMode) switch (targetMode)
{ {
@@ -221,6 +222,11 @@ public class Entity
_room.BroadcastToReady(sendData, new [] { OwnerId }, DeliveryType.Reliable); _room.BroadcastToReady(sendData, new [] { OwnerId }, DeliveryType.Reliable);
break; break;
} }
case RagonTarget.ExceptInvoker:
{
_room.BroadcastToReady(sendData, new[] {peerId}, DeliveryType.Reliable);
break;
}
case RagonTarget.All: case RagonTarget.All:
{ {
_room.BroadcastToReady(sendData, DeliveryType.Reliable); _room.BroadcastToReady(sendData, DeliveryType.Reliable);
@@ -236,7 +242,7 @@ public class Entity
var targetMode = (RagonTarget) reader.ReadByte(); var targetMode = (RagonTarget) reader.ReadByte();
var payloadData = reader.ReadData(reader.Size); var payloadData = reader.ReadData(reader.Size);
Span<byte> payloadRaw = stackalloc byte[reader.Size]; Span<byte> payloadRaw = stackalloc byte[payloadData.Length];
ReadOnlySpan<byte> payload = payloadRaw; ReadOnlySpan<byte> payload = payloadRaw;
payloadData.CopyTo(payloadRaw); payloadData.CopyTo(payloadRaw);
+7 -5
View File
@@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq; using System.Linq;
using NLog; using NLog;
using Ragon.Common; using Ragon.Common;
@@ -129,7 +128,6 @@ namespace Ragon.Core
var propertySize = reader.ReadUShort(); var propertySize = reader.ReadUShort();
entity.AddProperty(new EntityProperty(propertySize, propertyType)); entity.AddProperty(new EntityProperty(propertySize, propertyType));
} }
player.AttachEntity(entity); player.AttachEntity(entity);
AttachEntity(player, entity); AttachEntity(player, entity);
} }
@@ -219,8 +217,6 @@ namespace Ragon.Core
var eventAuthority = (RagonAuthority) reader.ReadByte(); var eventAuthority = (RagonAuthority) reader.ReadByte();
var propertiesCount = reader.ReadUShort(); var propertiesCount = reader.ReadUShort();
_logger.Trace($"[{peerId}] Create Entity {entityType}");
var player = _players[peerId]; var player = _players[peerId];
var entity = new Entity(this, player.PeerId, entityType, 0, eventAuthority); var entity = new Entity(this, player.PeerId, entityType, 0, eventAuthority);
for (var i = 0; i < propertiesCount; i++) for (var i = 0; i < propertiesCount; i++)
@@ -306,12 +302,17 @@ namespace Ragon.Core
_writer.WriteOperation(RagonOperation.OWNERSHIP_CHANGED); _writer.WriteOperation(RagonOperation.OWNERSHIP_CHANGED);
_writer.WriteString(next.Id); _writer.WriteString(next.Id);
_writer.WriteUShort((ushort) entitiesToUpdate.Length); _writer.WriteUShort((ushort) entitiesToUpdate.Length);
foreach (var entity in entitiesToUpdate) foreach (var entity in entitiesToUpdate)
{ {
_writer.WriteUShort(entity.EntityId); _writer.WriteUShort(entity.EntityId);
entity.SetOwner((ushort) next.PeerId); entity.SetOwner(next.PeerId);
next.Entities.Add(entity);
} }
next.EntitiesIds = next.Entities.Select(e => e.EntityId).ToList();
BroadcastToReady(_writer, DeliveryType.Reliable); BroadcastToReady(_writer, DeliveryType.Reliable);
} }
@@ -345,6 +346,7 @@ namespace Ragon.Core
void BroadcastSnapshot(ushort[] peersIds) void BroadcastSnapshot(ushort[] peersIds)
{ {
_logger.Trace("Snapshot");
_writer.Clear(); _writer.Clear();
_writer.WriteOperation(RagonOperation.SNAPSHOT); _writer.WriteOperation(RagonOperation.SNAPSHOT);
_writer.WriteUShort((ushort) _readyPlayers.Length); _writer.WriteUShort((ushort) _readyPlayers.Length);
+1 -1
View File
@@ -74,7 +74,7 @@ public class RoomManager
{ {
if (existRoom.Map == map && existRoom.PlayersCount < existRoom.PlayersMax) if (existRoom.Map == map && existRoom.PlayersCount < existRoom.PlayersMax)
{ {
_logger.Trace($"Player ({player.PlayerName}|{player.Id}) joined to room with Id {roomId}"); _logger.Trace($"Player ({player.PlayerName}|{player.Id}) joined to room with Id {existRoom.Id}");
existRoom.AddPlayer(player, payload); existRoom.AddPlayer(player, payload);
_roomsBySocket.Add(player.PeerId, existRoom); _roomsBySocket.Add(player.PeerId, existRoom);
+4
View File
@@ -27,6 +27,8 @@ namespace Ragon.Core
public void Start(ushort port, int connections, uint protocol) public void Start(ushort port, int connections, uint protocol)
{ {
Library.Initialize();
_address = default; _address = default;
_address.Port = port; _address.Port = port;
_peers = new Peer[connections]; _peers = new Peer[connections];
@@ -146,6 +148,8 @@ namespace Ragon.Core
public void Stop() public void Stop()
{ {
_host?.Dispose(); _host?.Dispose();
Library.Deinitialize();
} }
private bool IsValidProtocol(uint protocol) private bool IsValidProtocol(uint protocol)
@@ -74,9 +74,16 @@ public class WebSocketServer : ISocketServer
while (_events.TryDequeue(out var evnt)) while (_events.TryDequeue(out var evnt))
{ {
if (_webSockets.TryGetValue(evnt.PeerId, out var ws) && ws.State == WebSocketState.Open) if (_webSockets.TryGetValue(evnt.PeerId, out var ws) && ws.State == WebSocketState.Open)
{
try
{ {
await ws.SendAsync(evnt.Data, WebSocketMessageType.Binary, WebSocketMessageFlags.EndOfMessage, CancellationToken.None); await ws.SendAsync(evnt.Data, WebSocketMessageType.Binary, WebSocketMessageFlags.EndOfMessage, CancellationToken.None);
} }
catch (Exception ex)
{
_logger.Error(ex);
}
}
} }
} }
+5 -4
View File
@@ -16,8 +16,8 @@ Ragon is fully free, small and high perfomance room based game server with plugi
- Simple matchmaking - Simple matchmaking
- Room based architecture - Room based architecture
- Сustomizable authorization - Сustomizable authorization
- Сustomizable server-side logic via plugins with flexible API - Сustomizable server-side logic via plugins with flexible API*(2)
- No CCU limitations* - No CCU limitations*(1)
- No Room count limitations - No Room count limitations
- Reliable UDP - Reliable UDP
@@ -27,10 +27,11 @@ Ragon is fully free, small and high perfomance room based game server with plugi
### Dependencies ### Dependencies
* ENet-Sharp [v2.4.8] * ENet-Sharp [v2.4.8]
* NetStack [latest]
### License ### License
MIT MIT
### Tips ### Tips
\* Limited to 4095 CCU by library ENet-Sharp \* Limited to 4095 CCU by library ENet-Sharp (1)
\* Non finally (2)