// create PlayerMove by using the info from the PlayerNetworkActionContainer
    PlayerMove DoAction( PlayerMove prev, PlayerNetworkActionContainer action )
    {
        // default: move nowhere
        Vector3 dire = Vector3.zero;
        Vector3 rot = Vector3.zero;

        if( action.action == PlayerNetworkAction.MOVE || isJumping )
        {
            // get position
            dire.x = action.moveX;
            dire.z = action.moveY;
            dire.y = action.moveZ;
            transform.position = dire;

        }
        else // no movement
        {
            dire = transform.position;
        }

        if( rot.x != -2 && rot.z != -2 )
        {
            rot.x = action.rotateX;
            rot.z = action.rotateZ;
            transform.rotation = Quaternion.LookRotation( rot, Vector3.up );
        }

        // this thing will go to the server!
        return new PlayerMove
        {
            moveNum = prev.moveNum + 1,
            currentPosition = dire,
            lookAtThis = rot,
            hasRangeEquipped = action.hasRange,
            useWeapon = action.usingWeapon,
            grabbing = action.isGrabbing
        };
    }
    void Update()
    {
        if (isLocalPlayer)
        {
            bool grabThis = isGrabbing;
            bool badaboom = usingWeapon;

            // set up PlayerNetworkActionContainer
            PlayerNetworkActionContainer pressedKey = new PlayerNetworkActionContainer();

            pressedKey.action = PlayerNetworkAction.NONE;
            pressedKey.moveX = transform.position.x;
            pressedKey.moveZ = transform.position.y;
            pressedKey.moveY = transform.position.z;

            pressedKey.rotateX = lastLookDirection.x;
            pressedKey.rotateZ = lastLookDirection.z;

            // use WasPressed here to avoid mass toggling range/mass using weapon
            if( actions.UseWeapon.WasPressed &&
                !usingWeapon &&
                ( settings.allowJumpingWithWeapon // no additional checks necessary
                || !settings.allowJumpingWithWeapon && !isJumping ) ) // check if player is jumping
            {
                pressedKey.action = PlayerNetworkAction.USE_WEAPON;
                badaboom = true;
            }
            else if( actions.ToggleRanged.WasPressed )
            {
                hasRangeWeapon = !hasRangeWeapon;
                if( myCam != null ) myCam.FreeMove = hasRangeWeapon;
            }
            else if( actions.Move.IsPressed && !hasRangeWeapon )
            {
                pressedKey.action = PlayerNetworkAction.MOVE;

                // prev
        //				Vector3 dire = transform.position;
        //				dire.x += Time.deltaTime * settings.moveSpeed * actions.Move.X;
        //				dire.z += Time.deltaTime * settings.moveSpeed * actions.Move.Y;
        //
        //				transform.position = dire;

                // fk the input, use the cam's forward to not screw up movement
         				transform.Translate (myCam.transform.forward * settings.moveSpeed * Time.deltaTime);
                Vector3 dire = transform.position;

                pressedKey.moveX = dire.x;
                pressedKey.moveY = dire.z;
                pressedKey.moveZ = dire.y;

                lastLookDirection = new Vector3( actions.Move.X, 0, actions.Move.Y );
                transform.rotation = Quaternion.LookRotation( lastLookDirection );
                lastLookDirection = Vector3.forward;
                pressedKey.rotateX = lastLookDirection.x;
                pressedKey.rotateZ = lastLookDirection.z;
            }
            else if( actions.DodoInteraction.WasPressed && !isGrabbing )
            {
                pressedKey.action = PlayerNetworkAction.DODO_INTERACTION;
                grabThis = true;
            }
            else if( isJumping )
            {
                pressedKey.action = PlayerNetworkAction.JUMPING;
            }

            pressedKey.hasRange = hasRangeWeapon;
            pressedKey.isGrabbing = grabThis;
            pressedKey.usingWeapon = badaboom;

            pendingMoves.Add(pressedKey);
            UpdatePredictedState();
            CmdExecute( pressedKey );
        }

        // synchronize state with the server
        SyncState( false );
    }
 void CmdExecute(PlayerNetworkActionContainer action)
 {
     serverMove = DoAction(serverMove, action);
 }