diff --git a/Game/Network/INetworkCommunicator.cs b/Game/Network/INetworkCommunicator.cs index d4e86f6..26315f5 100644 --- a/Game/Network/INetworkCommunicator.cs +++ b/Game/Network/INetworkCommunicator.cs @@ -1,5 +1,6 @@ using System; using LiteNetLib; +using LiteNetLib.Utils; using Syntriax.Engine.Core.Abstract; namespace Pong.Network; @@ -11,4 +12,8 @@ public interface INetworkCommunicator void PollEvents(); void Stop(); + + void RegisterEntityListener(IEntity entity, Action onDataReceived); + void UnregisterEntityListener(IEntity entity); + NetDataWriter GetEntityWriter(IEntity entity); } diff --git a/Game/Network/NetworkBase.cs b/Game/Network/NetworkBase.cs new file mode 100644 index 0000000..47fb41d --- /dev/null +++ b/Game/Network/NetworkBase.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; + +using LiteNetLib; +using LiteNetLib.Utils; + +using Syntriax.Engine.Core; +using Syntriax.Engine.Core.Abstract; + +namespace Pong.Network; + +public abstract class NetworkBase : BehaviourOverride, INetworkCommunicator +{ + public EventBasedNetListener Listener { get; private set; } = null!; + public NetManager Manager { get; private set; } = null!; + + public NetworkBase() + { + Priority = 10; + + Listener = new EventBasedNetListener(); + Manager = new NetManager(Listener); + + Listener.NetworkReceiveEvent += NetworkReceiveEvent; + } + + public void PollEvents() => Manager.PollEvents(); + public void Stop() => Manager.Stop(); + + protected override void OnUpdate() => PollEvents(); + protected override void OnFinalize() => Stop(); + + private Dictionary> callbacks = new(32); + + private void NetworkReceiveEvent(NetPeer peer, NetPacketReader reader, byte channel, DeliveryMethod deliveryMethod) + { + if (callbacks.TryGetValue(reader.GetString(), out var action)) + action?.Invoke(reader); + + reader.Recycle(); + } + + public void RegisterEntityListener(IEntity entity, Action onDataReceived) + { + if (callbacks.ContainsKey(entity.Id)) + return; + + callbacks.Add(entity.Id, onDataReceived); + entity.OnIdChanged += OnEntityIdChanged; + } + + public void UnregisterEntityListener(IEntity entity) + { + if (!callbacks.Remove(entity.Id)) + return; + + entity.OnIdChanged -= OnEntityIdChanged; + } + + public NetDataWriter GetEntityWriter(IEntity entity) + { + NetDataWriter netDataWriter = new(); + netDataWriter.Put(entity.Id); + return netDataWriter; + } + + private void OnEntityIdChanged(IEntity entity, string previousId) + { + var action = callbacks[previousId]; + callbacks.Remove(previousId); + callbacks.Add(entity.Id, action); + } +} diff --git a/Game/Network/NetworkClient.cs b/Game/Network/NetworkClient.cs index 7c58c22..2542150 100644 --- a/Game/Network/NetworkClient.cs +++ b/Game/Network/NetworkClient.cs @@ -1,34 +1,10 @@ -using System; -using System.Collections.Generic; -using LiteNetLib; - -using Syntriax.Engine.Core; -using Syntriax.Engine.Core.Abstract; - namespace Pong.Network; -public class NetworkClient : BehaviourOverride, INetworkClient +public class NetworkClient : NetworkBase, INetworkClient { - public EventBasedNetListener Listener { get; private set; } = null!; - public NetManager Manager { get; private set; } = null!; - - public NetworkClient() - { - Priority = 10; - - Listener = new EventBasedNetListener(); - Manager = new NetManager(Listener); - } - public void Connect(string address, int port, string? password = null) { Manager.Start(); Manager.Connect(address, port, password ?? string.Empty); } - - public void PollEvents() => Manager.PollEvents(); - public void Stop() => Manager.Stop(); - - protected override void OnUpdate() => PollEvents(); - protected override void OnFinalize() => Stop(); } diff --git a/Game/Network/NetworkServer.cs b/Game/Network/NetworkServer.cs index 175282f..e757a1d 100644 --- a/Game/Network/NetworkServer.cs +++ b/Game/Network/NetworkServer.cs @@ -1,28 +1,13 @@ -using System; -using System.Collections.Generic; -using LiteNetLib; - -using Syntriax.Engine.Core; -using Syntriax.Engine.Core.Abstract; - namespace Pong.Network; -public class NetworkServer : BehaviourOverride, INetworkServer +public class NetworkServer : NetworkBase, INetworkServer { public string Password { get; private set; } = string.Empty; public int MaxConnectionCount { get; private set; } = 0; public int Port { get; private set; } = 8888; - public EventBasedNetListener Listener { get; private set; } = null!; - public NetManager Manager { get; private set; } = null!; - - public NetworkServer() + public NetworkServer() : base() { - Priority = 10; - - Listener = new EventBasedNetListener(); - Manager = new NetManager(Listener); - Listener.ConnectionRequestEvent += request => { if (Manager.ConnectedPeersCount < MaxConnectionCount) @@ -40,10 +25,4 @@ public class NetworkServer : BehaviourOverride, INetworkServer Manager.Start(port); } - - public void PollEvents() => Manager.PollEvents(); - public void Stop() => Manager.Stop(); - - protected override void OnUpdate() => PollEvents(); - protected override void OnFinalize() => Stop(); }