From b3dd0f72a434bc138ad2ab736ca6f696c0b3c92e Mon Sep 17 00:00:00 2001 From: Syntriax Date: Sat, 31 May 2025 23:22:12 +0300 Subject: [PATCH] fix: network manager not unmonitoring removed universe objects --- Shared/Network/NetworkManager.cs | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/Shared/Network/NetworkManager.cs b/Shared/Network/NetworkManager.cs index 6175ed5..b86c6fd 100644 --- a/Shared/Network/NetworkManager.cs +++ b/Shared/Network/NetworkManager.cs @@ -208,7 +208,37 @@ public class NetworkManager : UniverseObject, INetworkManager private void OnRemoved(IBehaviourCollector sender, IBehaviourCollector.BehaviourRemovedArguments args) { - _networkEntities.Remove(args.BehaviourRemoved.Id); + INetworkEntity removedBehaviour = args.BehaviourRemoved; + if (!_networkEntities.Remove(args.BehaviourRemoved.Id)) + return; + + if (clientListenerDelegates.TryGetValue(removedBehaviour.GetType(), out Dictionary>? clientInterfaceDelegates)) + foreach ((Type clientListenerInterfaceType, List clientDelegateDataList) in clientInterfaceDelegates) + foreach ((Type parameterType, MethodInfo receiveMethod) in clientDelegateDataList) + { + if (!clientPacketListeners.TryGetValue(parameterType, out Dictionary>? clientListeners)) + continue; + + if (!clientListeners.TryGetValue(removedBehaviour.Id, out Event? clientListenerEvent)) + continue; + + clientListeners.Remove(removedBehaviour.Id); + clientListenerEvent.Clear(); + } + + if (serverListenerDelegates.TryGetValue(removedBehaviour.GetType(), out Dictionary>? serverInterfaceDelegates)) + foreach ((Type serverListenerInterfaceType, List serverDelegateDataList) in serverInterfaceDelegates) + foreach ((Type parameterType, MethodInfo receiveMethod) in serverDelegateDataList) + { + if (!serverPacketListeners.TryGetValue(parameterType, out Dictionary>? serverListeners)) + continue; + + if (!serverListeners.TryGetValue(removedBehaviour.Id, out Event? serverListenerEvent)) + continue; + + serverListeners.Remove(removedBehaviour.Id); + serverListenerEvent.Clear(); + } } protected override void OnExitingUniverse(IUniverse universe) => _networkEntityCollector.Unassign();