public void UseSkinning(Mobile.Casting cast, Character c, Mobile go)
        {
            c.cast = cast;
            int rdiff = CurrentVal(c) - 1;
            int res   = StrSkillCheck(c, rdiff);

            if (res > 50 && !go.Skinned)
            {
                //c.SpellSuccess();
                float reussite = (float)res;

                reussite = reussite / 10f;
                ArrayList loot = new ArrayList();
                c.LootOwner = go.Guid;
                if (go.SkinLoot != null)
                {
                    ArrayList sl = new ArrayList();
                    foreach (Loot l in go.SkinLoot)
                    {
                        if (Utility.RandomDouble() * 100 < l.Probability)
                        {
                            int n = (int)(reussite * l.Probability);
                            sl.Add(l.Create(1));
                        }
                    }
                    if (sl.Count == 0)
                    {
                        c.SpellFaillure(SpellFailedReason.FailedAttempt);
                        return;
                    }
                    go.Skinned = true;
                    if (Current < Cap(c) && c.SkillUp(Current, rdiff, 1))
                    {
                        Current++;
                        c.SendSkillUpdate();
                    }
                    c.SpellSuccess();
                    c.previousSpellCasted = cast.id;

                    go.Treasure = (Item[])sl.ToArray(typeof(Item));
                    c.SendLootDetails(go.Guid, go, 0);
                    go.SendSmallUpdateToPlayerNearMe(new int[] { (int)UpdateFields.UNIT_DYNAMIC_FLAGS, (int)UpdateFields.UNIT_FIELD_FLAGS }, new object[] { go.DynFlags(c), go.Flags });
                }
                else
                {
                    c.SpellFaillure(SpellFailedReason.FailedAttempt);
                }
            }
            else
            {
                c.SpellFaillure(SpellFailedReason.FailedAttempt);
                go.SendSmallUpdateToPlayerNearMe(new int[] { (int)UpdateFields.UNIT_DYNAMIC_FLAGS, (int)UpdateFields.UNIT_FIELD_FLAGS }, new object[] { go.DynFlags(c), go.Flags });
            }
        }
 public virtual void SendCooldown(Mobile.Casting cast, Mobile c)
 {
     if (c is Character)
     {
         int offset = 4;
         Converter.ToBytes((uint)cast.id, c.tempBuff, ref offset);
         Converter.ToBytes((ulong)c.Guid, c.tempBuff, ref offset);
         Converter.ToBytes((ushort)cast.cool, c.tempBuff, ref offset);
         (c as Character).Send(OpCodes.SMSG_SPELL_COOLDOWN, c.tempBuff, offset);
     }
 }
        public void UseHerbalist(Mobile.Casting cast, Character c, GameObject go)
        {
            Hashtable diff = new Hashtable();

            diff[29] = 0;
            diff[8]  = 20;
            diff[9]  = 50;
            diff[10] = 75;
            diff[11] = 100;
            diff[26] = 125;
            diff[27] = 150;
            diff[35] = 140;
            diff[45] = 125;
            diff[47] = 160;
            diff[48] = 215;
            diff[49] = 185;
            diff[50] = 205;
            diff[51] = 195;
            int rdiff = CurrentVal(c) - (int)diff[(int)go.Sound[0]];
            int res   = IqSkillCheck(c, rdiff);

            if (res > 50)
            {
                if (Current < Cap(c) && c.SkillUp(Current, rdiff, 1))
                {
                    Current++;
                    c.SendSkillUpdate();
                    //c.SendSmallUpdate( new int[]{ Index, Index + 1, Index + 2 }, new object[]{ (int)Id, (short)CurrentVal(c), (short)Cap( c ), (int)0 } );
                }
                c.SpellSuccess();
                float reussite = (float)res;

                reussite = reussite / 10f;
                string str = "Reussite : " + reussite.ToString();
                c.SendMessage(str);
                if (!go.CheckLoot(c, reussite))
                {
                    c.SpellFaillure(SpellFailedReason.FailedAttempt);
                }
            }
            else
            {
                //	Console.WriteLine("SPELL RESULT :{0}", result );
                c.SpellFaillure(SpellFailedReason.FailedAttempt);
            }
        }
        public void UseMining(Mobile.Casting cast, Character c, GameObject go)
        {
            Hashtable diff = new Hashtable();

            diff[18] = 25;
            diff[19] = 50;
            diff[20] = 75;
            diff[21] = 100;
            diff[22] = 125;
            diff[25] = 150;
            diff[38] = 0;              //	Copper
            diff[39] = 50;             // Tin
            diff[40] = 100;            //	Silver
            diff[41] = 150;            // Iron
            diff[42] = 200;            //	Gold
            int rdiff = CurrentVal(c) - (int)diff[(int)go.Sound[0]];
            int res   = StrSkillCheck(c, rdiff);

            if (res > 50)
            {
                if (Current < Cap(c) && c.SkillUp(Current, rdiff, 1))
                {
                    Current++;
                    c.SendSkillUpdate();
                }
                c.SpellSuccess();
                float reussite = (float)res;

                reussite = reussite / 10f;
                //	string str = "Reussite : " + reussite.ToString();
                //	c.SendMessage( str );
                if (!go.CheckLoot(c, reussite))
                {
                    c.SpellFaillure(SpellFailedReason.FailedAttempt);
                }
            }
            else
            {
                //	Console.WriteLine("SPELL RESULT :{0}", result );
                c.SpellFaillure(SpellFailedReason.FailedAttempt);
            }
        }
        public void UseFishing(Mobile.Casting cast, Character c)
        {
            GameObject desc = c.InsideFishingZone();

            if (desc == null)
            {
                c.SpellFaillure(SpellFailedReason.TheyArentAnyFishHere);
                return;
            }
            int rdiff = CurrentVal(c);
            int res   = AgiSkillCheck(c, rdiff);

            if (res > 50)
            {
                if (Current < Cap(c) && c.SkillUp(Current, rdiff, 1))
                {
                    Current++;
                    c.SendSkillUpdate();
                }
                c.SpellSuccess();
                float reussite = (float)res;

                reussite = reussite / 10f;
                string str = "Reussite : " + reussite.ToString();
                c.SendMessage(str);
                if (!desc.CheckLoot(c, reussite))
                {
                    c.SpellFaillure(SpellFailedReason.FailedAttempt);
                }
            }
            else
            {
                //	Console.WriteLine("SPELL RESULT :{0}", result );
                c.SpellFaillure(SpellFailedReason.FailedAttempt);
            }
        }
        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;
            }
        }