public static void ApplyCubeState(Rigidbody rigidBody, NetworkInfo networkInfo, ref CubeState cubeState, ref Vector3 origin, bool smoothing = false)
    {
        if (networkInfo.IsHeldByPlayer())
        {
            networkInfo.DetachCubeFromPlayer();
        }

        if (cubeState.active)
        {
            if (rigidBody.IsSleeping())
            {
                rigidBody.WakeUp();
            }
        }

        if (!cubeState.active)
        {
            if (!rigidBody.IsSleeping())
            {
                rigidBody.Sleep();
            }
        }

        networkInfo.SetAuthorityIndex(cubeState.authorityIndex);
        networkInfo.SetAuthoritySequence(cubeState.authoritySequence);
        networkInfo.SetOwnershipSequence(cubeState.ownershipSequence);

        Vector3 position = new Vector3(cubeState.position_x, cubeState.position_y, cubeState.position_z) * 1.0f / Constants.UnitsPerMeter + origin;

        Quaternion rotation = SmallestThreeToQuaternion(cubeState.rotation_largest, cubeState.rotation_a, cubeState.rotation_b, cubeState.rotation_c);

        if (smoothing)
        {
            networkInfo.MoveWithSmoothing(position, rotation);
        }
        else
        {
            rigidBody.position = position;
            rigidBody.rotation = rotation;
        }

        rigidBody.velocity = new Vector3(cubeState.linear_velocity_x, cubeState.linear_velocity_y, cubeState.linear_velocity_z) * 1.0f / Constants.UnitsPerMeter;

        rigidBody.angularVelocity = new Vector3(cubeState.angular_velocity_x, cubeState.angular_velocity_y, cubeState.angular_velocity_z) * 1.0f / Constants.UnitsPerMeter;
    }