// on item drop or item trash
        public bool RemoveSpellCast(HotBarItem baseItem)
        {
            SpellBookItem key = null;

            if (ReferenceEquals(baseItem, null) || ReferenceEquals(key = baseItem as SpellBookItem, null))
            {
                return(false);
            }

            return(existingSpellCasts.Remove(key));
        }
        private SpellCastBase CreateSpellCast(SpellBookItem baseItem)
        {
            var spellCasterClone = Instantiate(baseItem.SpellCastPrefab, Vector3.zero, Quaternion.identity, transform);
            var spellCircleClone = Instantiate(baseItem.SpellCirclePrefab, Vector3.zero, Quaternion.identity);

            spellCircleClone.gameObject.SetActive(false);

            spellCircleClone.Init(spellCasterClone);
            spellCasterClone.Init(gameObject, statsSystemBehaviour.StatsSystem, cooldownSys
                                  , baseItem.CooldownData.Id, castCirclePlacement, spellCircleClone, baseItem.SpellCastData
                                  , baseItem.SpellPrefab, movementScripts);

            existingSpellCasts.Add(baseItem, spellCasterClone);
            return(spellCasterClone);
        }
        private void Equip(SpellBookItem baseItem)
        {
            SpellCastBase castToEquip = default;

            if (existingSpellCasts.ContainsKey(baseItem))
            {
                castToEquip = existingSpellCasts[baseItem];
            }
            if (castToEquip == null)
            {
                castToEquip = CreateSpellCast(baseItem);
            }

            castToEquip.gameObject.SetActive(true);
            equippedSpellCastBase = castToEquip;

            onSpellChange?.Invoke();
        }
        public void TryEquipSpell(HotBarItem hotBarItem)
        {
            if (!enabled)
            {
                return;
            }

            SpellBookItem spellItem = default;

            var isSpell = !ReferenceEquals(hotBarItem, null) &&
                          !ReferenceEquals(spellItem = hotBarItem as SpellBookItem, null);

            if (!isSpell)
            {
                return;
            }

            var equippedSpellExists = !ReferenceEquals(equippedSpellCastBase, null);

            if (equippedSpellExists && equippedSpellCastBase.IsCasting)
            {
                return;
            }

            if (!equippedSpellExists)
            {
                Equip(spellItem);
            }
            else
            {
                var dataIsEqual = ReferenceEquals(equippedSpellCastBase.Data, spellItem.SpellCastData) &&
                                  ReferenceEquals(equippedSpellCastBase.Element, spellItem.SpellElement);
                if (dataIsEqual)
                {
                    return;
                }

                UnEquip();
                Equip(spellItem);
            }

            onSpellChange?.Invoke();
        }