Exemplo n.º 1
0
        private void UpdateENet()
        {
            if (Host == null)
            {
                return;
            }

            ENet.Event netEvent;

            if (!Running && !Disconnecting)
            {
                Disconnecting = true;
                ENetNetwork.Send(PacketType.ClientDisconnect, PacketFlags.Reliable);
                return;
            }

            if (Host.CheckEvents(out netEvent) <= 0)
            {
                if (Host.Service(15, out netEvent) <= 0)
                {
                    return;
                }
            }

            switch (netEvent.Type)
            {
            case ENet.EventType.None:
                break;

            case ENet.EventType.Connect:
                //Debug.Log("Client connected to server");
                Connected = true;
                break;

            case ENet.EventType.Disconnect:
                Debug.Log("Client disconnected from server");
                Connected = false;

                GameRoom.clients.Remove(myID);

                if (!IsQuitting)
                {
                    Destroy(gameObject);
                    CleanUp();
                    SceneManager.LoadScene("Main Menu");
                    Disconnecting = false;
                }

                break;

            case ENet.EventType.Timeout:
                Debug.Log("Client connection timeout");

                if (GameRoom.clients != null)
                {
                    GameRoom.clients.Remove(myID);
                }

                string activeScene = SceneManager.GetActiveScene().name;
                if (activeScene == "Main")
                {
                    SceneManager.LoadScene("Main Menu");
                    Destroy(gameObject);
                    CleanUp();
                }

                if (activeScene == "Account Management")
                {
                    UIAccountManagement.ConnectingENet = false;
                    UIAccountManagement.UpdateText("Failed to connect to ENet server");
                }

                break;

            case ENet.EventType.Receive:
                //Debug.Log("Packet received from server - Channel ID: " + netEvent.ChannelID + ", Data length: " + netEvent.Packet.Length);
                HandlePacket(ref netEvent);
                netEvent.Packet.Dispose();
                break;
            }
        }
Exemplo n.º 2
0
        private void HandlePacket(ref ENet.Event netEvent)
        {
            try
            {
                var readBuffer = new byte[1024];
                var readStream = new MemoryStream(readBuffer);
                var reader     = new BinaryReader(readStream);

                readStream.Position = 0;
                netEvent.Packet.CopyTo(readBuffer);
                var packetID = (PacketType)reader.ReadByte();

                if (packetID == PacketType.ServerCreateAccountDenied)
                {
                    Debug.Log("Account denied");
                    var reason = reader.ReadString();
                    Debug.Log("Reason: " + reason);
                    UIAccountManagement.UpdateText($"Account Denied: {reason}");
                }

                if (packetID == PacketType.ServerCreateAccountAccepted)
                {
                    Debug.Log("Account created");
                    UIAccountManagement.UpdateText($"Account Created");
                }

                if (packetID == PacketType.ServerLoginAccepted)
                {
                    Debug.Log("Login accepted");
                    UIAccountManagement.UpdateText($"Logging in...");
                    StartCoroutine(ASyncLoadGame());
                }

                if (packetID == PacketType.ServerLoginDenied)
                {
                    Debug.Log("Login denied");
                    var reason = reader.ReadString();
                    Debug.Log("Reason: " + reason);
                    UIAccountManagement.UpdateText($"Login Denied: {reason}");
                }

                if (packetID == PacketType.ServerPositionUpdate)
                {
                    //Debug.Log("Received Server Position Update");
                    var players = reader.ReadInt32();
                    for (int i = 0; i < players; i++)
                    {
                        var id = reader.ReadUInt32();
                        var x  = reader.ReadSingle();
                        var y  = reader.ReadSingle();
                        //Debug.Log($"ID: {id}, X: {x}, Y: {y}");
                        if (clients.ContainsKey(id))
                        {
                            Debug.Log("Updated position of oClient");

                            if (clients[id] == null)
                            {
                                clients.Remove(id);
                            }
                            else
                            {
                                clients[id].transform.position = new Vector2(x, y);
                            }
                        }
                        else
                        {
                            Debug.Log("Added new oClient");
                            GameObject oClient = Instantiate(oClientPrefab, new Vector3(x, 0, y), Quaternion.identity);
                            clients.Add(id, oClient);
                        }
                    }
                }
            }

            catch (ArgumentOutOfRangeException)
            {
                Console.WriteLine($"Received packet but buffer was too long. {netEvent.Packet.Length}");
            }
        }