Aura.Channel.Scripting.Scripts.NpcScript.Repair C# (CSharp) Метод

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

Tries to repair item specified in the repair reply.
public Repair ( string repairReply, int rate ) : RepairResult
repairReply string
rate int
Результат RepairResult
		public RepairResult Repair(string repairReply, int rate, params string[] tags)
		{
			var result = new RepairResult();

			// Get item id: @repair(_all):123456789
			int pos = -1;
			if ((pos = repairReply.IndexOf(':')) == -1 || !long.TryParse(repairReply.Substring(pos + 1), out result.ItemEntityId))
			{
				Log.Warning("NpcScript.Repair: Player '{0:X16}' (Account: {1}) sent invalid repair reply.", this.Player.EntityId, this.Player.Client.Account.Id);
				return result;
			}

			// Perfect repair?
			var all = repairReply.StartsWith("@repair_all");

			// Get item
			result.Item = this.Player.Inventory.GetItem(result.ItemEntityId);
			if (result.Item == null || !tags.Any(a => result.Item.Data.HasTag(a)))
			{
				Log.Warning("NpcScript.Repair: Player '{0:X16}' (Account: {1}) tried to repair invalid item.", this.Player.EntityId, this.Player.Client.Account.Id);
				return result;
			}

			// Calculate points to repair
			result.Points = (!all ? 1000 : result.Item.OptionInfo.DurabilityMax - result.Item.OptionInfo.Durability);
			result.Points = (int)Math.Floor(result.Points / 1000f);

			// Check gold
			var cost = result.Item.GetRepairCost(rate, 1);
			if (this.Gold < cost * result.Points)
			{
				result.HadGold = false;
				return result;
			}

			result.HadGold = true;

			// TODO: Luck?

			// Repair x times
			for (int i = 0; i < result.Points; ++i)
			{
				var useRate = rate;

				// Holy Water
				if (result.Item.IsBlessed)
					useRate = 100 - ((100 - useRate) / 2);

				// 100% Repair Event
				if (IsEventActive("all_repairrate_100"))
					useRate = 100;

				// Success
				if (this.Random(100) < useRate)
				{
					result.Item.Durability += 1000;
					result.Successes++;
				}
				// Fail
				else
				{
					// Remove blessing 
					if (result.Item.IsBlessed)
					{
						result.Item.OptionInfo.Flags &= ~ItemFlags.Blessed;
						Send.ItemBlessed(this.Player, result.Item);
					}

					result.Item.OptionInfo.DurabilityMax = Math.Max(1000, result.Item.OptionInfo.DurabilityMax - 1000);
					if (result.Item.OptionInfo.DurabilityMax < result.Item.OptionInfo.Durability)
						result.Item.Durability -= 1000;
					result.Fails++;
				}
			}

			// Reduce gold, but only for successes
			this.Gold -= cost * result.Successes;

			// Update max dura
			if (result.Fails != 0)
				Send.ItemMaxDurabilityUpdate(this.Player, result.Item);

			// Update  dura
			if (result.Successes != 0)
				Send.ItemDurabilityUpdate(this.Player, result.Item);

			// Send result
			Send.ItemRepairResult(this.Player, result.Item, result.Successes);

			this.Player.Keywords.Give("ExperienceRepair");

			return result;
		}