wip
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,7 +127,7 @@ namespace Ragon.Core
|
|||||||
case ENet.EventType.Receive:
|
case ENet.EventType.Receive:
|
||||||
{
|
{
|
||||||
var data = new byte[_netEvent.Packet.Length];
|
var data = new byte[_netEvent.Packet.Length];
|
||||||
|
|
||||||
_netEvent.Packet.CopyTo(data);
|
_netEvent.Packet.CopyTo(data);
|
||||||
_netEvent.Packet.Dispose();
|
_netEvent.Packet.Dispose();
|
||||||
|
|
||||||
|
|||||||
@@ -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,8 +298,7 @@ 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)
|
||||||
{
|
{
|
||||||
Span<byte> data = stackalloc byte[2];
|
Span<byte> data = stackalloc byte[2];
|
||||||
|
|||||||
@@ -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)
|
||||||
|
{
|
||||||
return existsRoom;
|
room = existRoom;
|
||||||
|
room.Joined(peerId, payload);
|
||||||
|
|
||||||
|
_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;
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user