diff --git a/Ragon.Client/Sources/Handler/RoomDataHandler.cs b/Ragon.Client/Sources/Handler/RoomDataHandler.cs index 21eb0c7..66e245d 100644 --- a/Ragon.Client/Sources/Handler/RoomDataHandler.cs +++ b/Ragon.Client/Sources/Handler/RoomDataHandler.cs @@ -36,16 +36,20 @@ internal class RoomDataHandler: IHandler { var rawData = reader.RawData; var peerId = (ushort)(rawData[1] + (rawData[2] << 8)); - var player = _playerCache.GetPlayerByPeer(peerId); - if (player == null) + RagonPlayer player = null; + if (peerId != 10000) { - RagonLog.Error($"Player with peerId:{peerId} not found"); - - _playerCache.Dump(); - return; + player = _playerCache.GetPlayerByPeer(peerId); + if (player == null) + { + RagonLog.Error($"Player with peerId:{peerId} not found"); + + _playerCache.Dump(); + return; + } } - + var headerSize = 3; var payload = new byte[rawData.Length - headerSize]; diff --git a/Ragon.Relay/Sources/RelayRoomPlugin.cs b/Ragon.Relay/Sources/RelayRoomPlugin.cs index 0ee88c8..245f7b6 100644 --- a/Ragon.Relay/Sources/RelayRoomPlugin.cs +++ b/Ragon.Relay/Sources/RelayRoomPlugin.cs @@ -1,53 +1,38 @@ using System; +using System.Collections.Generic; +using System.Diagnostics; +using NLog; using Ragon.Server.Entity; +using Ragon.Server.IO; using Ragon.Server.Plugin; using Ragon.Server.Room; namespace Ragon.Relay; -public class RelayRoomPlugin: BaseRoomPlugin +public class RelayRoomPlugin : BaseRoomPlugin { - public void Tick(float dt) - { - - } - - public void OnAttached() - { - Console.WriteLine("Room attached"); - } - - public void OnDetached() - { - Console.WriteLine("Room detached"); - } - - public bool OnEntityCreate(RagonRoomPlayer creator, RagonEntity entity) - { - Console.WriteLine($"Entity created: {entity.Id}"); - return true; - } - - public bool OnEntityRemove(RagonRoomPlayer destroyer, RagonEntity entity) - { - Console.WriteLine($"Entity destroyed: {entity.Id}"); - return true; - } + private Logger _logger = LogManager.GetCurrentClassLogger(); public override bool OnPlayerJoined(RagonRoomPlayer player) { + // _logger.Trace($"Player {player.Name}|{player.Connection.Id} joined"); return false; } public override bool OnPlayerLeaved(RagonRoomPlayer player) { + // _logger.Trace($"Player {player.Name}|{player.Connection.Id} leaved"); return false; } public override bool OnData(RagonRoomPlayer player, byte[] data) { - Console.WriteLine("Data received"); - + // _logger.Trace($"Data received from {player.Name}|{player.Connection.Id}"); + + // All Players + // Room.ReplicateData(new Byte[] { 30, 40, 50 }, NetworkChannel.RELIABLE); + // Selected Player + // Room.ReplicateData(new byte[] { 10, 30, 40 }, new List { player }, NetworkChannel.RELIABLE); return true; } diff --git a/Ragon.Server/Sources/Handler/RoomCreateOperation.cs b/Ragon.Server/Sources/Handler/RoomCreateOperation.cs index b944523..4b39790 100644 --- a/Ragon.Server/Sources/Handler/RoomCreateOperation.cs +++ b/Ragon.Server/Sources/Handler/RoomCreateOperation.cs @@ -80,6 +80,7 @@ public sealed class RoomCreateOperation : BaseOperation var roomPlugin = _serverPlugin.CreateRoomPlugin(information); var room = new RagonRoom(roomId, information, roomPlugin); + room.Plugin.OnAttached(room); roomPlayer.OnAttached(room); context.Scheduler.Run(room); diff --git a/Ragon.Server/Sources/Handler/RoomDataOperation.cs b/Ragon.Server/Sources/Handler/RoomDataOperation.cs index 9d35986..2c98506 100644 --- a/Ragon.Server/Sources/Handler/RoomDataOperation.cs +++ b/Ragon.Server/Sources/Handler/RoomDataOperation.cs @@ -42,8 +42,11 @@ public sealed class RoomDataOperation : BaseOperation sendData[1] = (byte)peerId; sendData[2] = (byte)(peerId >> 8); + var pluginData = new byte[dataSize]; + Array.Copy(data, 1, pluginData, 0, dataSize); + room.Plugin.OnData(player, pluginData); + Array.Copy(data, 1, sendData, headerSize, dataSize); - - room.Broadcast(sendData, channel); + room.Broadcast(sendData, room.ReadyPlayersList, NetworkChannel.RELIABLE); } } \ No newline at end of file diff --git a/Ragon.Server/Sources/Handler/RoomJoinOrCreateOperation.cs b/Ragon.Server/Sources/Handler/RoomJoinOrCreateOperation.cs index 5557869..8304bab 100644 --- a/Ragon.Server/Sources/Handler/RoomJoinOrCreateOperation.cs +++ b/Ragon.Server/Sources/Handler/RoomJoinOrCreateOperation.cs @@ -79,6 +79,8 @@ public sealed class RoomJoinOrCreateOperation : BaseOperation _ragonWebHookPlugin.RoomCreated(context, room, roomPlayer); + room.Plugin.OnAttached(room); + context.Lobby.Persist(room); context.Scheduler.Run(room); context.SetRoom(room, roomPlayer); diff --git a/Ragon.Server/Sources/Plugin/IRoomPlugin.cs b/Ragon.Server/Sources/Plugin/IRoomPlugin.cs index 1634979..84f7ffa 100644 --- a/Ragon.Server/Sources/Plugin/IRoomPlugin.cs +++ b/Ragon.Server/Sources/Plugin/IRoomPlugin.cs @@ -28,4 +28,5 @@ public interface IRoomPlugin bool OnPlayerLeaved(RagonRoomPlayer player); bool OnEntityCreate(RagonRoomPlayer player, IRagonEntity entity); bool OnEntityRemove(RagonRoomPlayer player, IRagonEntity entity); + bool OnData(RagonRoomPlayer player, byte[] data); } \ No newline at end of file diff --git a/Ragon.Server/Sources/Room/IRagonRoom.cs b/Ragon.Server/Sources/Room/IRagonRoom.cs index 9f42df9..11b4500 100644 --- a/Ragon.Server/Sources/Room/IRagonRoom.cs +++ b/Ragon.Server/Sources/Room/IRagonRoom.cs @@ -28,6 +28,9 @@ public interface IRagonRoom public int PlayerMax { get; } public int PlayerCount { get; } public RagonData UserData { get; } + + public void ReplicateData(byte[] data, NetworkChannel channel); + public void ReplicateData(byte[] data, List player, NetworkChannel channel); RagonRoomPlayer GetPlayerByConnection(INetworkConnection connection); RagonRoomPlayer GetPlayerById(string id); diff --git a/Ragon.Server/Sources/Room/RagonRoom.cs b/Ragon.Server/Sources/Room/RagonRoom.cs index f60c373..cc32859 100644 --- a/Ragon.Server/Sources/Room/RagonRoom.cs +++ b/Ragon.Server/Sources/Room/RagonRoom.cs @@ -50,7 +50,7 @@ public class RagonRoom : IRagonRoom, IRagonAction private readonly HashSet _entitiesDirtySet; private readonly List _bufferedEvents; private readonly int _limitBufferedEvents; - + public RagonRoom(string roomId, RoomInformation info, IRoomPlugin roomPlugin) { Id = roomId; @@ -58,7 +58,7 @@ public class RagonRoom : IRagonRoom, IRagonAction PlayerMax = info.Max; PlayerMin = info.Min; Plugin = roomPlugin; - + Players = new Dictionary(info.Max); WaitPlayersList = new List(info.Max); ReadyPlayersList = new List(info.Max); @@ -114,7 +114,7 @@ public class RagonRoom : IRagonRoom, IRagonAction roomPlayer.Connection.Reliable.Send(sendData); } } - + public void ReplicateEvent( RagonRoomPlayer invoker, RagonEvent evnt, @@ -124,7 +124,7 @@ public class RagonRoom : IRagonRoom, IRagonAction { var room = Owner.Room; var buffer = room.Writer; - + buffer.Clear(); buffer.WriteOperation(RagonOperation.REPLICATE_ROOM_EVENT); buffer.WriteUShort(evnt.EventCode); @@ -144,17 +144,18 @@ public class RagonRoom : IRagonRoom, IRagonAction RagonTarget targetMode ) { - if (eventMode == RagonReplicationMode.Buffered && targetMode != RagonTarget.Owner && _bufferedEvents.Count < _limitBufferedEvents) + if (eventMode == RagonReplicationMode.Buffered && targetMode != RagonTarget.Owner && + _bufferedEvents.Count < _limitBufferedEvents) { _bufferedEvents.Add(evnt); } - + Writer.Clear(); Writer.WriteOperation(RagonOperation.REPLICATE_ROOM_EVENT); Writer.WriteUShort(evnt.EventCode); Writer.WriteUShort(invoker.Connection.Id); Writer.WriteByte((byte)eventMode); - + evnt.Write(Writer); var sendData = Writer.ToArray(); @@ -192,6 +193,28 @@ public class RagonRoom : IRagonRoom, IRagonAction } } } + public void ReplicateData(byte[] data, NetworkChannel channel) + { + ReplicateData(data, ReadyPlayersList, channel); + } + + public void ReplicateData(byte[] data, List receivers, + NetworkChannel channel = NetworkChannel.RELIABLE) + { + var dataSize = data.Length; + var headerSize = 3; + var size = headerSize + dataSize; + var sendData = new byte[size]; + var peerId = 10000; // Server Peer + + sendData[0] = (byte)RagonOperation.REPLICATE_RAW_DATA; + sendData[1] = (byte)peerId; + sendData[2] = (byte)(peerId >> 8); + + Array.Copy(data, 0, sendData, headerSize, dataSize); + + Broadcast(sendData, receivers, channel); + } public void Tick(float dt) { @@ -275,6 +298,8 @@ public class RagonRoom : IRagonRoom, IRagonAction player.OnDetached(); UpdateReadyPlayerList(); + + Plugin.OnPlayerLeaved(player); } } @@ -317,6 +342,20 @@ public class RagonRoom : IRagonRoom, IRagonAction } } + public void Broadcast(byte[] data, List players, NetworkChannel channel = NetworkChannel.RELIABLE) + { + if (channel == NetworkChannel.RELIABLE) + { + foreach (var p in players) + p.Connection.Reliable.Send(data); + } + else + { + foreach (var p in players) + p.Connection.Unreliable.Send(data); + } + } + public RagonRoomPlayer GetPlayerByConnection(INetworkConnection connection) { return Players[connection.Id];