/// <summary>
        /// Completes skill, applying the enchant.
        /// </summary>
        /// <param name="creature"></param>
        /// <param name="skill"></param>
        /// <param name="packet"></param>
        public void Complete(Creature creature, Skill skill, Packet packet)
        {
            var dict = packet.GetString();
            var enchantItemEntityId = MabiDictionary.Fetch <long>("ITEMID", dict);

            // Check enchant
            var elemental = creature.Inventory.GetItem(enchantItemEntityId);

            if (elemental == null)
            {
                Log.Warning("EnchantElementalAllSlot.Complete: User '{0}' tried to enchant with a non-existent elemental.", creature.Client.Account.Id);
                goto L_Fail;
            }

            // Check option set
            var optionSetId   = elemental.MetaData1.GetInt("ENELEM");
            var optionSetData = AuraData.OptionSetDb.Find(optionSetId);

            if (optionSetData == null)
            {
                Log.Warning("EnchantElementalAllSlot.Complete: User '{0:X16}' tried to enchant with unknown option set '{1}'.", creature.Client.Account.Id, optionSetId);
                goto L_Fail;
            }

            // Apply elementals
            var equip = creature.Inventory.GetMainEquipment();

            foreach (var item in equip)
            {
                item.ApplyOptionSet(optionSetData, true);

                Send.ItemUpdate(creature, item);
                Send.AcquireEnchantedItemInfo(creature, item.EntityId, item.Info.Id, optionSetId);
            }

            // Decrement elemental
            creature.Inventory.Decrement(elemental);

            Send.Effect(creature, Effect.Enchant, (byte)EnchantResult.Success);

L_Fail:
            Send.Echo(creature, packet);
        }
示例#2
0
        /// <summary>
        /// Completes skill, applying the enchant.
        /// </summary>
        /// <param name="creature"></param>
        /// <param name="skill"></param>
        /// <param name="packet"></param>
        public void Complete(Creature creature, Skill skill, Packet packet)
        {
            // Ignore parameters, use data saved in Prepare.

            var item      = creature.Temp.SkillItem1;
            var enchant   = creature.Temp.SkillItem2;
            var rightHand = creature.RightHand;
            var rnd       = RandomProvider.Get();

            var optionSetId = 0;

            creature.Temp.SkillItem1 = null;
            creature.Temp.SkillItem2 = null;

            // Get option set id
            optionSetId = this.GetOptionSetid(enchant);

            // Get and apply option set
            var optionSetData = AuraData.OptionSetDb.Find(optionSetId);

            if (optionSetData == null)
            {
                Log.Error("Enchant.Complete: Unknown option set '{0}'.", optionSetId);
                goto L_End;
            }

            // Check target
            if (!item.HasTag(optionSetData.Allow) || item.HasTag(optionSetData.Disallow))
            {
                Log.Warning("Enchant.Complete: Creature '{0:X16}' tried to use set '{0}' on invalid item '{1}'.", optionSetData.Id, item.Info.Id);
                goto L_End;
            }

            // Check success
            var success = optionSetData.AlwaysSuccess;

            if (!success)
            {
                var num    = rnd.Next(100);
                var chance = this.GetChance(creature, rightHand, skill, optionSetData);
                success = num < chance;
            }

            // Handle result
            var result  = EnchantResult.Fail;
            var destroy = true;

            if (success)
            {
                item.ApplyOptionSet(optionSetData, true);
                if (optionSetData.Category == OptionSetCategory.Prefix)
                {
                    item.OptionInfo.Prefix = (ushort)optionSetId;
                }
                if (optionSetData.Category == OptionSetCategory.Suffix)
                {
                    item.OptionInfo.Suffix = (ushort)optionSetId;
                }

                result = (rnd.Next(100) < HugeSuccessFailChance ? EnchantResult.HugeSuccess : EnchantResult.Success);
            }
            else
            {
                // Don't default destroy enchant when using Enchant
                if (skill.Info.Id == SkillId.Enchant)
                {
                    destroy = false;
                }

                result = (rnd.Next(100) < HugeSuccessFailChance ? EnchantResult.HugeFail : EnchantResult.Fail);

                // Random item durability loss, based on rank.
                var durabilityLoss = this.GetDurabilityLoss(rnd, optionSetData.Rank, result);
                if (durabilityLoss == -1)
                {
                    creature.Inventory.Remove(item);
                }
                else if (durabilityLoss != 0)
                {
                    creature.Inventory.ReduceMaxDurability(item, durabilityLoss);
                }
            }

            if (skill.Info.Id == SkillId.Enchant)
            {
                // Training
                this.Training(skill, result);

                // Decrement powder
                if (rightHand != null)
                {
                    creature.Inventory.Decrement(rightHand);
                }
            }

            // Destroy or decrement enchant
            if (destroy)
            {
                creature.Inventory.Decrement(enchant);
            }
            else
            {
                creature.Inventory.ReduceDurability(enchant, (int)skill.RankData.Var1 * 100);
            }

            // Response
            Send.Effect(creature, Effect.Enchant, (byte)result);
            if (success)
            {
                Send.ItemUpdate(creature, item);
                Send.AcquireEnchantedItemInfo(creature, item.EntityId, item.Info.Id, optionSetId);
            }

L_End:
            Send.Echo(creature, packet);
        }