162 lines
4.7 KiB
C#
162 lines
4.7 KiB
C#
using System;
|
|
using Server.Ethics;
|
|
using Server.Items;
|
|
using Server.Targeting;
|
|
using Server.Utilities;
|
|
|
|
namespace Server.Engines.Craft
|
|
{
|
|
public enum SmeltResult
|
|
{
|
|
Success,
|
|
Invalid,
|
|
NoSkill
|
|
}
|
|
|
|
public static 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 readonly CraftSystem m_CraftSystem;
|
|
private readonly 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[0];
|
|
|
|
if (craftResource.Amount < 2)
|
|
return SmeltResult.Invalid; // Not enough metal to resmelt
|
|
|
|
var difficulty = resource switch
|
|
{
|
|
CraftResource.DullCopper => 65.0,
|
|
CraftResource.ShadowIron => 70.0,
|
|
CraftResource.Copper => 75.0,
|
|
CraftResource.Bronze => 80.0,
|
|
CraftResource.Gold => 85.0,
|
|
CraftResource.Agapite => 90.0,
|
|
CraftResource.Verite => 95.0,
|
|
CraftResource.Valorite => 99.0,
|
|
_ => 0.0
|
|
};
|
|
|
|
if (difficulty > from.Skills.Mining.Value)
|
|
return SmeltResult.NoSkill;
|
|
|
|
Type resourceType = info.ResourceTypes[0];
|
|
Item ingot = (Item)ActivatorUtil.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);
|
|
}
|
|
|
|
message = result switch
|
|
{
|
|
SmeltResult.Invalid => 1044272,
|
|
SmeltResult.NoSkill => 1044269,
|
|
SmeltResult.Success => isStoreBought ? 500418 : 1044270,
|
|
_ => 1044272
|
|
};
|
|
|
|
from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, message));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|