Ejemplo n.º 1
0
    /// <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;
    }