wip
This commit is contained in:
@@ -26,7 +26,7 @@ namespace Ragon.Core
|
||||
|
||||
for (var i = 0; i < threadsCount; i++)
|
||||
{
|
||||
var roomThread = new RoomThread(factory);
|
||||
var roomThread = new RoomThread(factory, configuration);
|
||||
_roomThreadCounter.Add(roomThread, 0);
|
||||
_roomThreads.Add(roomThread);
|
||||
}
|
||||
|
||||
@@ -64,19 +64,27 @@ namespace Ragon.Core
|
||||
if (data.Type == EventType.DATA)
|
||||
{
|
||||
var newPacket = new Packet();
|
||||
|
||||
var packetFlags = PacketFlags.Instant;
|
||||
byte channel = 1;
|
||||
|
||||
if (data.Delivery == DeliveryType.Reliable)
|
||||
{
|
||||
packetFlags = PacketFlags.Reliable;
|
||||
channel = 0;
|
||||
}
|
||||
else if (data.Delivery == DeliveryType.Unreliable)
|
||||
{
|
||||
channel = 1;
|
||||
packetFlags = PacketFlags.Instant;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
_peers[data.PeerId].DisconnectNow(0);
|
||||
_receiveBuffer.Enqueue(data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,12 @@ namespace Ragon.Core
|
||||
{
|
||||
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 Dictionary<uint, Player> _players = new();
|
||||
private Dictionary<int, Entity> _entities = new();
|
||||
@@ -19,7 +25,6 @@ namespace Ragon.Core
|
||||
|
||||
private readonly PluginBase _plugin;
|
||||
private readonly RoomThread _roomThread;
|
||||
private readonly string _map;
|
||||
private ulong _ticks = 0;
|
||||
|
||||
// Cache
|
||||
@@ -27,17 +32,20 @@ namespace Ragon.Core
|
||||
private uint[] _allPlayers = Array.Empty<uint>();
|
||||
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;
|
||||
_plugin = pluginBase;
|
||||
_map = map;
|
||||
|
||||
Map = map;
|
||||
PlayersMin = min;
|
||||
PlayersMax = max;
|
||||
|
||||
_logger.Info("Room created");
|
||||
_plugin.Attach(this);
|
||||
}
|
||||
|
||||
public void Joined(uint peerId, byte[] payload)
|
||||
public void Joined(uint peerId, ReadOnlySpan<byte> payload)
|
||||
{
|
||||
if (_players.Count == 0)
|
||||
{
|
||||
@@ -54,24 +62,27 @@ namespace Ragon.Core
|
||||
};
|
||||
|
||||
_players.Add(peerId, player);
|
||||
|
||||
_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> peerData = data.Slice(2, 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.WriteInt((int) peerId, ref peerData);
|
||||
RagonHeader.WriteInt((int) _owner, ref ownerData);
|
||||
RagonHeader.WriteInt(PlayersMin, ref minData);
|
||||
RagonHeader.WriteInt(PlayersMax, ref maxData);
|
||||
|
||||
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> operationData = data.Slice(0, 2);
|
||||
Span<byte> sceneData = data.Slice(2, sceneRawData.Length);
|
||||
@@ -287,7 +298,6 @@ namespace Ragon.Core
|
||||
|
||||
public Player GetPlayerByPeerId(uint peerId) => _players[peerId];
|
||||
public Player GetOwner() => _players[_owner];
|
||||
public int PlayersCount => _players.Count;
|
||||
|
||||
public void Send(uint peerId, RagonOperation operation, DeliveryType deliveryType = DeliveryType.Unreliable)
|
||||
{
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace Ragon.Core
|
||||
_roomThread = roomThread;
|
||||
_factory = factory;
|
||||
|
||||
_manager = _factory.CreateManager(roomThread);
|
||||
_manager = _factory.CreateManager(roomThread.Configuration);
|
||||
_rooms = new List<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];
|
||||
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 min = 0;
|
||||
var max = 0;
|
||||
|
||||
Room room = null;
|
||||
if (_rooms.Count > 0)
|
||||
{
|
||||
var existsRoom = _rooms[0];
|
||||
existsRoom.Joined(peerId, payload);
|
||||
_peersByRoom.Add(peerId, existsRoom);
|
||||
foreach (var existRoom in _rooms)
|
||||
{
|
||||
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);
|
||||
if (plugin == 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.Start();
|
||||
|
||||
_peersByRoom.Add(peerId, room);
|
||||
|
||||
_rooms.Add(room);
|
||||
|
||||
return room;
|
||||
|
||||
@@ -15,7 +15,7 @@ public class Storage
|
||||
{
|
||||
var db = _connection.GetDatabase();
|
||||
|
||||
db.set("entity_", )
|
||||
// db.set("entity_", )
|
||||
}
|
||||
|
||||
public void UpdatePlayer()
|
||||
|
||||
Reference in New Issue
Block a user