diff --git a/Game/Network/NetworkBase.cs b/Game/Network/NetworkBase.cs index a8c19ca..70f314c 100644 --- a/Game/Network/NetworkBase.cs +++ b/Game/Network/NetworkBase.cs @@ -124,10 +124,26 @@ public abstract class NetworkBase : BehaviourOverride, INetworkCommunicator } private void OnNetworkEntityCollected(BehaviourCollector sender, INetworkEntity behaviourCollected) - => networkEntities.Add(behaviourCollected.NetworkId, behaviourCollected); + { + if (behaviourCollected.NetworkId != 0) + networkEntities.Add(behaviourCollected.NetworkId, behaviourCollected); + + behaviourCollected.OnNetworkIdChanged += OnNetworkIdChanged; + } + + private void OnNetworkIdChanged(INetworkEntity sender, uint previousId) + { + if (networkEntities.TryGetValue(previousId, out INetworkEntity? networkEntity) && sender == networkEntity) + networkEntities.Remove(previousId); + + networkEntities.Add(sender.NetworkId, sender); + } private void OnNetworkEntityRemoved(BehaviourCollector sender, INetworkEntity behaviourRemoved) - => networkEntities.Remove(behaviourRemoved.NetworkId); + { + networkEntities.Remove(behaviourRemoved.NetworkId); + behaviourRemoved.OnNetworkIdChanged -= OnNetworkIdChanged; + } private void NetworkReceiveEvent(NetPeer peer, NetPacketReader reader, byte channel, DeliveryMethod deliveryMethod) {