/// <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); }
/// <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); }