public void Create(Mobile.Casting cast, Mobile c)
        {
            bool ok = true;

            if ((c as Character).FindAFreeSlot() != Slots.None)
            {
                ArrayList toConsume = new ArrayList();
                for (int t = 0; t < nMaterials.Length; t++)
                {
                    if (nMaterials[t] > 0)
                    {
                        int amount = nMaterials[t];
                        if (c is Character)
                        {
                            int ihave = (c as Character).FindAmountOfItemById(materials[t]);
                            if (amount > ihave)
                            {
                                ok = false;
                                c.SpellFaillure(SpellFailedReason.Required, World.CreateItemInPoolById(materials[t]).Name);
                                break;
                            }
                        }
                    }
                    else
                    {
                        break;
                    }
                }
                if (ok)
                {
                    for (int t = 0; t < nMaterials.Length; t++)
                    {
                        if (nMaterials[t] > 0)
                        {
                            if (c is Character)
                            {
                                (c as Character).ConsumeItemByIdUpTo(materials[t], nMaterials[t]);
                            }
                        }
                    }
                }
            }
            if (ok)
            {
                int id = c.cast.id;
                c.SpellSuccess();
                Item i = World.CreateItemInPoolById(objectCraft);
                if (i.MaxCount == 0)
                {
                    i.MaxCount = 1;
                }
                if (c is Character)
                {
                    c.cast.id = id;
                    //c.SpellFaillure( (SpellFailedReason)8 );
                    (c as Character).PutObjectInBackpack(i, 1, true);
                    object o = AbilityClasses.abilityClasses[id];
                    if (o != null)
                    {
                        int skill = 0;
                        switch ((int)o)
                        {
                        case (int)ClassesOfSpells.Leatherworking:
                        {
                            skill = LeatherSkill.SkillId;
                            break;
                        }

                        case (int)ClassesOfSpells.Blacksmithing:
                        {
                            skill = 164;
                            break;
                        }

                        case (int)ClassesOfSpells.Enchanting:
                        {
                            skill = 333;
                            break;
                        }

                        case (int)ClassesOfSpells.Engineering:
                        {
                            skill = 202;
                            break;
                        }

                        case (int)ClassesOfSpells.Tailoring:
                        {
                            skill = 197;
                            break;
                        }

                        case (int)ClassesOfSpells.Cooking:
                        {
                            skill = 185;
                            break;
                        }

                        case (int)ClassesOfSpells.Mining:
                        {
                            skill = 186;
                            break;
                        }
                        }
                        Skill sk = c.AllSkills[(ushort)skill];
                        if (sk != null && sk.Current < sk.Cap(c) && c.SkillUp(sk.Current, 30, 1))
                        {
                            sk.Current++;
                            (c as Character).SendSkillUpdate();
                        }
                    }
                }
                return;
            }
        }