コード例 #1
0
    /// <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));
    }
コード例 #2
0
        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");
        }
コード例 #3
0
 public LoginEventArgs(LoginSuccessPacket packet)
 {
     Packet = packet;
 }