Aura.Channel.Skills.Magic.Enchant.Complete C# (CSharp) Метод

Complete() публичный Метод

Completes skill, applying the enchant.
public Complete ( Creature creature, Skill skill, Packet packet ) : void
creature Aura.Channel.World.Entities.Creature
skill Skill
packet Packet
Результат void
		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);
		}