fix: network manager not unmonitoring removed universe objects

This commit is contained in:
Syntriax 2025-05-31 23:22:12 +03:00
parent f3ff1b74d2
commit b3dd0f72a4

View File

@ -208,7 +208,37 @@ public class NetworkManager : UniverseObject, INetworkManager
private void OnRemoved(IBehaviourCollector<INetworkEntity> sender, IBehaviourCollector<INetworkEntity>.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<Type, List<DelegateData>>? clientInterfaceDelegates))
foreach ((Type clientListenerInterfaceType, List<DelegateData> clientDelegateDataList) in clientInterfaceDelegates)
foreach ((Type parameterType, MethodInfo receiveMethod) in clientDelegateDataList)
{
if (!clientPacketListeners.TryGetValue(parameterType, out Dictionary<string, Event<string, object>>? clientListeners))
continue;
if (!clientListeners.TryGetValue(removedBehaviour.Id, out Event<string, object>? clientListenerEvent))
continue;
clientListeners.Remove(removedBehaviour.Id);
clientListenerEvent.Clear();
}
if (serverListenerDelegates.TryGetValue(removedBehaviour.GetType(), out Dictionary<Type, List<DelegateData>>? serverInterfaceDelegates))
foreach ((Type serverListenerInterfaceType, List<DelegateData> serverDelegateDataList) in serverInterfaceDelegates)
foreach ((Type parameterType, MethodInfo receiveMethod) in serverDelegateDataList)
{
if (!serverPacketListeners.TryGetValue(parameterType, out Dictionary<string, Event<string, object>>? serverListeners))
continue;
if (!serverListeners.TryGetValue(removedBehaviour.Id, out Event<string, object>? serverListenerEvent))
continue;
serverListeners.Remove(removedBehaviour.Id);
serverListenerEvent.Clear();
}
}
protected override void OnExitingUniverse(IUniverse universe) => _networkEntityCollector.Unassign();