diff --git a/Engine b/Engine index 2df41e1..8f8558a 160000 --- a/Engine +++ b/Engine @@ -1 +1 @@ -Subproject commit 2df41e18818e314ebfa21e578500d5e3161cf850 +Subproject commit 8f8558a262a20d584afd38369b02c4c50d86b20f diff --git a/Shared/Network/NetworkManager.cs b/Shared/Network/NetworkManager.cs index 3979395..9cee79d 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; @@ -98,39 +98,27 @@ public class NetworkManager : UniverseObject, INetworkManager 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 (clientPacketListeners.TryGetValue(packetType, out Dictionary? clientListeners)) + if (clientListeners.TryGetValue(entityPacket.EntityId, out PacketListenerData clientListenerData)) + clientListenerData.ListenerMethod.Invoke(clientListenerData.Object, [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]); - } + if (serverPacketListeners.TryGetValue(packetType, out Dictionary? serverListeners)) + if (serverListeners.TryGetValue(entityPacket.EntityId, out PacketListenerData serverListenerData)) + serverListenerData.ListenerMethod.Invoke(serverListenerData.Object, [entityDataPacket, fromClientId]); return; } if (networkCommunicator is INetworkCommunicatorClient) - 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 (clientPacketListeners.TryGetValue(packetType, out Dictionary? clientListeners)) + foreach ((string id, PacketListenerData clientListenerData) in clientListeners) + clientListenerData.ListenerMethod.Invoke(clientListenerData.Object, [entityDataPacket]); if (networkCommunicator is INetworkCommunicatorServer) - 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]); - } + if (serverPacketListeners.TryGetValue(packetType, out Dictionary? serverListeners)) + foreach ((string id, PacketListenerData serverListenerData) in serverListeners) + serverListenerData.ListenerMethod.Invoke(serverListenerData.Object, [entityDataPacket, fromClientId]); } private void OnCollected(IBehaviourCollector sender, INetworkEntity behaviourCollected) @@ -141,27 +129,29 @@ public class NetworkManager : UniverseObject, INetworkManager foreach (Type clientListenerType in behaviourCollected.GetType().GetInterfaces().Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IPacketListenerClient<>))) { Type clientListenerParameterType = clientListenerType.GetGenericArguments().First(); + MethodInfo clientListenerReceiveMethod = clientListenerType.GetMethods().First(m => m.Name == nameof(IPacketListenerClient.OnClientPacketArrived)); - if (!clientPacketListeners.TryGetValue(clientListenerParameterType, out Dictionary? clientListeners)) + if (!clientPacketListeners.TryGetValue(clientListenerParameterType, out Dictionary? clientListeners)) { clientListeners = []; clientPacketListeners.Add(clientListenerParameterType, clientListeners); } - clientListeners.Add(behaviourCollected.Id, behaviourCollected); + clientListeners.Add(behaviourCollected.Id, new(behaviourCollected, clientListenerReceiveMethod)); } foreach (Type serverListenerType in behaviourCollected.GetType().GetInterfaces().Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IPacketListenerServer<>))) { Type serverListenerParameterType = serverListenerType.GetGenericArguments().First(); + MethodInfo serverListenerReceiveMethod = serverListenerType.GetMethods().First(m => m.Name == nameof(IPacketListenerServer.OnServerPacketArrived)); - if (!serverPacketListeners.TryGetValue(serverListenerParameterType, out Dictionary? serverListeners)) + if (!serverPacketListeners.TryGetValue(serverListenerParameterType, out Dictionary? serverListeners)) { serverListeners = []; serverPacketListeners.Add(serverListenerParameterType, serverListeners); } - serverListeners.Add(behaviourCollected.Id, behaviourCollected); + serverListeners.Add(behaviourCollected.Id, new(behaviourCollected, serverListenerReceiveMethod)); } } @@ -176,4 +166,10 @@ public class NetworkManager : UniverseObject, INetworkManager _networkEntityCollector.Assign(universe); NetworkCommunicator = this.GetRequiredUniverseObjectInParent(); } + + private record struct PacketListenerData(object Object, MethodInfo ListenerMethod) + { + public static implicit operator (object @object, MethodInfo listenerMethod)(PacketListenerData value) => (value.Object, value.ListenerMethod); + public static implicit operator PacketListenerData((object @object, MethodInfo listenerMethod) value) => new(value.@object, value.listenerMethod); + } }