public void CastAbility(KeyCode key, LayerMask collisionLayer)
        {
            AbilityCooldownDisplay abilitySlot = abilitySlots[key];

            if (abilitySlot.ability == null)
            {
                return;
            }
            if (!abilitySlot.CooldownReady())
            {
                return;
            }

            castedAbility = abilitySlot.ability;
            Vector3 lookPoint = PlayerInfo.GetPlayerCursor().Position;

            //prepare cast and check if its valid
            abilitySlot.ability.PrepareCast(lookPoint, gameObject, castPosition, collisionLayer);
            if (!abilitySlot.ability.CastIsValid(gameObject))
            {
                return;
            }

            //cast and set cooldown
            if (!scheduler.StartAction(this, true))
            {
                return;
            }
            abilitySlot.SetCooldown();
            if (abilitySlot.ability.shouldRotate)
            {
                RotateCharacter(lookPoint);
            }
            if (abilitySlot.ability.castImmediately)
            {
                abilitySlot.ability.CastAction();
            }

            if (abilitySlot.ability.animationClip == null)
            {
                FinishedCast();
                return;
            }

            //handle animation
            animator.SetTrigger("cast");
            animator.SetTrigger("cast" + abilitySlot.index);

            /* ability cast is triggert by animation event CastAction() */
        }
        public void SetNewAbility(AbilityGem gem, AbilityCooldownDisplay slot)
        {
            if (gem == null)
            {
                slot.SetAbility(null);
                return;
            }
            Ability abilityInstance = InstanciateAbility(gem.ability);

            slot.SetAbility(abilityInstance);

            abilityInstance.baseEffectValue = gem.baseEffectValue;
            abilityInstance.range           = gem.ability.range;
            if (animator == null)
            {
                animator = GetComponentInChildren <Animator>();
            }
            AnimationHandler.OverrideAnimations(animator, gem.ability.animationClip, "Cast" + slot.index);
        }