Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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;
            }
        }
Example #4
0
        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);
        }