private Room AddRoom(User owner, string name, int mapId, byte size) { var room = Pool.Get <Room>(); var gameType = owner.GameType; owner.Room = room; room.Init(gameType, _roomIdCounter++, name, mapId, size, owner); _roomId2Room.Add(room.RoomId, room); if (_gameType2Rooms.TryGetValue(gameType, out var prooms)) { prooms.Add(room); } else { var rooms = new List <Room>(); rooms.Add(room); _gameType2Rooms.Add(gameType, rooms); } if (_type2RroomInfos.TryGetValue(gameType, out var pRoomInfos)) { pRoomInfos.Add(room.Info); } else { var roomInfos = new List <RoomInfo>(); roomInfos.Add(room.Info); _type2RroomInfos.Add(gameType, roomInfos); } _cachedType2RoomInfos.Remove(gameType); return(room); }
private void RemovePlayer(User user) { Debug.Log("RemoveRoom " + user.UserId); var room = user.Room; if (room != null) { if (room.IsPlaying) //游戏中的玩家需要考虑断线重连 { user.Room = null; _peerId2Player.Remove(user.Peer.Id); return; } else { room.RemoveUser(user); if (room.IsEmpty) { RemoveRoom(room); } } } user.Room = null; _uid2Player.Remove(user.UserId); _peerId2Player.Remove(user.Peer.Id); }
private void RemovePlayer(User user, bool isForce = false) { Debug.Log("RemovePlayer " + user.Account + " id " + user.UserId); var room = user.Room; if (room != null) { if (room.IsPlaying && !isForce) //游戏中的玩家需要考虑断线重连 { if (user.Peer != null) { _peerId2Player.Remove(user.Peer.Id); user.Peer.CleanExtension(); user.Peer?.Disconnect("Remove"); user.Peer = null; } return; } room.ServerPeer?.SendMessage((short)EMsgLS.L2G_UserLeave, new Msg_L2G_UserLeave() { GameId = room.RoomId, UserId = user.UserId }); room.RemoveUser(user); if (room.IsEmpty) { RemoveRoom(room); } } user.Room = null; _uid2Player.Remove(user.UserId); if (user.Peer != null) { _peerId2Player.Remove(user.Peer.Id); user.Peer.CleanExtension(); user.Peer?.Disconnect("Tick out"); user.Peer = null; } }
private IEnumerator LoginAndTickPlayer(IIncommingMessage reader, User oldPlayer, Msg_I2L_UserLogin msg) { Debug.Log("before WaitRemovePlayer " + LTime.timeSinceLevelLoad); yield return(new WaitForSeconds(0.5f)); Debug.Log("after WaitRemovePlayer " + LTime.timeSinceLevelLoad); RemovePlayer(oldPlayer); var room = oldPlayer.Room; if (room != null && room.IsPlaying && room.GameType == msg.GameType) { //断线重连 Log("Reconnect " + oldPlayer); oldPlayer.LoginHash = msg.LoginHash; oldPlayer.GameType = msg.GameType; } else { Log("Someone is using the account: Tick" + oldPlayer); AddPlayer(msg.UserId, msg.GameType, msg.Account, msg.Account, msg.LoginHash); } reader.Respond(1, EResponseStatus.Success); }