public void Complete(Creature creature, Skill skill, Packet packet)
{
// Ignore parameters, use data saved in Prepare.
var rnd = RandomProvider.Get();
var item = creature.Temp.SkillItem1;
var enchant = creature.Temp.SkillItem2;
var skillUser = creature;
var itemOwner = creature;
var powder = creature.RightHand;
var entrustment = skillUser.Temp.ActiveEntrustment;
if (entrustment != null)
{
itemOwner = entrustment.Creature1;
powder = entrustment.GetMagicPowder(itemOwner);
}
var optionSetId = 0;
skillUser.Temp.SkillItem1 = null;
skillUser.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 = GetChance(skillUser, powder, skill.Info.Id, 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)
itemOwner.Inventory.Remove(item);
else if (durabilityLoss != 0)
itemOwner.Inventory.ReduceMaxDurability(item, durabilityLoss);
}
if (skill.Info.Id == SkillId.Enchant)
{
// Training
this.Training(skill, result);
// Decrement powder
if (powder != null)
itemOwner.Inventory.Decrement(powder);
}
// Destroy or decrement enchant
if (destroy)
itemOwner.Inventory.Decrement(enchant);
else
itemOwner.Inventory.ReduceDurability(enchant, (int)skill.RankData.Var1 * 100);
// Response
Send.Effect(skillUser, Effect.Enchant, (byte)result);
if (skillUser != itemOwner)
Send.Effect(itemOwner, Effect.Enchant, (byte)result);
if (success)
{
Send.ItemUpdate(itemOwner, item);
Send.AcquireEnchantedItemInfo(itemOwner, item.EntityId, item.Info.Id, optionSetId);
}
if (entrustment != null)
entrustment.End();
L_End:
Send.Echo(skillUser, packet);
}