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)); }
// 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); } }
private static void WriteLuaBool(PacketBuilder builder, LuaValue value) { if (value.BoolValue.HasValue) { builder.WriteCapped((byte)value.LuaType, 4); builder.Write(value.BoolValue.Value); } }
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); } }
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 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 Write(this PacketBuilder builder, Vector3 vector) { builder.Write(vector.X); builder.Write(vector.Y); builder.Write(vector.Z); }
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))); }
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); }
public static void WriteCompressed(this PacketBuilder builder, float value) { value = Math.Clamp(value, -1, 1); builder.Write((ushort)((value + 1.0f) * 32767.5f)); }