public static void WriteNormalizedVector(this PacketBuilder builder, Vector3 vector)
        {
            float x = vector.X;
            float y = vector.Y;
            float z = vector.Z;

            builder.Write(x < 0.0);
            if (y == 0.0)
            {
                builder.Write(true);
            }
            else
            {
                builder.Write(false);
                builder.WriteCompressed(y);
            }
            if (z == 0.0)
            {
                builder.Write(true);
            }
            else
            {
                builder.Write(false);
                builder.WriteCompressed(z);
            }
        }
        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));
            }
        }
 private static void WriteLuaString(PacketBuilder builder, LuaValue value)
 {
     if (value.StringValue != null)
     {
         if (value.StringValue.Length < ushort.MaxValue)
         {
             builder.WriteCapped((byte)LuaType.String, 4);
             builder.WriteCompressed((ushort)value.StringValue.Length);
             builder.WriteStringWithoutLength(value.StringValue);
         }
         else
         {
             builder.WriteCapped((byte)LuaType.LongString, 4);
             builder.WriteCompressed((uint)value.StringValue.Length);
             builder.AlignToByteBoundary();
             builder.WriteStringWithoutLength(value.StringValue);
         }
     }
 }
        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);
            }
        }
        private static void WriteLuaTable(PacketBuilder builder, LuaValue value, Dictionary <LuaValue, ulong> knownTables)
        {
            if (value.TableValue != null)
            {
                if (knownTables.ContainsKey(value))
                {
                    builder.WriteCapped((byte)LuaType.TableRef, 4);
                    builder.WriteCompressed(knownTables[value]);
                }
                else
                {
                    knownTables.Add(value, (ulong)knownTables.Count());

                    builder.WriteCapped((byte)LuaType.Table, 4);

                    builder.WriteCompressed((uint)value.TableValue.Count() * 2);
                    foreach (var kvPair in value.TableValue)
                    {
                        Write(builder, kvPair.Key, knownTables);
                        Write(builder, kvPair.Value, knownTables);
                    }
                }
            }
        }
 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);
     }
 }
 public static void WriteCompressed(this PacketBuilder builder, ulong integer) => builder.WriteCompressed(BitConverter.GetBytes((uint)integer), true);
 public static void WriteCompressed(this PacketBuilder builder, int integer) => builder.WriteCompressed(BitConverter.GetBytes(integer), false);
 public static void WriteCompressed(this PacketBuilder builder, byte @byte) => builder.WriteCompressed(new byte[] { @byte }, true);