BattleNet.GameServer.ThreadFunction C# (CSharp) Method

ThreadFunction() public method

public ThreadFunction ( ) : void
return void
        public override void ThreadFunction()
        {
            m_socket = new TcpClient();
            //Initialize the game's data
            m_owner.InitializeGameData();

            Console.Write("{0}: [D2GS] Connecting to Game Server {1}:{2} .......",m_owner.Account,m_owner.GsIp,s_gsPort);
            try
            {
                m_socket.Connect(m_owner.GsIp, s_gsPort);
                m_stream = m_socket.GetStream();
                Console.WriteLine(" Connected");
            }
            catch
            {
                Console.WriteLine(" Failed To connect");
                return;
            }

            m_owner.ConnectedToGs = true;
            List<byte> buffer = new List<byte>();
            byte[] byteBuffer = new byte[4096];
            Int32 bytesRead = 0;
            while (true)
            {
                try
                {
                    /*
                    while (m_stream.DataAvailable)
                    {
                        buffer.Add((byte)m_stream.ReadByte());
                        if(!m_stream.DataAvailable)
                            Console.WriteLine("{0}: [D2GS] Finished Reading to Buffer...", m_owner.Account);
                    }
                    */
                    if (m_stream.DataAvailable)
                    {
                        bytesRead = m_stream.Read(byteBuffer, 0, byteBuffer.Length);
                        buffer.AddRange(new List<byte>(byteBuffer).GetRange(0, bytesRead));
                    }
                    else
                    {
                        if (!m_socket.Connected)
                        {
                            if (m_owner.ConnectedToGs)
                            {
                                m_owner.ConnectedToGs = false;
                                if (m_pingThread.IsAlive)
                                    m_pingThread.Join();
                                // Join threads
                            }
                            m_owner.Status = ClientlessBot.ClientStatus.STATUS_NOT_IN_GAME;
                            break;
                        }
                        Thread.Sleep(100);
                    }
                    while (m_stream.DataAvailable)
                    {
                        buffer.Add((byte)m_stream.ReadByte());
                    }
                }
                catch
                {
                    //if (ClientlessBot.debugging)
                    Console.WriteLine("{0}: [D2GS] Disconnected from game server", m_owner.Account);
                    if (m_owner.ConnectedToGs)
                    {
                        m_owner.ConnectedToGs = false;
                        if (m_pingThread.IsAlive)
                            m_pingThread.Join();
                        // Join threads
                    }
                    m_owner.Status = ClientlessBot.ClientStatus.STATUS_NOT_IN_GAME;
                    break;
                }

                while (true)
                {
                    try
                    {
                        UInt16 receivedPacket = 0;
                        if (buffer.Count >= 2)
                            receivedPacket = BitConverter.ToUInt16(buffer.ToArray(), 0);
                        if (buffer.Count >= 2 && receivedPacket == (UInt16)0x01af)
                        {
                            if (ClientlessBot.debugging)
                                Console.WriteLine("{0}: [D2GS] Logging on to game server", m_owner.Account);

                            byte[] temp = {0x50, 0xcc, 0x5d, 0xed,
                                       0xb6, 0x19, 0xa5, 0x91};

                            Int32 pad = 16 - m_owner.Character.Length;

                            byte[] padding = new byte[pad];
                            byte[] characterClass = { m_owner.ClassByte };
                            byte[] joinpacket = BuildPacket(0x68, m_owner.GsHash, m_owner.GsToken, characterClass, BitConverter.GetBytes((UInt32)0xd), temp, zero, System.Text.Encoding.ASCII.GetBytes(m_owner.Character), padding);
                            Write(joinpacket);
                            //Console.WriteLine("{0}: [D2GS] Join packet sent to server", m_owner.Account);
                            buffer.RemoveRange(0, 2);
                        }

                        if (buffer.Count < 2 || (buffer[0] >= 0xF0 && buffer.Count < 3))
                        {
                            break;
                        }

                        Int32 headerSize;
                        Int32 length = Huffman.GetPacketSize(buffer, out headerSize);
                        if (length > buffer.Count)
                            break;

                        byte[] compressedPacket = buffer.GetRange(headerSize, length).ToArray();
                        buffer.RemoveRange(0, length + headerSize);

                        byte[] decompressedPacket;
                        Huffman.Decompress(compressedPacket, out decompressedPacket);
                        List<byte> packet = new List<byte>(decompressedPacket);
                        while (packet.Count != 0)
                        {
                            Int32 packetSize;
                            if (!GetPacketSize(packet, out packetSize))
                            {
                                Console.WriteLine("{0}: [D2GS] Failed to determine packet length", m_owner.Account);
                                break;
                            }
                            List<byte> actualPacket = new List<byte>(packet.GetRange(0, packetSize));
                            packet.RemoveRange(0, packetSize);

                            byte identifier = actualPacket[0];
                            DispatchPacket(identifier)(identifier, actualPacket);
                            m_owner.ReceivedGameServerPacket(actualPacket);
                        }
                    }
                    catch
                    {
                        m_owner.InGame = false;
                        m_owner.ConnectedToGs = false;

                        Console.WriteLine("{0}: [D2GS] Leaving the game.", m_owner.Account);
                        Write(new byte[] { 0x69 });

                        Thread.Sleep(500);

                        if (m_pingThread.IsAlive)
                            m_pingThread.Join();
                        m_owner.Status = ClientlessBot.ClientStatus.STATUS_NOT_IN_GAME;
                        Kill();
                        return;
                    }
                }
            }
        }