public async void HandlePackets()
        {
            while (true)
            {
                while (this.packetQueue.TryDequeue(out PacketQueueEntry queueEntry))
                {
                    switch (queueEntry.PacketId)
                    {
                    case PacketId.PACKET_ID_PLAYER_JOIN:
                        HandlePlayerJoin(queueEntry.Client);
                        break;

                    case PacketId.PACKET_ID_PLAYER_JOINDATA:
                        PlayerJoinDataPacket joinDataPacket = new PlayerJoinDataPacket();
                        joinDataPacket.Read(queueEntry.Data);
                        HandlePlayerJoinData(queueEntry.Client, joinDataPacket);
                        break;

                    case PacketId.PACKET_ID_PLAYER_QUIT:
                    case PacketId.PACKET_ID_PLAYER_TIMEOUT:
                        HandlePlayerQuit(queueEntry.Client);
                        break;
                    }
                }
                await Task.Delay(this.sleepInterval);
            }
        }
        private void HandleClientJoinData(Client client, PlayerJoinDataPacket joinDataPacket)
        {
            string osName =
                RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "Windows" :
                RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? "Mac OS" :
                RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ? "Linux" :
                RuntimeInformation.IsOSPlatform(OSPlatform.FreeBSD) ? "Free BSD" :
                "Unknown";

            client.SendPacket(new JoinCompletePacket($"Slipe Server 0.1.0 [{osName}]\0", "1.5.7-9.0.0"));

            client.Player.Name = joinDataPacket.Nickname;
            client.SetVersion(joinDataPacket.BitStreamVersion);
            client.FetchSerial();
        }
        protected override void HandlePacket(PacketQueueEntry queueEntry)
        {
            switch (queueEntry.PacketId)
            {
            case PacketId.PACKET_ID_PLAYER_JOIN:
                HandleClientJoin(queueEntry.Client);
                break;

            case PacketId.PACKET_ID_PLAYER_JOINDATA:
                PlayerJoinDataPacket joinDataPacket = new PlayerJoinDataPacket();
                joinDataPacket.Read(queueEntry.Data);
                HandleClientJoinData(queueEntry.Client, joinDataPacket);
                break;

            case PacketId.PACKET_ID_PLAYER_QUIT:
            case PacketId.PACKET_ID_PLAYER_TIMEOUT:
                HandleClientQuit(queueEntry.Client);
                break;
            }
        }