/// <summary> /// Given a SetPositionRotation message, extracts the new position and rotation. /// </summary> /// <returns>The position rotation message.</returns> /// <param name="message">Message.</param> /// <param name="avatarId">The avatar being moved</param> /// <param name="x">The x coordinate.</param> /// <param name="z">The z coordinate.</param> /// <param name="r">The rotation component.</param> public static void UnmarshallPositionRotationMessage( byte[] message, out byte avatarId, out float x, out float z, out float r, out byte m) { Debug.Assert(message.Length >= 14); Debug.Assert(GetMessageType(message) == setAvatarPositionRotation); Debug.Assert(message[1] == flora || message[1] == tommy); avatarId = message[1]; m = message[2]; Debug.Assert(AnimationInfo.IsLegalMovementState(m)); //-------------------------------- x = (float)(BitConverter.ToInt16(message, 3)) / 100f; z = (float)(BitConverter.ToInt16(message, 5)) / 100f; r = (float)(BitConverter.ToInt16(message, 7)) / 100f; //-------------------------------- }
/// <summary> /// Given a SetPositionRotation message, extracts the new position and rotation. /// </summary> /// <returns>The position rotation message.</returns> /// <param name="message">Message.</param> /// <param name="avatarId">The avatar being moved</param> /// <param name="x">The x coordinate.</param> /// <param name="z">The z coordinate.</param> /// <param name="r">The rotation component.</param> public static void UnmarshallPositionRotationMessage( byte[] message, out byte avatarId, out float x, out float z, out float r, out byte m) { Debug.Assert(message.Length >= 14); Debug.Assert(GetMessageType(message) == setAvatarPositionRotation); Debug.Assert(message[1] == flora || message[1] == tommy); avatarId = message[1]; m = message[2]; Debug.Assert(AnimationInfo.IsLegalMovementState(m)); // Format is: // - byte 0: message type // - byte 1: avatar id // - byte 2: movement state // - bytes 3-4: x value // - bytes 5-6: z value // - bytes 7-8: rotation (degrees around y-axis) // ... // X position byte [] x_bytes = new byte[] { message[3], message[4] }; short x_val = BitConverter.ToInt16(x_bytes, 0); x = (float)x_val / 100f; // Z position byte [] z_bytes = new byte[] { message[5], message[6] }; short z_val = BitConverter.ToInt16(z_bytes, 0); z = (float)z_val / 100f; // R position byte [] r_bytes = new byte[] { message[7], message[8] }; short r_val = BitConverter.ToInt16(r_bytes, 0); r = (float)r_val / 100f; }