refactor: entity packets now directly go into the target entity

This commit is contained in:
Syntriax 2025-05-26 21:58:05 +03:00
parent 12f4950ffb
commit 29829bbaa6
2 changed files with 39 additions and 19 deletions

View File

@ -80,11 +80,9 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp
public void OnClientPacketArrived(PaddleKeyStatePacket packet) public void OnClientPacketArrived(PaddleKeyStatePacket packet)
{ {
if (packet.EntityId.CompareTo(Id) != 0)
return;
isUpPressed = packet.IsUpPressed; isUpPressed = packet.IsUpPressed;
isDownPressed = packet.IsDownPressed; isDownPressed = packet.IsDownPressed;
if (!isUpPressed && !isDownPressed) if (!isUpPressed && !isDownPressed)
Transform.Position.TweenVector2D(tweenManager, .05f, packet.Position, x => Transform.Position = x); Transform.Position.TweenVector2D(tweenManager, .05f, packet.Position, x => Transform.Position = x);
else else

View File

@ -28,8 +28,8 @@ public class NetworkManager : UniverseObject, INetworkManager
} }
} }
private readonly Dictionary<Type, List<object>> clientPacketListeners = []; private readonly Dictionary<Type, Dictionary<string, object>> clientPacketListeners = [];
private readonly Dictionary<Type, List<object>> serverPacketListeners = []; private readonly Dictionary<Type, Dictionary<string, object>> serverPacketListeners = [];
private readonly Dictionary<string, INetworkEntity> _networkEntities = []; private readonly Dictionary<string, INetworkEntity> _networkEntities = [];
public IReadOnlyDictionary<string, INetworkEntity> NetworkEntities => _networkEntities; public IReadOnlyDictionary<string, INetworkEntity> NetworkEntities => _networkEntities;
@ -95,20 +95,42 @@ public class NetworkManager : UniverseObject, INetworkManager
{ {
Type packetType = typeof(T); Type packetType = typeof(T);
if (entityDataPacket is IEntityNetworkPacket entityPacket)
{
if (networkCommunicator is INetworkCommunicatorClient)
if (clientPacketListeners.TryGetValue(packetType, out Dictionary<string, object>? clientListeners))
if (clientListeners.TryGetValue(entityPacket.EntityId, out object? clientListener))
{
MethodInfo clientListenerReceiveMethod = typeof(IPacketListenerClient<>).MakeGenericType(packetType).GetMethods().First(m => m.Name == nameof(IPacketListenerClient<T>.OnClientPacketArrived));
clientListenerReceiveMethod.Invoke(clientListener, [entityDataPacket]);
}
if (networkCommunicator is INetworkCommunicatorServer)
if (serverPacketListeners.TryGetValue(packetType, out Dictionary<string, object>? serverListeners))
if (serverListeners.TryGetValue(entityPacket.EntityId, out object? serverListener))
{
MethodInfo serverListenerReceiveMethod = typeof(IPacketListenerServer<>).MakeGenericType(packetType).GetMethods().First(m => m.Name == nameof(IPacketListenerServer<T>.OnServerPacketArrived));
serverListenerReceiveMethod.Invoke(serverListener, [entityDataPacket, fromClientId]);
}
return;
}
if (networkCommunicator is INetworkCommunicatorClient) if (networkCommunicator is INetworkCommunicatorClient)
if (clientPacketListeners.TryGetValue(packetType, out List<object>? clientListeners)) if (clientPacketListeners.TryGetValue(packetType, out Dictionary<string, object>? clientListeners))
foreach (object clientListener in clientListeners) {
{ MethodInfo clientListenerReceiveMethod = typeof(IPacketListenerClient<>).MakeGenericType(packetType).GetMethods().First(m => m.Name == nameof(IPacketListenerClient<T>.OnClientPacketArrived));
MethodInfo clientListenerReceiveMethod = typeof(IPacketListenerClient<>).MakeGenericType(packetType).GetMethods().First(m => m.Name == nameof(IPacketListenerClient<T>.OnClientPacketArrived)); foreach ((string id, object clientListener) in clientListeners)
clientListenerReceiveMethod.Invoke(clientListener, [entityDataPacket]); clientListenerReceiveMethod.Invoke(clientListener, [entityDataPacket]);
} }
if (networkCommunicator is INetworkCommunicatorServer) if (networkCommunicator is INetworkCommunicatorServer)
if (serverPacketListeners.TryGetValue(packetType, out List<object>? serverListeners)) if (serverPacketListeners.TryGetValue(packetType, out Dictionary<string, object>? serverListeners))
foreach (object serverListener in serverListeners) {
{ MethodInfo serverListenerReceiveMethod = typeof(IPacketListenerServer<>).MakeGenericType(packetType).GetMethods().First(m => m.Name == nameof(IPacketListenerServer<T>.OnServerPacketArrived));
MethodInfo serverListenerReceiveMethod = typeof(IPacketListenerServer<>).MakeGenericType(packetType).GetMethods().First(m => m.Name == nameof(IPacketListenerServer<T>.OnServerPacketArrived)); foreach ((string id, object serverListener) in serverListeners)
serverListenerReceiveMethod.Invoke(serverListener, [entityDataPacket, fromClientId]); serverListenerReceiveMethod.Invoke(serverListener, [entityDataPacket, fromClientId]);
} }
} }
private void OnCollected(IBehaviourCollector<INetworkEntity> sender, INetworkEntity behaviourCollected) private void OnCollected(IBehaviourCollector<INetworkEntity> sender, INetworkEntity behaviourCollected)
@ -120,26 +142,26 @@ public class NetworkManager : UniverseObject, INetworkManager
{ {
Type clientListenerParameterType = clientListenerType.GetGenericArguments().First(); Type clientListenerParameterType = clientListenerType.GetGenericArguments().First();
if (!clientPacketListeners.TryGetValue(clientListenerParameterType, out List<object>? clientListeners)) if (!clientPacketListeners.TryGetValue(clientListenerParameterType, out Dictionary<string, object>? clientListeners))
{ {
clientListeners = []; clientListeners = [];
clientPacketListeners.Add(clientListenerParameterType, 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<>))) foreach (Type serverListenerType in behaviourCollected.GetType().GetInterfaces().Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IPacketListenerServer<>)))
{ {
Type serverListenerParameterType = serverListenerType.GetGenericArguments().First(); Type serverListenerParameterType = serverListenerType.GetGenericArguments().First();
if (!serverPacketListeners.TryGetValue(serverListenerParameterType, out List<object>? serverListeners)) if (!serverPacketListeners.TryGetValue(serverListenerParameterType, out Dictionary<string, object>? serverListeners))
{ {
serverListeners = []; serverListeners = [];
serverPacketListeners.Add(serverListenerParameterType, serverListeners); serverPacketListeners.Add(serverListenerParameterType, serverListeners);
} }
serverListeners.Add(behaviourCollected); serverListeners.Add(behaviourCollected.Id, behaviourCollected);
} }
} }