Exemplo n.º 1
0
        internal static Protocol.RoomOptions ConvertToRoomOptions(string roomName, RoomOptions options, List <string> expectedUserIds)
        {
            var roomOptions = new Protocol.RoomOptions();

            if (!string.IsNullOrEmpty(roomName))
            {
                roomOptions.Cid = roomName;
            }
            if (options != null)
            {
                roomOptions.Visible      = options.Visible;
                roomOptions.Open         = options.Open;
                roomOptions.EmptyRoomTtl = options.EmptyRoomTtl;
                roomOptions.PlayerTtl    = options.PlayerTtl;
                roomOptions.MaxMembers   = options.MaxPlayerCount;
                roomOptions.Flag         = options.Flag;
                roomOptions.Attr         = CodecUtils.Serialize(options.CustomRoomProperties).ToByteString();
                roomOptions.LobbyAttrKeys.AddRange(options.CustomRoomPropertyKeysForLobby);
            }
            if (expectedUserIds != null)
            {
                roomOptions.ExpectMembers.AddRange(expectedUserIds);
            }
            return(roomOptions);
        }
Exemplo n.º 2
0
        internal async Task JoinRandom(PlayObject matchProperties, List <string> expectedUserIds)
        {
            state = State.Joining;
            try {
                LobbyInfo lobbyInfo = await Client.lobbyService.Authorize();

                LobbyRoomResult lobbyRoom = await Client.lobbyService.JoinRandomRoom(matchProperties, expectedUserIds);

                gameConn = new GameConnection();
                await gameConn.Connect(Client.AppId, lobbyRoom.Url, Client.GameVersion, Client.UserId, lobbyInfo.SessionToken);

                Protocol.RoomOptions options = await gameConn.JoinRoom(lobbyRoom.RoomId, expectedUserIds);

                Init(options);
                state = State.Game;
            } catch (Exception e) {
                state = State.Closed;
                throw e;
            }
        }
Exemplo n.º 3
0
        internal async Task Rejoin(string roomName)
        {
            state = State.Joining;
            try {
                LobbyInfo lobbyInfo = await Client.lobbyService.Authorize();

                LobbyRoomResult lobbyRoom = await Client.lobbyService.JoinRoom(roomName, null, true, false);

                gameConn = new GameConnection();
                await gameConn.Connect(Client.AppId, lobbyRoom.Url, Client.GameVersion, Client.UserId, lobbyInfo.SessionToken);

                Protocol.RoomOptions options = await gameConn.JoinRoom(lobbyRoom.RoomId, null);

                Init(options);
                state = State.Game;
            } catch (Exception e) {
                state = State.Closed;
                throw e;
            }
        }
Exemplo n.º 4
0
        internal async Task Create(string roomName, RoomOptions roomOptions, List <string> expectedUserIds)
        {
            state = State.Joining;
            try {
                LobbyRoomResult lobbyRoom = await Client.lobbyService.CreateRoom(roomName);

                gameConn = new GameConnection();
                LobbyInfo lobbyInfo = await Client.lobbyService.Authorize();

                await gameConn.Connect(Client.AppId, lobbyRoom.Url, Client.GameVersion, Client.UserId, lobbyInfo.SessionToken);

                Protocol.RoomOptions options = await gameConn.CreateRoom(lobbyRoom.RoomId, roomOptions, expectedUserIds);

                Init(options);
                state = State.Game;
            } catch (Exception e) {
                Logger.Error(e.Message);
                state = State.Closed;
                throw e;
            }
        }
Exemplo n.º 5
0
        LobbyRoom ConvertToLobbyRoom(Protocol.RoomOptions options)
        {
            var lobbyRoom = new LobbyRoom {
                RoomName       = options.Cid,
                Open           = options.Open == null || options.Open.Value,
                Visible        = options.Visible == null || options.Visible.Value,
                MaxPlayerCount = options.MaxMembers,
                PlayerCount    = options.MemberCount,
                EmptyRoomTtl   = options.EmptyRoomTtl,
                PlayerTtl      = options.PlayerTtl
            };

            if (options.ExpectMembers != null)
            {
                lobbyRoom.ExpectedUserIds = options.ExpectMembers.ToList <string>();
            }
            if (options.Attr != null)
            {
                lobbyRoom.CustomRoomProperties = CodecUtils.DeserializePlayObject(options.Attr);
            }
            return(lobbyRoom);
        }
Exemplo n.º 6
0
        void Init(Protocol.RoomOptions options)
        {
            Name            = options.Cid;
            Open            = options.Open == null || options.Open.Value;
            Visible         = options.Visible == null || options.Visible.Value;
            MaxPlayerCount  = options.MaxMembers;
            MasterActorId   = options.MasterActorId;
            ExpectedUserIds = new List <string>();
            if (options.ExpectMembers != null)
            {
                ExpectedUserIds.AddRange(options.ExpectMembers);
            }
            playerDict = new Dictionary <int, Player>();
            foreach (RoomMember member in options.Members)
            {
                Player player = new Player();
                player.Init(this, member);
                if (player.UserId == Client.UserId)
                {
                    Player = player;
                }
                playerDict.Add(player.ActorId, player);
            }
            // attr
            CustomProperties    = CodecUtils.DeserializePlayObject(options.Attr);
            gameConn.OnMessage += (cmd, op, body) => {
                switch (cmd)
                {
                case CommandType.Conv:
                    switch (op)
                    {
                    case OpType.MembersJoined:
                        HandlePlayerJoinedRoom(body.RoomNotification.JoinRoom);
                        break;

                    case OpType.MembersLeft:
                        HandlePlayerLeftRoom(body.RoomNotification.LeftRoom);
                        break;

                    case OpType.MasterClientChanged:
                        HandleMasterChanged(body.RoomNotification.UpdateMasterClient);
                        break;

                    case OpType.SystemPropertyUpdatedNotify:
                        HandleRoomSystemPropertiesChanged(body.RoomNotification.UpdateSysProperty);
                        break;

                    case OpType.UpdatedNotify:
                        HandleRoomCustomPropertiesChanged(body.RoomNotification.UpdateProperty);
                        break;

                    case OpType.PlayerProps:
                        HandlePlayerCustomPropertiesChanged(body.RoomNotification.UpdateProperty);
                        break;

                    case OpType.MembersOffline:
                        HandlePlayerOffline(body.RoomNotification);
                        break;

                    case OpType.MembersOnline:
                        HandlePlayerOnline(body.RoomNotification);
                        break;

                    case OpType.KickedNotice:
                        HandleRoomKicked(body.RoomNotification);
                        break;

                    default:
                        Logger.Error("unknown msg: {0}/{1} {2}", cmd, op, body);
                        break;
                    }
                    break;

                case CommandType.Events:
                    break;

                case CommandType.Direct:
                    HandleSendEvent(body.Direct);
                    break;

                case CommandType.Error: {
                    Logger.Error("error msg: {0}", body);
                    ErrorInfo errorInfo = body.Error.ErrorInfo;
                    Client.OnError?.Invoke(errorInfo.ReasonCode, errorInfo.Detail);
                }
                break;

                default:
                    Logger.Error("unknown msg: {0}/{1} {2}", cmd, op, body);
                    break;
                }
            };
            gameConn.OnClose += (code, message) => {
                Client.OnDisconnected?.Invoke();
            };
        }