private void ReadChunkHeader(Bitstream stream) { header = new ChunkedHeader(); header.IsFile = stream.ReadBool(); if (header.IsFile) { var filenameLength = stream.ReadUInt32(); var filename = new byte[filenameLength + 1]; // semantically wrong. should be // 0x104 stream.Read(filename, 0, (int) filenameLength); // and then read to end of string filename[filenameLength] = 0; // whatever header.Filename = Encoding.UTF8.GetString(filename); throw new NotImplementedException(); } header.IsCompressed = stream.ReadBool(); if (header.IsCompressed) { header.DecompressedLength = stream.ReadBits(26); } header.ByteLength = stream.ReadBits(26); header.ChunkCount = (header.ByteLength + DotaGameConnection.BYTES_PER_CHUNK - 1)/ DotaGameConnection.BYTES_PER_CHUNK; Receiving = true; dataIn = new byte[header.ByteLength]; dataReceived = new bool[header.ChunkCount]; countReceived = 0; }
private string ReadKeyIfIncluded(Bitstream stream, List<string> keyHistory) { var has_key = stream.ReadBool(); if (!has_key) { return null; } var is_substring = stream.ReadBool(); string key; if (!is_substring) { key = stream.ReadString(); } else { var fromIndex = (int) stream.ReadBits(5); var fromLength = (int) stream.ReadBits(5); key = keyHistory[fromIndex].Substring(0, fromLength); key += stream.ReadString(); } if (keyHistory.Count == KEY_HISTORY_SIZE) { keyHistory.RemoveAt(0); } keyHistory.Add(key); return key; }
public Message? Receive(Bitstream stream) { var hasData = stream.ReadBool(); if (!hasData) { return null; } if (stream.ReadBool()) { return ReadChunk(stream); } return ReadSingle(stream); }
public void Update(Bitstream stream, uint baseline, bool updateBaseline, uint updated, bool isDelta) { var id = uint.MaxValue; uint found = 0; while (found < updated) { var flags = ReadHeader(ref id, stream); if (flags.HasFlag(UpdateFlag.EnterPvs)) { ReadEnterPvs(id, baseline, updateBaseline, stream); } else if (flags.HasFlag(UpdateFlag.LeavePvs)) { if (flags.HasFlag(UpdateFlag.Delete)) { Delete(id); } } else { ReadUpdate(id, stream); } ++found; } if (isDelta) { while (stream.ReadBool()) { id = stream.ReadBits(11); Delete(id); } } }
public ulong UnpackInt64(PropertyInfo info, Bitstream stream) { if (info.Flags.HasFlag(PropertyInfo.MultiFlag.EncodedAgainstTickcount)) { return stream.ReadVarUInt(); } var negate = false; var secondBits = (byte) (info.NumBits - 32); if (!info.Flags.HasFlag(PropertyInfo.MultiFlag.Unsigned)) { --secondBits; if (stream.ReadBool()) { negate = true; } } ulong a = stream.ReadBits(32); ulong b = stream.ReadBits(secondBits); var value = (b << 32) | a; if (negate) { value = unchecked((ulong) ((long) value*-1)); } return value; }
public Vector UnpackVector(PropertyInfo info, Bitstream stream) { var x = UnpackFloat(info, stream); var y = UnpackFloat(info, stream); float z; if (info.Flags.HasFlag(PropertyInfo.MultiFlag.Normal)) { var sign = stream.ReadBool(); var f = x*x + y*y; if (1 >= f) { z = 0; } else { z = (float) Math.Sqrt(1 - f); } if (sign) { z *= -1; } } else { z = UnpackFloat(info, stream); } return new Vector(x, y, z); }
private float UnpackFloatNormal(Bitstream stream) { var sign = stream.ReadBool(); var value = stream.ReadBits(NORMAL_FRACTIONAL_BITS); var f = (float) (value*NORMAL_RESOLUTION); if (sign) { f *= -1; } return f; }
private float UnpackFloatCoord(Bitstream stream) { var hasInteger = stream.ReadBool(); var hasFraction = stream.ReadBool(); if (hasInteger || hasFraction) { var sign = stream.ReadBool(); uint integer = 0; if (hasInteger) { integer = stream.ReadBits(COORD_INTEGER_BITS) + 1; } uint fraction = 0; if (hasFraction) { fraction = stream.ReadBits(COORD_FRACTIONAL_BITS); } var f = (float) (integer + fraction*COORD_RESOLUTION); if (sign) { f *= -1; } return f; } return 0; }
private Message ReadSingle(Bitstream stream) { var isCompressed = stream.ReadBool(); if (isCompressed) { var uncompressed_length = stream.ReadBits(26); var length = stream.ReadBits(18); var data = new byte[length]; stream.Read(data, 0, (int) length); return new Message { IsCompressed = false, Data = new SnappyDecompressor().Decompress(data, 0, data.Length) }; } else { var length = stream.ReadBits(18); var data = new byte[length]; stream.Read(data, 0, (int) length); return new Message { IsCompressed = false, Data = data }; } }
private UpdateFlag ReadHeader(ref uint id, Bitstream stream) { var value = stream.ReadBits(6); if ((value & 0x30) > 0) { var a = (value >> 4) & 3; var b = (uint) ((a == 3) ? 16 : 0); value = (stream.ReadBits((byte) (4*a + b)) << 4) | (value & 0xF); } id = unchecked(id + value + 1); var flags = UpdateFlag.None; if (!stream.ReadBool()) { if (stream.ReadBool()) { flags |= UpdateFlag.EnterPvs; } } else { flags |= UpdateFlag.LeavePvs; if (stream.ReadBool()) { flags |= UpdateFlag.Delete; } } return flags; }
private uint ReadFieldNumber(uint lastField, Bitstream stream) { if (stream.ReadBool()) { return unchecked(lastField + 1); } var value = stream.ReadVarUInt(); if (value == 0x3FFF) { return uint.MaxValue; } return unchecked(lastField + value + 1); }
private byte[] ReadValueIfIncluded(Bitstream stream, bool userDataFixedSize, uint userDataSizeBits) { var has_value = stream.ReadBool(); if (!has_value) { return null; } uint length; uint bitLength; if (userDataFixedSize) { length = (userDataSizeBits + 7)/8; bitLength = userDataSizeBits; } else { length = stream.ReadBits(14); bitLength = 8*length; } return stream.ReadManyBits(bitLength); }