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); }
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; } }
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; } }
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; } }
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); }
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(); }; }