using System; using Server.Ethics; using Server.Items; using Server.Targeting; namespace Server.Engines.Craft { public enum SmeltResult { Success, Invalid, NoSkill } public class Resmelt { public static void Do(Mobile from, CraftSystem craftSystem, BaseTool tool) { int num = craftSystem.CanCraft(from, tool, null); if (num > 0 && num != 1044267) { from.SendGump(new CraftGump(from, craftSystem, tool, num)); } else { from.Target = new InternalTarget(craftSystem, tool); from.SendLocalizedMessage(1044273); // Target an item to recycle. } } private class InternalTarget : Target { private CraftSystem m_CraftSystem; private BaseTool m_Tool; public InternalTarget(CraftSystem craftSystem, BaseTool tool) : base(2, false, TargetFlags.None) { m_CraftSystem = craftSystem; m_Tool = tool; } private SmeltResult Resmelt(Mobile from, Item item, CraftResource resource) { try { if (Ethic.IsImbued(item)) return SmeltResult.Invalid; if (CraftResources.GetType(resource) != CraftResourceType.Metal) return SmeltResult.Invalid; CraftResourceInfo info = CraftResources.GetInfo(resource); if (info == null || info.ResourceTypes.Length == 0) return SmeltResult.Invalid; CraftItem craftItem = m_CraftSystem.CraftItems.SearchFor(item.GetType()); if (craftItem == null || craftItem.Resources.Count == 0) return SmeltResult.Invalid; CraftRes craftResource = craftItem.Resources.GetAt(0); if (craftResource.Amount < 2) return SmeltResult.Invalid; // Not enough metal to resmelt double difficulty = 0.0; switch (resource) { case CraftResource.DullCopper: difficulty = 65.0; break; case CraftResource.ShadowIron: difficulty = 70.0; break; case CraftResource.Copper: difficulty = 75.0; break; case CraftResource.Bronze: difficulty = 80.0; break; case CraftResource.Gold: difficulty = 85.0; break; case CraftResource.Agapite: difficulty = 90.0; break; case CraftResource.Verite: difficulty = 95.0; break; case CraftResource.Valorite: difficulty = 99.0; break; } if (difficulty > from.Skills.Mining.Value) return SmeltResult.NoSkill; Type resourceType = info.ResourceTypes[0]; Item ingot = (Item)Activator.CreateInstance(resourceType); if (item is DragonBardingDeed || item is BaseArmor armor && armor.PlayerConstructed || item is BaseWeapon weapon && weapon.PlayerConstructed || item is BaseClothing clothing && clothing.PlayerConstructed) ingot.Amount = craftResource.Amount / 2; else ingot.Amount = 1; item.Delete(); from.AddToBackpack(ingot); from.PlaySound(0x2A); from.PlaySound(0x240); return SmeltResult.Success; } catch { // ignored } return SmeltResult.Invalid; } protected override void OnTarget(Mobile from, object targeted) { int num = m_CraftSystem.CanCraft(from, m_Tool, null); if (num > 0) { if (num == 1044267) { DefBlacksmithy.CheckAnvilAndForge(from, 2, out bool anvil, out bool forge); if (!anvil) num = 1044266; // You must be near an anvil else if (!forge) num = 1044265; // You must be near a forge. } from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, num)); } else { SmeltResult result = SmeltResult.Invalid; bool isStoreBought = false; int message; if (targeted is BaseArmor armor) { result = Resmelt(from, armor, armor.Resource); isStoreBought = !armor.PlayerConstructed; } else if (targeted is BaseWeapon weapon) { result = Resmelt(from, weapon, weapon.Resource); isStoreBought = !weapon.PlayerConstructed; } else if (targeted is DragonBardingDeed deed) { result = Resmelt(from, deed, deed.Resource); isStoreBought = false; } switch (result) { default: case SmeltResult.Invalid: message = 1044272; break; // You can't melt that down into ingots. case SmeltResult.NoSkill: message = 1044269; break; // You have no idea how to work this metal. case SmeltResult.Success: message = isStoreBought ? 500418 : 1044270; break; // You melt the item down into ingots. } from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, message)); } } } } }