/// <summary> /// Signals the game manager to connect to a server /// </summary> public IEnumerator ConnectToServerCoroutine(string hostname, int port) { // open loading screen AsyncOperation loadLoadingScreenTask = SceneManager.LoadSceneAsync("LoadingScreen", LoadSceneMode.Additive); while (!loadLoadingScreenTask.isDone) { yield return(null); } Debug.Log("Loading screen opened"); SceneManager.SetActiveScene(SceneManager.GetSceneByName("LoadingScreen")); SceneManager.MoveGameObjectToScene(gameObject, SceneManager.GetSceneByName("LoadingScreen")); AsyncOperation unloadMainMenuTask = SceneManager.UnloadSceneAsync("MainMenu"); while (!unloadMainMenuTask.isDone) { yield return(null); } Debug.Log("Closed main menu"); // find loading screen controller _loadingScreen = GameObject.FindGameObjectWithTag("Loading Screen Controller").GetComponent <LoadingScreenController>(); _loadingScreen.UpdateSubtitleText($"Attempting to connect to {hostname}:{port}"); // set up network client _disconnecting = false; _client = new NetworkClient(); _client.Disconnected += ClientDisconnectedEventHandler; Task connectTask = new Task(() => { _client.Connect(hostname, port); }); connectTask.Start(); while (!connectTask.IsCompleted) { yield return(null); } if (connectTask.IsFaulted || !_client.Connected) { throw (Exception)connectTask.Exception ?? new UnityException("Connection failed: Unknown"); } _loadingScreen.UpdateSubtitleText("Connection established. Logging in..."); // perform handshake/login LoginSuccessPacket loginSuccess = null; JoinGamePacket joinGame = null; // TODO: put the rest of the login packets here // player abilities, item slot change, etc. // send off packets _client.WritePackets(new Packet[] { new HandshakePacket() { Address = hostname, Port = port, NextState = NetworkClient.ProtocolState.LOGIN }, new LoginStartPacket() { Username = Username } }); _client.State = NetworkClient.ProtocolState.LOGIN; // get login response while (true) { try { var packet = _client.ReadNextPacket(); switch ((ClientboundIDs)packet.ID) { case ClientboundIDs.LOGIN_SUCCESS: loginSuccess = new LoginSuccessPacket(packet); break; case ClientboundIDs.JOIN_GAME: joinGame = new JoinGamePacket(packet); break; case ClientboundIDs.LOGIN_DISCONNECT: Disconnect($"Disconnected from server: {new DisconnectPacket(packet).JSONResponse}"); yield break; } } catch (Exception e) { Disconnect($"Failed to login: {e.Message}"); yield break; } if (loginSuccess != null && joinGame != null) { _client.State = NetworkClient.ProtocolState.PLAY; break; } } _loadingScreen.UpdateSubtitleText("Downloading world..."); // set settings from server _playerUuid = loginSuccess.UUID; _currentWorld = new World(DebugCanvas) { Dimension = joinGame.Dimension, }; // open game scene AsyncOperation loadGameTask = SceneManager.LoadSceneAsync("Game", LoadSceneMode.Additive); while (!loadGameTask.isDone) { yield return(null); } SceneManager.SetActiveScene(SceneManager.GetSceneByName("Game")); SceneManager.MoveGameObjectToScene(gameObject, SceneManager.GetSceneByName("Game")); // set up references in game scene _currentWorld.ChunkRenderer = Instantiate(ChunkRendererPrefab, Vector3.zero, Quaternion.identity).GetComponent <ChunkRenderer>(); _currentWorld.ChunkRenderer.DebugCanvas = DebugCanvas; // start network worker tasks _netReadTask = new Task(() => { NetworkReadWorker(_cancellationTokenSource.Token); }, _cancellationTokenSource.Token); _netReadTask.Start(); _netWriteTask = new Task(() => { NetworkWriteWorker(_cancellationTokenSource.Token); }, _cancellationTokenSource.Token); _netWriteTask.Start(); _initialized = true; // start tick loop StartCoroutine(ClientTickLoopCoroutine(_cancellationTokenSource.Token)); }
private static async Task LoginStart(Client client, byte[] data) { String username = Utils.ReadString(new MemoryStream(data), 16); Console.WriteLine("Client attempting to authenticate as " + username); Guid guid = new Guid(); LoginSuccessPacket loginSuccessPacket = new LoginSuccessPacket(client, guid, username); await loginSuccessPacket.SendToClient(); client.State = ClientState.Play; client.Player = new Player(client, username, guid); JoinGamePacket joinGamePacket = new JoinGamePacket(client, client.Player.EntityId, (byte)client.Player.Gamemode, 0, 0x0000000000000000); await joinGamePacket.SendToClient(); Console.WriteLine("Client authenticated as " + username); HeldItemChangePacket heldItemChangePacket = new HeldItemChangePacket(client, 0); await heldItemChangePacket.SendToClient(); client.Player.Y = 68; PlayerPositionLookPacket playerPositionLookPacket = new PlayerPositionLookPacket(client, client.Player); await playerPositionLookPacket.SendToClient(); PlayerInfoPacket playerInfoPacket = new PlayerInfoPacket(client, PlayerInfoAction.AddPlayer); playerInfoPacket.AddPlayer(client.Player); await playerInfoPacket.SendToClient(); playerInfoPacket = new PlayerInfoPacket(client, PlayerInfoAction.UpdateLatency); playerInfoPacket.AddPlayer(client.Player); await playerInfoPacket.SendToClient(); Region region = new Region(0, 0); ChunkColumn column = new ChunkColumn(0, 0); column.FillTest(); ChunkDataPacket chunkDataPacket = new ChunkDataPacket(client, column); await chunkDataPacket.SendToClient(); column = new ChunkColumn(1, 0); column.FillTest(); chunkDataPacket = new ChunkDataPacket(client, column); await chunkDataPacket.SendToClient(); column = new ChunkColumn(1, 1); column.FillTest(); chunkDataPacket = new ChunkDataPacket(client, column); await chunkDataPacket.SendToClient(); column = new ChunkColumn(0, 1); column.FillTest(); chunkDataPacket = new ChunkDataPacket(client, column); await chunkDataPacket.SendToClient(); column = new ChunkColumn(-1, 1); column.FillTest(); chunkDataPacket = new ChunkDataPacket(client, column); await chunkDataPacket.SendToClient(); column = new ChunkColumn(-1, -1); column.FillTest(); chunkDataPacket = new ChunkDataPacket(client, column); await chunkDataPacket.SendToClient(); column = new ChunkColumn(1, -1); column.FillTest(); chunkDataPacket = new ChunkDataPacket(client, column); await chunkDataPacket.SendToClient(); column = new ChunkColumn(0, -1); column.FillTest(); chunkDataPacket = new ChunkDataPacket(client, column); await chunkDataPacket.SendToClient(); column = new ChunkColumn(-1, -0); column.FillTest(); chunkDataPacket = new ChunkDataPacket(client, column); await chunkDataPacket.SendToClient(); Console.WriteLine("Sent"); }
public LoginEventArgs(LoginSuccessPacket packet) { Packet = packet; }