public override void ThreadFunction() { _firstInfoPacket = true; Logger.Write("D2GS handler started!"); while (Connection.Socket.Connected) { if (Connection.Packets.IsEmpty()) { //_connection.PacketsReady.WaitOne(); } else { List <byte> packet; lock (Connection.Packets) { packet = Connection.Packets.Dequeue(); } if (!packet.Any()) { continue; } byte type = packet[0]; DispatchPacket(type)(type, packet); } } Logger.Write("D2GS Handler Ending..."); }
public override void ThreadFunction() { m_owner.GameRequestId = 0x02; m_owner.InGame = false; Console.Write("{0}: [BNCS] Connecting to {1}:{2} .........", m_owner.Account, m_owner.BattleNetServer, s_bncsPort); // Establish connection m_socket.Connect(m_owner.BattleNetServer, s_bncsPort); m_stream = m_socket.GetStream(); if (m_stream.CanWrite) { Console.WriteLine(" Connected"); } else { Console.WriteLine(" Failed To connect"); return; } m_stream.WriteByte(0x01); m_stream.Write(AuthInfoPacket, 0, AuthInfoPacket.Length); List <byte> bncsBuffer = new List <byte>(); List <byte> data = new List <byte>(); while (true) { if (!GetPacket(ref bncsBuffer, ref data)) { break; } if (ClientlessBot.debugging) { Console.WriteLine("{0}: [BNCS] Received Packet From Server", m_owner.Account); } if (ClientlessBot.debugging) { Console.WriteLine("\tPacket Data: "); Console.Write("\t\t"); for (int i = 0; i < data.Count; i++) { Console.Write("{0:X2} ", (byte)data[i]); } Console.WriteLine(""); } byte type = data.ToArray()[1]; if (ClientlessBot.debugging) { Console.WriteLine("\tPacket Type: 0x{0:X}", type); } DispatchPacket(type)(type, data); } }
public override void ThreadFunction() { Logger.Write("MCP handler started!"); while (m_connection.Socket.Connected) { m_connection.PacketsReady.WaitOne(); List <byte> packet; lock (m_connection.Packets) { packet = m_connection.Packets.Dequeue(); } byte type = packet[2]; DispatchPacket(type)(type, packet); } }
public override void ThreadFunction() { while (Connection.Socket.Connected) { if (Connection.Packets.IsEmpty()) { Connection.PacketsReady.WaitOne(); } else { List <byte> packet; lock (Connection.Packets) { packet = Connection.Packets.Dequeue(); } byte type = packet[1]; DispatchPacket(type)(type, packet); } } }
public override void ThreadFunction() { Console.Write("{0}: [MCP] Connecting to realm server {1}:{2} ...........", m_owner.Account, m_owner.McpIp, m_owner.McpPort); m_socket.Connect(m_owner.McpIp, (int)m_owner.McpPort); m_stream = m_socket.GetStream(); if (m_stream.CanWrite) { Console.WriteLine(" Connected"); } else { Console.WriteLine(" Failed To connect"); return; } m_stream.WriteByte(0x01); byte[] packet = BuildPacket((byte)0x01, m_owner.McpData); PrintPacket(packet); m_stream.Write(packet, 0, packet.Length); List <byte> data = new List <byte>(); List <byte> mcpBuffer = new List <byte>(); while (true) { if (!getMcpPacket(ref m_stream, ref mcpBuffer, ref data)) { break; } byte identifier = data.ToArray()[2]; DispatchPacket(identifier)(identifier, data); } Console.WriteLine("{0}: [MCP] Disconnected from Realm Server", m_owner.Account); }
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; } } } }