コード例 #1
0
        public static void WriteVelocityVector(this PacketBuilder builder, Vector3 vector)
        {
            builder.Write(vector != Vector3.Zero);
            if (vector.Length() == 0)
            {
                return;
            }

            builder.Write(vector.Length());
            builder.WriteNormalizedVector(Vector3.Normalize(vector));
        }
コード例 #2
0
        // Reference source:
        // https://github.com/facebookarchive/RakNet/blob/1a169895a900c9fc4841c556e16514182b75faf8/Source/BitStream.cpp#L489
        public static void WriteCompressed(this PacketBuilder builder, byte[] inByteArray, bool unsignedData)
        {
            uint size        = (uint)inByteArray.Length * 8;
            uint currentByte = (size >> 3) - 1; // PCs

            byte byteMatch;

            if (unsignedData)
            {
                byteMatch = 0;
            }
            else
            {
                byteMatch = 0xFF;
            }

            // Write upper bytes with a single 1
            // From high byte to low byte, if high byte is a byteMatch then write a 1 bit. Otherwise write a 0 bit and then write the remaining bytes
            while (currentByte > 0)
            {
                if (inByteArray[currentByte] == byteMatch)   // If high byte is byteMatch (0 of 0xff) then it would have the same value shifted
                {
                    builder.Write(true);
                }
                else
                {
                    // Write the remainder of the data after writing 0
                    builder.Write(false);

                    builder.WriteBytesCapped(inByteArray, (int)((currentByte + 1) << 3));
                    //  currentByte--;

                    return;
                }

                currentByte--;
            }

            // If the upper half of the last byte is a 0 (positive) or 16 (negative) then write a 1 and the remaining 4 bits.  Otherwise write a 0 and the 8 bites.
            if ((unsignedData && (inByteArray[currentByte] & 0xF0) == 0x00) ||
                (unsignedData == false && (inByteArray[currentByte] & 0xF0) == 0xF0))
            {
                builder.Write(true);
                builder.WriteCapped(inByteArray[currentByte], 4);
            }

            else
            {
                builder.Write(false);
                builder.WriteCapped(inByteArray[currentByte], 8);
            }
        }
コード例 #3
0
 private static void WriteLuaBool(PacketBuilder builder, LuaValue value)
 {
     if (value.BoolValue.HasValue)
     {
         builder.WriteCapped((byte)value.LuaType, 4);
         builder.Write(value.BoolValue.Value);
     }
 }
コード例 #4
0
        public static void Write(this PacketBuilder builder, IEnumerable <LuaValue> luaValues, Dictionary <LuaValue, ulong>?knownTables = null)
        {
            knownTables ??= new Dictionary <LuaValue, ulong>();
            knownTables[new LuaValue()] = 0;

            builder.WriteCompressed((uint)luaValues.Count());
            foreach (var value in luaValues)
            {
                builder.Write(value, knownTables);
            }
        }
コード例 #5
0
        public static void WriteCompressedVector3(this PacketBuilder builder, Vector3 vector)
        {
            var magnitude = MathF.Sqrt(vector.X * vector.X + vector.Y * vector.Y + vector.Z * vector.Z);

            builder.Write((float)magnitude);
            if (magnitude > 0.00001f)
            {
                builder.WriteCompressed((float)(vector.X / magnitude));
                builder.WriteCompressed((float)(vector.Y / magnitude));
                builder.WriteCompressed((float)(vector.Z / magnitude));
            }
        }
コード例 #6
0
 private static void WriteLuaNumber(PacketBuilder builder, LuaValue value)
 {
     builder.WriteCapped((byte)value.LuaType, 4);
     if (value.IntegerValue.HasValue)
     {
         builder.Write(false);
         builder.WriteCompressed(value.IntegerValue.Value);
     }
     else if (value.FloatValue.HasValue)
     {
         builder.Write(true);
         builder.Write(false);
         builder.Write(value.FloatValue.Value);
     }
     else if (value.DoubleValue.HasValue)
     {
         builder.Write(true);
         builder.Write(true);
         builder.Write(value.DoubleValue.Value);
     }
 }
コード例 #7
0
 public static void WriteCompressed(this PacketBuilder builder, float value)
 {
     value = Math.Clamp(value, -1, 1);
     builder.Write((ushort)((value + 1.0f) * 32767.5f));
 }
コード例 #8
0
 public static void Write(this PacketBuilder builder, Vector3 vector)
 {
     builder.Write(vector.X);
     builder.Write(vector.Y);
     builder.Write(vector.Z);
 }
コード例 #9
0
 public static void WriteVectorAsUshorts(this PacketBuilder builder, Vector3 vector)
 {
     builder.Write((ushort)(vector.X * (65536 / 360f)));
     builder.Write((ushort)(vector.Y * (65536 / 360f)));
     builder.Write((ushort)(vector.Z * (65536 / 360f)));
 }
コード例 #10
0
 public static void WriteVector3WithZAsFloat(this PacketBuilder builder, Vector3 vector, int integerBits = 14, int fractionalBits = 10)
 {
     builder.WriteFloat(vector.X, integerBits, fractionalBits);
     builder.WriteFloat(vector.Y, integerBits, fractionalBits);
     builder.Write(vector.Z);
 }