private static void HandleServerComm() { try { NetworkStream streamServer = tcpServer.GetStream(); bool ConnectToGameServer = false; byte[] message = new byte[4096]; int bytesRead, connection = 0; uint[] XTEAKey = new uint[4]; while (true) { bytesRead = 0; try { //blocks until a server sends a message bytesRead = streamServer.Read(message, 0, 4096); } catch { break; } if (bytesRead > 0) { byte[] packet = new byte[bytesRead]; Array.Copy(message, packet, bytesRead); if (connection != 8) { connection = Memory.ReadByte(Addresses.Client.Connection); } if (Recording && connection > 5) { if (RecordedPackets.Count == 3) { stopwatchRecordingStarted.Reset(); stopwatchRecordingStarted.Start(); } TimeRecorded = stopwatchRecordingStarted.ElapsedMilliseconds; Packet p = new Packet(); p.AddUInt32((uint)TimeRecorded); p.AddUInt32((uint)bytesRead); p.AddBytes(packet); RecordedPackets.Add(p); } if (connection == 3) { ConnectToGameServer = true; Memory.WriteByte(Addresses.Charlist.NumberOfCharacters, 0); } Utils.Network.SendPacket(tcpClient, packet); } else if (bytesRead == 0) { break; } } tcpServer.Close(); if (tcpClient.Connected) { tcpClient.Close(); } if (ConnectToGameServer) { for (int i = 0; i < 100; i++) { if (Memory.ReadInt(Addresses.Client.DialogOpen) > 0 && Memory.ReadByte(Addresses.Charlist.NumberOfCharacters) > 0) { characterList = Characterlist.Players; Client.Charlist.WriteIP("127.0.0.1"); if (!listenThread.IsAlive) { listenerLocal = new TcpListener(IPAddress.Parse("127.0.0.1"), ServerPort); listenThread = new Thread(new ThreadStart(ListenForClients)); listenThread.Start(); } break; } else if (Memory.ReadInt(Addresses.Client.DialogOpen) > 0 && Client.Misc.DialogTitle == "Enter Game") { break; } Thread.Sleep(100); } ConnectToGameServer = false; } if (Client.Player.Connected && Recording) { if (!listenThread.IsAlive) { listenerLocal = new TcpListener(IPAddress.Parse("127.0.0.1"), ServerPort); listenThread = new Thread(new ThreadStart(ListenForClients)); listenThread.Start(); } tcpClient.Close(); } } catch { } }
/// <summary> /// Decompresses a *.kcam file. Version 1.42 and higher. /// </summary> /// <param name="FilePath"></param> /// <returns></returns> internal static List<Packet> DecompressCamToPackets(string filePath) { try { MemoryStream uncompressedStream = new MemoryStream(); FileInfo fi = new FileInfo(filePath); using (FileStream inFile = fi.OpenRead()) { using (DeflateStream Decompress = new DeflateStream(inFile, CompressionMode.Decompress)) { byte[] buffer = new byte[4096]; int numRead = 0; while ((numRead = Decompress.Read(buffer, 0, buffer.Length)) != 0) { uncompressedStream.Write(buffer, 0, numRead); } } } uncompressedStream.Position = 0; List<Packet> DecompressedList = new List<Packet>(); BinaryReader binReader = new BinaryReader(uncompressedStream); byte[] tempBuffer = binReader.ReadBytes(8); // 2 bytes TibiaVersion, 2 bytes CamVersion, 4 bytes RunningLength(ms) DecompressedList.Add(new Packet(new byte[] { tempBuffer[0], tempBuffer[1] })); DecompressedList.Add(new Packet(new byte[] { tempBuffer[2], tempBuffer[3] })); DecompressedList.Add(new Packet(new byte[] { tempBuffer[4], tempBuffer[5], tempBuffer[6], tempBuffer[7] })); while (binReader.BaseStream.Length > binReader.BaseStream.Position) { Packet p = new Packet(); p.AddUInt32(binReader.ReadUInt32()); // delay uint len = binReader.ReadUInt32(); p.AddUInt32(len); p.AddBytes(binReader.ReadBytes((int)len)); // package DecompressedList.Add(p); } binReader.Close(); return DecompressedList; } catch (Exception ex) { } return new List<Packet>(); }