public override void Deserialize(NetworkReader reader)
        {
            int  sent           = (int)reader.ReadPackedUInt32();
            bool sentPosition   = NetworkUtil.GetBit(sent, 0);
            bool sentRotation   = NetworkUtil.GetBit(sent, 1);
            bool sentScale      = NetworkUtil.GetBit(sent, 2);
            bool sentPhysics    = NetworkUtil.GetBit(sent, 3);
            bool useGravity     = NetworkUtil.GetBit(sent, 4);
            bool freezeRotation = NetworkUtil.GetBit(sent, 5);
            bool isKinematic    = NetworkUtil.GetBit(sent, 6);

            if (sentPosition)
            {
                Vector3 newDesiredPosition = reader.ReadVector3();

                if (this.lastVelocityUpdateTime < 0.0f)
                {
                    this.estimatedVelocity = Vector3.zero;
                }
                else
                {
                    float timeSinceLastUpdate = Time.realtimeSinceStartup - this.lastVelocityUpdateTime;

                    if (timeSinceLastUpdate > 0.01)
                    {
                        this.estimatedVelocity = (newDesiredPosition - this.desiredPosition) / timeSinceLastUpdate;
                    }
                }

                this.desiredPosition        = newDesiredPosition;
                this.lastVelocityUpdateTime = Time.realtimeSinceStartup;
            }

            if (sentRotation)
            {
                this.desiredRotation = reader.ReadQuaternion();
            }

            if (sentScale)
            {
                this.desiredScale = reader.ReadVector3();
            }

            if (sentPhysics)
            {
                this.rigidBody.velocity       = reader.ReadVector3();
                this.rigidBody.useGravity     = useGravity;
                this.rigidBody.freezeRotation = freezeRotation;
                this.rigidBody.isKinematic    = isKinematic;
            }
        }
        public override void Deserialize(NetworkReader reader)
        {
            uint messageVersion = reader.ReadPackedUInt32();

            if (this.version > messageVersion)
            {
                return;
            }

            this.version = messageVersion;

            int  sent           = (int)reader.ReadPackedUInt32();
            bool sentPosition   = NetworkUtil.GetBit(sent, 0);
            bool sentRotation   = NetworkUtil.GetBit(sent, 1);
            bool sentScale      = NetworkUtil.GetBit(sent, 2);
            bool sentPhysics    = NetworkUtil.GetBit(sent, 3);
            bool useGravity     = NetworkUtil.GetBit(sent, 4);
            bool freezeRotation = NetworkUtil.GetBit(sent, 5);
            bool isKinematic    = NetworkUtil.GetBit(sent, 6);

            if (sentPosition)
            {
                Vector3 newDesiredPosition = NetworkTransformAnchor.TransformPosition(reader.ReadVector3());

                if (this.lastVelocityUpdateTime < 0.0f)
                {
                    this.estimatedVelocity = Vector3.zero;
                }
                else
                {
                    float timeSinceLastUpdate = Time.realtimeSinceStartup - this.lastVelocityUpdateTime;

                    if (timeSinceLastUpdate > 0.01)
                    {
                        this.estimatedVelocity = (newDesiredPosition - this.desiredPosition) / timeSinceLastUpdate;
                    }
                }

                this.desiredPosition        = newDesiredPosition;
                this.lastVelocityUpdateTime = Time.realtimeSinceStartup;
            }

            if (sentRotation)
            {
                this.desiredRotation = NetworkTransformAnchor.TransformRotation(reader.ReadQuaternion());
            }

            if (sentScale)
            {
                this.desiredScale = reader.ReadVector3();
            }

            // Early out and don't update physics if we're trying to get ownership of this object
            if (this.Identity.IsRequestingOwnership)
            {
                return;
            }

            if (sentPhysics)
            {
                this.rigidBody.velocity       = reader.ReadVector3();
                this.rigidBody.useGravity     = useGravity;
                this.rigidBody.freezeRotation = freezeRotation;
                this.rigidBody.isKinematic    = isKinematic;
            }
        }