private void ParseDemoPacket() { CommandInfo.Parse(BitStream); BitStream.ReadInt(32); // SeqNrIn BitStream.ReadInt(32); // SeqNrOut BitStream.BeginChunk(BitStream.ReadSignedInt(32) * 8); DemoPacketParser.ParsePacket(BitStream, this); BitStream.EndChunk(); }
/// <summary> /// Parses a DEM_Packet. /// </summary> private void ParseDemoPacket() { //Read a command-info. Contains no really useful information afaik. CommandInfo.Parse(BitStream); BitStream.ReadInt(32); // SeqNrIn BitStream.ReadInt(32); // SeqNrOut BitStream.BeginChunk(BitStream.ReadSignedInt(32) * 8); DemoPacketParser.ParsePacket(BitStream, this); BitStream.EndChunk(); }
public bool ParseNextTick() { DemoMessageType messageType = (DemoMessageType)reader.ReadByte(); this.CurrentTick = reader.ReadInt32(); reader.ReadByte(); // player slot switch (messageType) { case DemoMessageType.Synctick: break; case DemoMessageType.Stop: return(false); case DemoMessageType.ConsoleCommand: using (var volvo = reader.ReadVolvoPacket()) break; case DemoMessageType.DataTables: using (var volvo = reader.ReadVolvoPacket()) DataTablesParser.ParsePacket(volvo); break; case DemoMessageType.StringTables: using (var volvo = reader.ReadVolvoPacket()) StringTablesParser.ParsePacket(volvo, this); break; case DemoMessageType.UserCommand: reader.ReadInt32(); using (var volvo = reader.ReadVolvoPacket()) break; case DemoMessageType.Signon: case DemoMessageType.Packet: CommandInfo.Parse(reader); reader.ReadInt32(); // SeqNrIn reader.ReadInt32(); // SeqNrOut using (var volvo = reader.ReadVolvoPacket()) DemoPacketsParser.ParsePacket(volvo, this); break; default: throw new Exception("Can't handle MessageType " + messageType); } this.EventsManager.RaiseTickDone(); return(true); }
private static void ProcessPacket(byte[] bytes) { var length = bytes.Length; uint seq, ack; byte flags; using (var stream = BitStreamUtil.Create(bytes)) { seq = stream.ReadInt(32); ack = stream.ReadInt(32); flags = stream.ReadByte(); ushort checksum = (ushort)stream.ReadInt(16); stream.BeginChunk((length - 11) * 8); ushort computed = CrcUtils.Compute16(stream); stream.EndChunk(); if (checksum != computed) { //Console.WriteLine( // "failed checksum:" // + "recv seq {0} ack {1} flags {2:x} checksum {3:x} computed {4:x}", // seq, ack, flags, checksum, computed); return; } } var remaining = new byte[length - 11]; Array.Copy(bytes, 11, remaining, 0, length - 11); using (var stream = BitStreamUtil.Create(remaining)) { byte reliableState = stream.ReadByte(); if ((flags & 0x10) == 0x10) { //Console.WriteLine( // "choke {0}: recv seq {1} ack {2} flags {3:x}", // stream.ReadByte(), seq, ack, flags); return; } if (seq < sequenceIn) { // We no longer care. //Console.WriteLine("dropped: recv seq {0} ack {1}", seq, ack); return; } if ((flags & (uint)PacketFlags.IsReliable) != 0) { return; } //filter2++; //Console.WriteLine($"filter2: {filter2}"); try { stream.BeginChunk((remaining.Length - 1) * 8); DemoPacketParser.ParsePacket(stream, demoParser); stream.EndChunk(); demoParser.ForceTick(true); } catch { } lastAckRecv = ack; sequenceIn = seq; } }