public void PeerDisconnected(IPeer peer, IDisconnectInfo info)
        {
            lock (_syncPeersList)
            {
                var sessionId = peer.GetSessionId();
                if (!_sessionsToRooms.TryGetValue(sessionId, out var room))
                {
                    _logger.Error($"PeerDisconnected error: Can not get room for peer {sessionId}");
                    return;
                }

                if (room.PeerDisconnected(sessionId, info))
                {
                    _gameMetrics.TrackPeerDisconnected();
                }

                _sessionsToRooms.TryRemove(sessionId, out _);
                _messageSender.CleanupPeerData(peer);

                if (room.IsGameFinished())
                {
                    DeleteRoom(room.GetRoomId());
                }
            }
        }
 private void OnDisconnected(IPEndPoint obj, IDisconnectInfo info)
 {
     if (_ep.Equals(obj))
     {
         _connected = false;
         OnDisconnectedFromServer?.Invoke(info);
     }
 }
예제 #3
0
        public void OnClientDisconnect(IPEndPoint endPoint, IDisconnectInfo info)
        {
            // _logger.Error($"Disconnected: {endPoint.Address} : {endPoint.Port}. Reason: {info.Reason}");
            if (!PeerCollection.TryRemove(endPoint, out var peer))
            {
                _logger.Warning(
                    $"OnClientDisconnect error: can not find peer for endpoint {endPoint.Address}:{endPoint.Port}");
                return;
            }

            PeerCollection.Remove(endPoint);
            ProcessDisconnectedPeer(peer, info);
        }
예제 #4
0
 protected override void ProcessDisconnectedPeer(GamePeer peer, IDisconnectInfo info)
 {
     try
     {
         if (_roomManager.IsInRoom(peer.GetSessionId()))
         {
             _roomManager.PeerDisconnected(peer, info);
         }
     }
     finally
     {
         _messageSender.CleanupPeerData(peer);
     }
 }
예제 #5
0
        public bool PeerDisconnected(Guid sessionId, IDisconnectInfo reason)
        {
            var peerRemoved = _roomPlayers.TryRemove(sessionId, out var roomPlayer);

            if (peerRemoved)
            {
                _packetSender.CleanupPeerData(roomPlayer.Peer);
            }
            _roomPropertiesContainer.RemovePlayer(sessionId);
            try
            {
                _roomController.ProcessPlayerDisconnected(sessionId, ResolveReason(reason.Reason), reason.Payload);
            }
            catch (Exception ex)
            {
                _logger.Error($"CleanUpPlayer error: {ex}");
            }
            UpdateRoomStateOnMm();
            return(peerRemoved);
        }
예제 #6
0
 protected abstract void ProcessDisconnectedPeer(T peer, IDisconnectInfo info);
예제 #7
0
 protected override void ProcessDisconnectedPeer(MmPeer peer, IDisconnectInfo info)
 {
     _matchMaker.RemovePlayer(peer.GetPeerId());
     _messageSender.CleanupPeerData(peer);
 }
예제 #8
0
 private void OnDisconnected(IDisconnectInfo disconnectInfo)
 {
     _logger.Info($"Disconnected from server: {disconnectInfo.Reason}");
     OnDisconnectedFromServer?.Invoke(disconnectInfo);
 }