From 29829bbaa6dd0d9fe43b6f28a4fcab6617ace335 Mon Sep 17 00:00:00 2001 From: Syntriax Date: Mon, 26 May 2025 21:58:05 +0300 Subject: [PATCH] refactor: entity packets now directly go into the target entity --- Shared/Behaviours/PaddleBehaviour.cs | 4 +-- Shared/Network/NetworkManager.cs | 54 +++++++++++++++++++--------- 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/Shared/Behaviours/PaddleBehaviour.cs b/Shared/Behaviours/PaddleBehaviour.cs index d553ad1..fb8838f 100644 --- a/Shared/Behaviours/PaddleBehaviour.cs +++ b/Shared/Behaviours/PaddleBehaviour.cs @@ -80,11 +80,9 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp public void OnClientPacketArrived(PaddleKeyStatePacket packet) { - if (packet.EntityId.CompareTo(Id) != 0) - return; - isUpPressed = packet.IsUpPressed; isDownPressed = packet.IsDownPressed; + if (!isUpPressed && !isDownPressed) Transform.Position.TweenVector2D(tweenManager, .05f, packet.Position, x => Transform.Position = x); else diff --git a/Shared/Network/NetworkManager.cs b/Shared/Network/NetworkManager.cs index 32ef3e5..3979395 100644 --- a/Shared/Network/NetworkManager.cs +++ b/Shared/Network/NetworkManager.cs @@ -28,8 +28,8 @@ public class NetworkManager : UniverseObject, INetworkManager } } - private readonly Dictionary> clientPacketListeners = []; - private readonly Dictionary> serverPacketListeners = []; + private readonly Dictionary> clientPacketListeners = []; + private readonly Dictionary> serverPacketListeners = []; private readonly Dictionary _networkEntities = []; public IReadOnlyDictionary NetworkEntities => _networkEntities; @@ -95,20 +95,42 @@ public class NetworkManager : UniverseObject, INetworkManager { Type packetType = typeof(T); + if (entityDataPacket is IEntityNetworkPacket entityPacket) + { + if (networkCommunicator is INetworkCommunicatorClient) + if (clientPacketListeners.TryGetValue(packetType, out Dictionary? clientListeners)) + if (clientListeners.TryGetValue(entityPacket.EntityId, out object? clientListener)) + { + MethodInfo clientListenerReceiveMethod = typeof(IPacketListenerClient<>).MakeGenericType(packetType).GetMethods().First(m => m.Name == nameof(IPacketListenerClient.OnClientPacketArrived)); + clientListenerReceiveMethod.Invoke(clientListener, [entityDataPacket]); + } + + if (networkCommunicator is INetworkCommunicatorServer) + if (serverPacketListeners.TryGetValue(packetType, out Dictionary? serverListeners)) + if (serverListeners.TryGetValue(entityPacket.EntityId, out object? serverListener)) + { + MethodInfo serverListenerReceiveMethod = typeof(IPacketListenerServer<>).MakeGenericType(packetType).GetMethods().First(m => m.Name == nameof(IPacketListenerServer.OnServerPacketArrived)); + serverListenerReceiveMethod.Invoke(serverListener, [entityDataPacket, fromClientId]); + } + + return; + } + if (networkCommunicator is INetworkCommunicatorClient) - if (clientPacketListeners.TryGetValue(packetType, out List? clientListeners)) - foreach (object clientListener in clientListeners) - { - MethodInfo clientListenerReceiveMethod = typeof(IPacketListenerClient<>).MakeGenericType(packetType).GetMethods().First(m => m.Name == nameof(IPacketListenerClient.OnClientPacketArrived)); + if (clientPacketListeners.TryGetValue(packetType, out Dictionary? clientListeners)) + { + MethodInfo clientListenerReceiveMethod = typeof(IPacketListenerClient<>).MakeGenericType(packetType).GetMethods().First(m => m.Name == nameof(IPacketListenerClient.OnClientPacketArrived)); + foreach ((string id, object clientListener) in clientListeners) clientListenerReceiveMethod.Invoke(clientListener, [entityDataPacket]); - } + } + if (networkCommunicator is INetworkCommunicatorServer) - if (serverPacketListeners.TryGetValue(packetType, out List? serverListeners)) - foreach (object serverListener in serverListeners) - { - MethodInfo serverListenerReceiveMethod = typeof(IPacketListenerServer<>).MakeGenericType(packetType).GetMethods().First(m => m.Name == nameof(IPacketListenerServer.OnServerPacketArrived)); + if (serverPacketListeners.TryGetValue(packetType, out Dictionary? serverListeners)) + { + MethodInfo serverListenerReceiveMethod = typeof(IPacketListenerServer<>).MakeGenericType(packetType).GetMethods().First(m => m.Name == nameof(IPacketListenerServer.OnServerPacketArrived)); + foreach ((string id, object serverListener) in serverListeners) serverListenerReceiveMethod.Invoke(serverListener, [entityDataPacket, fromClientId]); - } + } } private void OnCollected(IBehaviourCollector sender, INetworkEntity behaviourCollected) @@ -120,26 +142,26 @@ public class NetworkManager : UniverseObject, INetworkManager { Type clientListenerParameterType = clientListenerType.GetGenericArguments().First(); - if (!clientPacketListeners.TryGetValue(clientListenerParameterType, out List? clientListeners)) + if (!clientPacketListeners.TryGetValue(clientListenerParameterType, out Dictionary? clientListeners)) { clientListeners = []; clientPacketListeners.Add(clientListenerParameterType, clientListeners); } - clientListeners.Add(behaviourCollected); + clientListeners.Add(behaviourCollected.Id, behaviourCollected); } foreach (Type serverListenerType in behaviourCollected.GetType().GetInterfaces().Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IPacketListenerServer<>))) { Type serverListenerParameterType = serverListenerType.GetGenericArguments().First(); - if (!serverPacketListeners.TryGetValue(serverListenerParameterType, out List? serverListeners)) + if (!serverPacketListeners.TryGetValue(serverListenerParameterType, out Dictionary? serverListeners)) { serverListeners = []; serverPacketListeners.Add(serverListenerParameterType, serverListeners); } - serverListeners.Add(behaviourCollected); + serverListeners.Add(behaviourCollected.Id, behaviourCollected); } }