private void SetInput(CharacterMoveModes moveModes, float rotationAngleRad)
        {
            this.characterInput.MoveModes        = moveModes;
            this.characterInput.RotationAngleRad = rotationAngleRad;

            //// uncomment visualize rotation angle correctness with Physics Visualizer
            //var fromPosition = this.character.Position
            //                   + (0, this.character.ProtoCharacter.CharacterWorldWeaponOffsetRanged);
            //var toPosition = fromPosition + (30, 0).RotateRad(rotationAngleRad);
            //Client.Characters.CurrentPlayerCharacter.PhysicsBody.PhysicsSpace.TestLine(
            //    fromPosition,
            //    toPosition,
            //    collisionGroup: null);

            if (!this.characterInput.HasChanged)
            {
                return;
            }

            this.characterInput.SetChanged(false);

            var command = new CharacterInputUpdate(
                this.characterInput.MoveModes,
                this.characterInput.RotationAngleRad);

            ((PlayerCharacter)this.character.ProtoCharacter)
            .ClientSetInput(command);
        }
        public void Send(CharacterInputUpdate data)
        {
            this.lastInputId          = ++this.lastInputId;
            this.lastInputData        = data;
            this.lastInputSentCount   = 0;
            this.lastInputIsServerAck = false;

            this.SendNow();
        }