public static bool GetHeldType(ItemHeldType heldtype, out Type type)
        {
            switch (heldtype)
            {
            case ItemHeldType.HeldEntity: type = typeof(BaseHeldEntity); return(true);

            case ItemHeldType.BaseProjectile:  type = typeof(BaseProjectile); return(true);

            case ItemHeldType.BaseMelee:  type = typeof(BaseMelee); return(true);

            default:
                type = typeof(BaseHeldEntity); return(false);
            }
        }
    // Update is called once per frame
    void Update()
    {
        if (lowHealth && lowHealthOverlay.alpha < 1f)
        {
            lowHealthOverlay.alpha += (Time.deltaTime * lowHealthFadeSpeed);
        }
        else if (!lowHealth && lowHealthOverlay.alpha > 0f)
        {
            lowHealthOverlay.alpha -= (Time.deltaTime * lowHealthFadeSpeed);
        }
        if (gInput.GetInput())
        {
            if (!inputDisabled)
            {
                //Debug.Log(isShowingCellTargetting + " || " + isPlacingPlant);
                if (!isShowingCellTargetting && isPlacingPlant)
                {
                    isShowingCellTargetting = true;
                    myCellTargetting.showTargetting();
                }
                if (isTryingToParry && !isParrying)
                {
                    isParrying = true;
                    anim.SetBool("IsGuarding", true);
                }
                calcWalkSpeed();
                Vector2 moveDirXY = gInput.getMovementInput();

                Vector3 moveDir = new Vector3(moveDirXY.x, 0, moveDirXY.y);

                if (rb.velocity.magnitude < maxSpeed && !isParrying)
                {
                    rb.AddForce(moveDir * currWalkSpeed);
                }

                //anim.SetFloat("MoveSpeed",moveDir.magnitude*(currWalkSpeed/walkSpeed));
                Vector2 aimDir = gInput.getAimInput();
                if (moveDir != Vector3.zero)
                {
                    anim.SetFloat("Speed", 1f);
                    lastMoveDir = moveDir;
                }
                else
                {
                    anim.SetFloat("Speed", 0f);
                }
                if (aimDir != Vector2.zero)
                {
                    lastAimDir = aimDir;
                }
                rotationZ = calcZ(moveDirXY);
                canvasRotTransf.rotation  = Quaternion.Euler(0, 0, rotationZ);
                regularRotTransf.rotation = Quaternion.Euler(0, rotationZ, 0);
                if (gInput.getFireDown())
                {
                    Fire();
                }



                if (gInput.getDashDown())
                {
                    inputDisabled = true;
                    currWalkSpeed = walkSpeed * dashMultiplier;
                    //anim.SetBool("Dashing",true);
                    Invoke("endDash", dashTime);
                    startDash = Time.time;
                }
            }
            else
            {
                if (attackNumber > 0)
                {
                    float   timeSinceFire = Time.time - startFireTarget;
                    Vector2 moveDirXY     = gInput.getMovementInput();

                    Vector3 moveDir = new Vector3(moveDirXY.x, 0, moveDirXY.y);
                    if (moveDir != Vector3.zero)
                    {
                        directionWhileAttacking = moveDir;
                    }
                    if (timeSinceFire < timeAttackMove)
                    {
                        if (rb.velocity.magnitude < maxSpeed * speedAttackMultiplier)
                        {
                            rb.AddForce(lastMoveDir * currWalkSpeed);
                        }
                    }
                    if (timeSinceFire < singleAttackCD)
                    {
                        if (timeSinceFire > singleAttackWaitStart)
                        {
                            if (gInput.getFireDown())
                            {
                                Fire();
                            }
                        }
                    }
                    else if (timeSinceFire < lastAttackCD && attackNumber == 3)
                    {
                    }
                    else
                    {
                        attackNumber            = 0;
                        timeSinceFire           = -1;
                        directionWhileAttacking = Vector3.zero;
                        inputDisabled           = false;
                    }
                }
                if (startDash != -1)
                {
                    if (rb.velocity.magnitude < maxSpeed * dashMultiplier)
                    {
                        rb.AddForce(lastMoveDir * currWalkSpeed);
                    }
                }
            }
            if (gInput.getLeftActionDown())
            {
                if (currItemType == ItemHeldType.Seed)
                {
                    currItemType = ItemHeldType.Weapon;
                    plantAndShield.SetActive(true);
                    isShowingCellTargetting = false;
                    isPlacingPlant          = false;
                    myCellTargetting.hideTargetting();
                }
                else
                {
                    currItemType = ItemHeldType.Seed;
                    plantAndShield.SetActive(false);
                    isPlacingPlant = true;

                    if (!inputDisabled)
                    {
                        isShowingCellTargetting = true;
                        myCellTargetting.showTargetting();
                    }
                }
            }
            if (gInput.getRightActionDown())
            {
                Heal();
            }
            if (gInput.getParryDown())
            {
                isTryingToParry = true;
                if (!inputDisabled)
                {
                    isParrying = true;
                    anim.SetBool("IsGuarding", true);
                }
            }
            if (gInput.getParryUp())
            {
                isTryingToParry = false;
                isParrying      = false;
                anim.SetBool("IsGuarding", false);
            }
        }

        aimTarget();
        setHPBar();
        setUI();
    }