RunUO Community

This is a sample guest message. Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

~1_nothing~

Mr. Friday

Wanderer
~1_nothing~

I recently attempted to add several new ores/ingots to my server both as an exercise in improving my scripting skill and to add something new for players to do.

I examined Daat's system some for a model, but I did 100% of the actual scripting from scratch. Everything seems to be compiling fine, and I can mine, smelt, etc. the new ores in game, but there is one small problem. The ores and ingots (the new ones) all have the same name:

~1_NOTHING~

I have an idea that it has something to do with this part in the scripts:

Code:
new CraftResourceInfo( 639, 		0, "Spike",			CraftAttributeInfo.Spike,		CraftResource.Spike,			typeof( SpikeIngot ),		typeof( SpikeOre ) ),
new CraftResourceInfo( 1266, 		0, "Ice Rock",		CraftAttributeInfo.IceRock,		CraftResource.IceRock,			typeof( IceRockIngot ),		typeof( IceRockOre ) ),
new CraftResourceInfo( 1149, 		0, "Gypsum",		CraftAttributeInfo.Gypsum,		CraftResource.Gypsum,			typeof( GypsumIngot ),		typeof( GypsumOre ) ),
new CraftResourceInfo( 961, 		0, "Platinum",		CraftAttributeInfo.Platinum,	CraftResource.Platinum,			typeof( PlatinumIngot ),	typeof( PlatinumOre ) ),
new CraftResourceInfo( 1154, 		0, "Silver Rock",	CraftAttributeInfo.SilverRock,	CraftResource.SilverRock,		typeof( SilverRockIngot ),	typeof( SilverRockOre ) ),

from OreInfo.cs.

But the weird thing is that I double checked against Daat's system and he seems to have all 0's for the "number" column too. Any crafting system experts know what might be causing this problem?

EDIT:

On second thought, could it have something to do with this section?

Code:
else if ( info.Level == 9 )
	return CraftResource.Spike;
else if ( info.Level == 10 )
	return CraftResource.IceRock;
else if ( info.Level == 11 )
	return CraftResource.Gypsum;
else if ( info.Level == 12 )
	return CraftResource.Platinum;
else if ( info.Level == 13 )
	return CraftResource.SilverRock;

And just since I know some one will want to examine the full code, here is my OreInfo.cs:

Code:
using System;
using System.Collections;

namespace Server.Items
{
	public enum CraftResource
	{
		None = 0,
		Iron = 1,
		DullCopper,
		ShadowIron,
		Copper,
		Bronze,
		Gold,
		Agapite,
		Verite,
		Valorite,
		Spike,
		IceRock,
		Gypsum,
		Platinum,
		SilverRock,
		DarkPagan,
		Mystic,
		Spectral,
		OldBritain,
		Onyx,
		RedElven,
		Undead,
		Pyrite,
		Virginity,
		Malachite,
		LavaRock,
		Azurite,
		Dripstone,
		Executor,
		Peachblue,
		Destruction,
		Anra,
		Crystal,
		Doom,
		Goddess,
		NewCarpathia,

		RegularLeather = 101,
		SpinedLeather,
		HornedLeather,
		BarbedLeather,

		RedScales = 201,
		YellowScales,
		BlackScales,
		GreenScales,
		WhiteScales,
		BlueScales
	}

	public enum CraftResourceType
	{
		None,
		Metal,
		Leather,
		Scales
	}

	public class CraftAttributeInfo
	{
		private int m_WeaponFireDamage;
		private int m_WeaponColdDamage;
		private int m_WeaponPoisonDamage;
		private int m_WeaponEnergyDamage;
		private int m_WeaponDurability;
		private int m_WeaponLuck;
		private int m_WeaponGoldIncrease;
		private int m_WeaponLowerRequirements;
		private SlayerName m_WeaponSlayer;

		private int m_ArmorPhysicalResist;
		private int m_ArmorFireResist;
		private int m_ArmorColdResist;
		private int m_ArmorPoisonResist;
		private int m_ArmorEnergyResist;
		private int m_ArmorDurability;
		private int m_ArmorLuck;
		private int m_ArmorGoldIncrease;
		private int m_ArmorLowerRequirements;

		private int m_RunicMinAttributes;
		private int m_RunicMaxAttributes;
		private int m_RunicMinIntensity;
		private int m_RunicMaxIntensity;

		public int WeaponFireDamage{ get{ return m_WeaponFireDamage; } set{ m_WeaponFireDamage = value; } }
		public int WeaponColdDamage{ get{ return m_WeaponColdDamage; } set{ m_WeaponColdDamage = value; } }
		public int WeaponPoisonDamage{ get{ return m_WeaponPoisonDamage; } set{ m_WeaponPoisonDamage = value; } }
		public int WeaponEnergyDamage{ get{ return m_WeaponEnergyDamage; } set{ m_WeaponEnergyDamage = value; } }
		public int WeaponDurability{ get{ return m_WeaponDurability; } set{ m_WeaponDurability = value; } }
		public int WeaponLuck{ get{ return m_WeaponLuck; } set{ m_WeaponLuck = value; } }
		public int WeaponGoldIncrease{ get{ return m_WeaponGoldIncrease; } set{ m_WeaponGoldIncrease = value; } }
		public int WeaponLowerRequirements{ get{ return m_WeaponLowerRequirements; } set{ m_WeaponLowerRequirements = value; } }
		public SlayerName WeaponSlayer{ get{ return m_WeaponSlayer; } set{ m_WeaponSlayer = value; } }

		public int ArmorPhysicalResist{ get{ return m_ArmorPhysicalResist; } set{ m_ArmorPhysicalResist = value; } }
		public int ArmorFireResist{ get{ return m_ArmorFireResist; } set{ m_ArmorFireResist = value; } }
		public int ArmorColdResist{ get{ return m_ArmorColdResist; } set{ m_ArmorColdResist = value; } }
		public int ArmorPoisonResist{ get{ return m_ArmorPoisonResist; } set{ m_ArmorPoisonResist = value; } }
		public int ArmorEnergyResist{ get{ return m_ArmorEnergyResist; } set{ m_ArmorEnergyResist = value; } }
		public int ArmorDurability{ get{ return m_ArmorDurability; } set{ m_ArmorDurability = value; } }
		public int ArmorLuck{ get{ return m_ArmorLuck; } set{ m_ArmorLuck = value; } }
		public int ArmorGoldIncrease{ get{ return m_ArmorGoldIncrease; } set{ m_ArmorGoldIncrease = value; } }
		public int ArmorLowerRequirements{ get{ return m_ArmorLowerRequirements; } set{ m_ArmorLowerRequirements = value; } }

		public int RunicMinAttributes{ get{ return m_RunicMinAttributes; } set{ m_RunicMinAttributes = value; } }
		public int RunicMaxAttributes{ get{ return m_RunicMaxAttributes; } set{ m_RunicMaxAttributes = value; } }
		public int RunicMinIntensity{ get{ return m_RunicMinIntensity; } set{ m_RunicMinIntensity = value; } }
		public int RunicMaxIntensity{ get{ return m_RunicMaxIntensity; } set{ m_RunicMaxIntensity = value; } }

		public CraftAttributeInfo()
		{
		}

		public static readonly CraftAttributeInfo Blank;
		public static readonly CraftAttributeInfo DullCopper, ShadowIron, Copper, Bronze, Golden, Agapite, Verite, Valorite, Spike, IceRock, Gypsum, Platinum, SilverRock, DarkPagan, Mystic, Spectral, OldBritain, Onyx, RedElven, Undead, Pyrite, Virginity, Malachite, LavaRock, Azurite, Dripstone, Executor, Peachblue, Destruction, Anra, Crystal, Doom, Goddess, NewCarpathia;
		public static readonly CraftAttributeInfo Spined, Horned, Barbed;
		public static readonly CraftAttributeInfo RedScales, YellowScales, BlackScales, GreenScales, WhiteScales, BlueScales;

		static CraftAttributeInfo()
		{
			Blank = new CraftAttributeInfo();

			CraftAttributeInfo dullCopper = DullCopper = new CraftAttributeInfo();

			dullCopper.ArmorPhysicalResist = 6;
			dullCopper.ArmorDurability = 50;
			dullCopper.ArmorLowerRequirements = 20;
			dullCopper.WeaponDurability = 100;
			dullCopper.WeaponLowerRequirements = 50;
			dullCopper.RunicMinAttributes = 1;
			dullCopper.RunicMaxAttributes = 2;
			dullCopper.RunicMinIntensity = 10;
			dullCopper.RunicMaxIntensity = 35;

			CraftAttributeInfo shadowIron = ShadowIron = new CraftAttributeInfo();

			shadowIron.ArmorPhysicalResist = 2;
			shadowIron.ArmorFireResist = 1;
			shadowIron.ArmorEnergyResist = 5;
			shadowIron.ArmorDurability = 100;
			shadowIron.WeaponColdDamage = 20;
			shadowIron.WeaponDurability = 50;
			shadowIron.RunicMinAttributes = 2;
			shadowIron.RunicMaxAttributes = 2;
			shadowIron.RunicMinIntensity = 20;
			shadowIron.RunicMaxIntensity = 45;

			CraftAttributeInfo copper = Copper = new CraftAttributeInfo();

			copper.ArmorPhysicalResist = 1;
			copper.ArmorFireResist = 1;
			copper.ArmorPoisonResist = 5;
			copper.ArmorEnergyResist = 2;
			copper.WeaponPoisonDamage = 10;
			copper.WeaponEnergyDamage = 20;
			copper.RunicMinAttributes = 2;
			copper.RunicMaxAttributes = 3;
			copper.RunicMinIntensity = 25;
			copper.RunicMaxIntensity = 50;

			CraftAttributeInfo bronze = Bronze = new CraftAttributeInfo();

			bronze.ArmorPhysicalResist = 3;
			bronze.ArmorColdResist = 5;
			bronze.ArmorPoisonResist = 1;
			bronze.ArmorEnergyResist = 1;
			bronze.WeaponFireDamage = 40;
			bronze.RunicMinAttributes = 3;
			bronze.RunicMaxAttributes = 3;
			bronze.RunicMinIntensity = 30;
			bronze.RunicMaxIntensity = 65;

			CraftAttributeInfo golden = Golden = new CraftAttributeInfo();

			golden.ArmorPhysicalResist = 1;
			golden.ArmorFireResist = 1;
			golden.ArmorColdResist = 2;
			golden.ArmorEnergyResist = 2;
			golden.ArmorLuck = 40;
			golden.ArmorLowerRequirements = 30;
			golden.WeaponLuck = 40;
			golden.WeaponLowerRequirements = 50;
			golden.RunicMinAttributes = 3;
			golden.RunicMaxAttributes = 4;
			golden.RunicMinIntensity = 35;
			golden.RunicMaxIntensity = 75;

			CraftAttributeInfo agapite = Agapite = new CraftAttributeInfo();

			agapite.ArmorPhysicalResist = 2;
			agapite.ArmorFireResist = 3;
			agapite.ArmorColdResist = 2;
			agapite.ArmorPoisonResist = 2;
			agapite.ArmorEnergyResist = 2;
			agapite.WeaponColdDamage = 30;
			agapite.WeaponEnergyDamage = 20;
			agapite.RunicMinAttributes = 4;
			agapite.RunicMaxAttributes = 4;
			agapite.RunicMinIntensity = 40;
			agapite.RunicMaxIntensity = 80;

			CraftAttributeInfo verite = Verite = new CraftAttributeInfo();

			verite.ArmorPhysicalResist = 3;
			verite.ArmorFireResist = 3;
			verite.ArmorColdResist = 2;
			verite.ArmorPoisonResist = 3;
			verite.ArmorEnergyResist = 1;
			verite.WeaponPoisonDamage = 40;
			verite.WeaponEnergyDamage = 20;
			verite.RunicMinAttributes = 4;
			verite.RunicMaxAttributes = 5;
			verite.RunicMinIntensity = 45;
			verite.RunicMaxIntensity = 90;

			CraftAttributeInfo valorite = Valorite = new CraftAttributeInfo();

			valorite.ArmorPhysicalResist = 4;
			valorite.ArmorColdResist = 3;
			valorite.ArmorPoisonResist = 3;
			valorite.ArmorEnergyResist = 3;
			valorite.ArmorDurability = 50;
			valorite.WeaponFireDamage = 10;
			valorite.WeaponColdDamage = 20;
			valorite.WeaponPoisonDamage = 10;
			valorite.WeaponEnergyDamage = 20;
			valorite.RunicMinAttributes = 5;
			valorite.RunicMaxAttributes = 5;
			valorite.RunicMinIntensity = 50;
			valorite.RunicMaxIntensity = 100;
			
			CraftAttributeInfo spike = Spike = new CraftAttributeInfo();

			spike.ArmorPhysicalResist = 8;
			spike.ArmorFireResist = 1;
			spike.ArmorColdResist = 1;
			spike.ArmorPoisonResist = 1;
			spike.ArmorEnergyResist = 2;
			spike.ArmorDurability = 150;
			spike.ArmorLuck = 0;
			spike.ArmorLowerRequirements = 0;
			spike.WeaponFireDamage = 0;
			spike.WeaponColdDamage = 0;
			spike.WeaponPoisonDamage = 0;
			spike.WeaponEnergyDamage = 0;
			spike.WeaponDurability = 150;
			spike.WeaponLuck = 0;
			spike.WeaponLowerRequirements = 0;
			//spike.RunicMinAttributes = 5;
			//spike.RunicMaxAttributes = 5;
			//spike.RunicMinIntensity = 50;
			//spike.RunicMaxIntensity = 100;
			
			CraftAttributeInfo iceRock = IceRock = new CraftAttributeInfo();

			iceRock.ArmorPhysicalResist = 2;
			iceRock.ArmorFireResist = -10;
			iceRock.ArmorColdResist = 10;
			iceRock.ArmorPoisonResist = 1;
			iceRock.ArmorEnergyResist = 1;
			iceRock.ArmorDurability = 50;
			iceRock.ArmorLuck = 0;
			iceRock.ArmorLowerRequirements = 0;
			iceRock.WeaponFireDamage = 0;
			iceRock.WeaponColdDamage = 100;
			iceRock.WeaponPoisonDamage = 0;
			iceRock.WeaponEnergyDamage = 0;
			iceRock.WeaponDurability = 50;
			iceRock.WeaponLuck = 0;
			iceRock.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo gypsum = Gypsum = new CraftAttributeInfo();

			gypsum.ArmorPhysicalResist = 4;
			gypsum.ArmorFireResist = 4;
			gypsum.ArmorColdResist = 4;
			gypsum.ArmorPoisonResist = 1;
			gypsum.ArmorEnergyResist = 4;
			gypsum.ArmorDurability = 50;
			gypsum.ArmorLuck = 20;
			gypsum.ArmorLowerRequirements = 0;
			gypsum.WeaponFireDamage = 20;
			gypsum.WeaponColdDamage = 20;
			gypsum.WeaponPoisonDamage = 0;
			gypsum.WeaponEnergyDamage = 20;
			gypsum.WeaponDurability = 50;
			gypsum.WeaponLuck = 20;
			gypsum.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo platinum = Platinum = new CraftAttributeInfo();

			platinum.ArmorPhysicalResist = 0;
			platinum.ArmorFireResist = 1;
			platinum.ArmorColdResist = 3;
			platinum.ArmorPoisonResist = 4;
			platinum.ArmorEnergyResist = -10;
			platinum.ArmorDurability = 30;
			platinum.ArmorLuck = 100;
			platinum.ArmorLowerRequirements = 00;
			platinum.WeaponFireDamage = 0;
			platinum.WeaponColdDamage = 0;
			platinum.WeaponPoisonDamage = 0;
			platinum.WeaponEnergyDamage = 0;
			platinum.WeaponDurability = 30;
			platinum.WeaponLuck = 100;
			platinum.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo silverRock = SilverRock = new CraftAttributeInfo();

			silverRock.ArmorPhysicalResist = 3;
			silverRock.ArmorFireResist = 1;
			silverRock.ArmorColdResist = 2;
			silverRock.ArmorPoisonResist = 10;
			silverRock.ArmorEnergyResist = 0;
			silverRock.ArmorDurability = 50;
			silverRock.ArmorLuck = 0;
			silverRock.ArmorLowerRequirements = 0;
			silverRock.WeaponFireDamage = 0;
			silverRock.WeaponColdDamage = 0;
			silverRock.WeaponPoisonDamage = 0;
			silverRock.WeaponEnergyDamage = 0;
			silverRock.WeaponDurability = 50;
			silverRock.WeaponLuck = 0;
			silverRock.WeaponLowerRequirements = 0;
			silverRock.WeaponSlayer = SlayerName.Silver;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo darkPagan = DarkPagan = new CraftAttributeInfo();

			darkPagan.ArmorPhysicalResist = 4;
			darkPagan.ArmorFireResist = 4;
			darkPagan.ArmorColdResist = 4;
			darkPagan.ArmorPoisonResist = 3;
			darkPagan.ArmorEnergyResist = 4;
			darkPagan.ArmorDurability = 100;
			darkPagan.ArmorLuck = 0;
			darkPagan.ArmorLowerRequirements = 0;
			darkPagan.WeaponFireDamage = 10;
			darkPagan.WeaponColdDamage = 10;
			darkPagan.WeaponPoisonDamage = 10;
			darkPagan.WeaponEnergyDamage = 10;
			darkPagan.WeaponDurability = 100;
			darkPagan.WeaponLuck = 0;
			darkPagan.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo mystic = Mystic = new CraftAttributeInfo();

			mystic.ArmorPhysicalResist = 1;
			mystic.ArmorFireResist = 5;
			mystic.ArmorColdResist = 5;
			mystic.ArmorPoisonResist = 5;
			mystic.ArmorEnergyResist = 5;
			mystic.ArmorDurability = 100;
			mystic.ArmorLuck = 0;
			mystic.ArmorLowerRequirements = 0;
			mystic.WeaponFireDamage = 25;
			mystic.WeaponColdDamage = 25;
			mystic.WeaponPoisonDamage = 25;
			mystic.WeaponEnergyDamage = 25;
			mystic.WeaponDurability = 100;
			mystic.WeaponLuck = 0;
			mystic.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo spectral = Spectral = new CraftAttributeInfo();

			spectral.ArmorPhysicalResist = 3;
			spectral.ArmorFireResist = 3;
			spectral.ArmorColdResist = 3;
			spectral.ArmorPoisonResist = 3;
			spectral.ArmorEnergyResist = 3;
			spectral.ArmorDurability = 40;
			spectral.ArmorLuck = 0;
			spectral.ArmorLowerRequirements = 0;
			spectral.WeaponFireDamage = 0;
			spectral.WeaponColdDamage = 0;
			spectral.WeaponPoisonDamage = 0;
			spectral.WeaponEnergyDamage = 0;
			spectral.WeaponDurability = 40;
			spectral.WeaponLuck = 0;
			spectral.WeaponLowerRequirements = 0;
	////////////SSI 10%
	////////////REDUCE DEX PEN BY 3
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo oldBritain = OldBritain = new CraftAttributeInfo();

			oldBritain.ArmorPhysicalResist = 5;
			oldBritain.ArmorFireResist = 5;
			oldBritain.ArmorColdResist = 5;
			oldBritain.ArmorPoisonResist = 5;
			oldBritain.ArmorEnergyResist = 5;
			oldBritain.ArmorDurability = 100;
			oldBritain.ArmorLuck = 0;
			oldBritain.ArmorLowerRequirements = 0;
			oldBritain.WeaponFireDamage = 0;
			oldBritain.WeaponColdDamage = 0;
			oldBritain.WeaponPoisonDamage = 0;
			oldBritain.WeaponEnergyDamage = 0;
			oldBritain.WeaponDurability = 100;
			oldBritain.WeaponLuck = 0;
			oldBritain.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo onyx = Onyx = new CraftAttributeInfo();

			onyx.ArmorPhysicalResist = 5;
			onyx.ArmorFireResist = 4;
			onyx.ArmorColdResist = 4;
			onyx.ArmorPoisonResist = 4;
			onyx.ArmorEnergyResist = 4;
			onyx.ArmorDurability = 100;
			onyx.ArmorLuck = 0;
			onyx.ArmorLowerRequirements = 0;
			onyx.WeaponFireDamage = 0;
			onyx.WeaponColdDamage = 0;
			onyx.WeaponPoisonDamage = 0;
			onyx.WeaponEnergyDamage = 0;
			onyx.WeaponDurability = 100;
			onyx.WeaponLuck = 0;
			onyx.WeaponLowerRequirements = 0;
	////////////SSI 5%
	////////////REDUCE DEX PEN BY 1
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo redElven = RedElven = new CraftAttributeInfo();

			redElven.ArmorPhysicalResist = 3;
			redElven.ArmorFireResist = 6;
			redElven.ArmorColdResist = 6;
			redElven.ArmorPoisonResist = 6;
			redElven.ArmorEnergyResist = 6;
			redElven.ArmorDurability = 150;
			redElven.ArmorLuck = 0;
			redElven.ArmorLowerRequirements = 0;
			redElven.WeaponFireDamage = 10;
			redElven.WeaponColdDamage = 10;
			redElven.WeaponPoisonDamage = 10;
			redElven.WeaponEnergyDamage = 10;
			redElven.WeaponDurability = 150;
			redElven.WeaponLuck = 0;
			redElven.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo undead = Undead = new CraftAttributeInfo();

			undead.ArmorPhysicalResist = 3;
			undead.ArmorFireResist = -5;
			undead.ArmorColdResist = 8;
			undead.ArmorPoisonResist = 10;
			undead.ArmorEnergyResist = 2;
			undead.ArmorDurability = 100;
			undead.ArmorLuck = 0;
			undead.ArmorLowerRequirements = 0;
			undead.WeaponFireDamage = 0;
			undead.WeaponColdDamage = 50;
			undead.WeaponPoisonDamage = 50;
			undead.WeaponEnergyDamage = 0;
			undead.WeaponDurability = 100;
			undead.WeaponLuck = 0;
			undead.WeaponLowerRequirements = 0;
	////////////50% Necro protection
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo pyrite = Pyrite = new CraftAttributeInfo();

			pyrite.ArmorPhysicalResist = 6;
			pyrite.ArmorFireResist = 5;
			pyrite.ArmorColdResist = 3;
			pyrite.ArmorPoisonResist = 3;
			pyrite.ArmorEnergyResist = 5;
			pyrite.ArmorDurability = 100;
			pyrite.ArmorLuck = -25;
			pyrite.ArmorLowerRequirements = 0;
			pyrite.WeaponFireDamage = 0;
			pyrite.WeaponColdDamage = 0;
			pyrite.WeaponPoisonDamage = 0;
			pyrite.WeaponEnergyDamage = 0;
			pyrite.WeaponDurability = 100;
			pyrite.WeaponLuck = -25;
			pyrite.WeaponLowerRequirements = 0;
	////////////SSI 5%
	////////////REDUCE DEX PEN BY 1
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo virginity = Virginity = new CraftAttributeInfo();

			virginity.ArmorPhysicalResist = 5;
			virginity.ArmorFireResist = 4;
			virginity.ArmorColdResist = 4;
			virginity.ArmorPoisonResist = 4;
			virginity.ArmorEnergyResist = 4;
			virginity.ArmorDurability = 100;
			virginity.ArmorLuck = 0;
			virginity.ArmorLowerRequirements = 00;
			virginity.WeaponFireDamage = 0;
			virginity.WeaponColdDamage = 0;
			virginity.WeaponPoisonDamage = 0;
			virginity.WeaponEnergyDamage = 0;
			virginity.WeaponDurability = 100;
			virginity.WeaponLuck = 0;
			virginity.WeaponLowerRequirements = 0;
	////////////50% Necro protection
	////////////SSI 5%
	////////////REDUCE DEX PEN BY 1
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo malachite = Malachite = new CraftAttributeInfo();

			malachite.ArmorPhysicalResist = 6;
			malachite.ArmorFireResist = 6;
			malachite.ArmorColdResist = 6;
			malachite.ArmorPoisonResist = 6;
			malachite.ArmorEnergyResist = 6;
			malachite.ArmorDurability = 100;
			malachite.ArmorLuck = 0;
			malachite.ArmorLowerRequirements = 0;
			malachite.WeaponFireDamage = 10;
			malachite.WeaponColdDamage = 10;
			malachite.WeaponPoisonDamage = 10;
			malachite.WeaponEnergyDamage = 10;
			malachite.WeaponDurability = 100;
			malachite.WeaponLuck = 0;
			malachite.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo lavaRock = LavaRock = new CraftAttributeInfo();

			lavaRock.ArmorPhysicalResist = 5;
			lavaRock.ArmorFireResist = 10;
			lavaRock.ArmorColdResist = -10;
			lavaRock.ArmorPoisonResist = 0;
			lavaRock.ArmorEnergyResist = 0;
			lavaRock.ArmorDurability = 00;
			lavaRock.ArmorLuck = 00;
			lavaRock.ArmorLowerRequirements = 00;
			lavaRock.WeaponFireDamage = 00;
			lavaRock.WeaponColdDamage = 00;
			lavaRock.WeaponPoisonDamage = 00;
			lavaRock.WeaponEnergyDamage = 00;
			lavaRock.WeaponDurability = 00;
			lavaRock.WeaponLuck = 00;
			lavaRock.WeaponLowerRequirements = 00;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo azurite = Azurite = new CraftAttributeInfo();

			azurite.ArmorPhysicalResist = 6;
			azurite.ArmorFireResist = 6;
			azurite.ArmorColdResist = 6;
			azurite.ArmorPoisonResist = 6;
			azurite.ArmorEnergyResist = 6;
			azurite.ArmorDurability = 100;
			azurite.ArmorLuck = 0;
			azurite.ArmorLowerRequirements = 0;
			azurite.WeaponFireDamage = 10;
			azurite.WeaponColdDamage = 10;
			azurite.WeaponPoisonDamage = 10;
			azurite.WeaponEnergyDamage = 10;
			azurite.WeaponDurability = 100;
			azurite.WeaponLuck = 0;
			azurite.WeaponLowerRequirements = 0;
	////////////SSI 5%
	////////////REDUCE DEX PEN BY 1
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo dripstone = Dripstone = new CraftAttributeInfo();

			dripstone.ArmorPhysicalResist = 4;
			dripstone.ArmorFireResist = 8;
			dripstone.ArmorColdResist = 8;
			dripstone.ArmorPoisonResist = 8;
			dripstone.ArmorEnergyResist = 8;
			dripstone.ArmorDurability = 100;
			dripstone.ArmorLuck = 0;
			dripstone.ArmorLowerRequirements = 0;
			dripstone.WeaponFireDamage = 20;
			dripstone.WeaponColdDamage = 20;
			dripstone.WeaponPoisonDamage = 20;
			dripstone.WeaponEnergyDamage = 20;
			dripstone.WeaponDurability = 100;
			dripstone.WeaponLuck = 0;
			dripstone.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo executor = Executor = new CraftAttributeInfo();

			executor.ArmorPhysicalResist = 5;
			executor.ArmorFireResist = 8;
			executor.ArmorColdResist = 8;
			executor.ArmorPoisonResist = 8;
			executor.ArmorEnergyResist = 8;
			executor.ArmorDurability = 100;
			executor.ArmorLuck = 0;
			executor.ArmorLowerRequirements = 0;
			executor.WeaponFireDamage = 10;
			executor.WeaponColdDamage = 10;
			executor.WeaponPoisonDamage = 10;
			executor.WeaponEnergyDamage = 10;
			executor.WeaponDurability = 100;
			executor.WeaponLuck = 0;
			executor.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo peachblue = Peachblue = new CraftAttributeInfo();

			peachblue.ArmorPhysicalResist = 7;
			peachblue.ArmorFireResist = 7;
			peachblue.ArmorColdResist = 7;
			peachblue.ArmorPoisonResist = 7;
			peachblue.ArmorEnergyResist = 7;
			peachblue.ArmorDurability = 100;
			peachblue.ArmorLuck = 0;
			peachblue.ArmorLowerRequirements = 0;
			peachblue.WeaponFireDamage = 0;
			peachblue.WeaponColdDamage = 0;
			peachblue.WeaponPoisonDamage = 0;
			peachblue.WeaponEnergyDamage = 0;
			peachblue.WeaponDurability = 100;
			peachblue.WeaponLuck = 0;
			peachblue.WeaponLowerRequirements = 0;
	////////////SSI 10%
	////////////REDUCE DEX PEN BY 2
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo destruction = Destruction = new CraftAttributeInfo();

			destruction.ArmorPhysicalResist = 7;
			destruction.ArmorFireResist = 7;
			destruction.ArmorColdResist = 7;
			destruction.ArmorPoisonResist = 7;
			destruction.ArmorEnergyResist = 9;
			destruction.ArmorDurability = 200;
			destruction.ArmorLuck = 0;
			destruction.ArmorLowerRequirements = 0;
			destruction.WeaponFireDamage = 10;
			destruction.WeaponColdDamage = 10;
			destruction.WeaponPoisonDamage = 10;
			destruction.WeaponEnergyDamage = 10;
			destruction.WeaponDurability = 200;
			destruction.WeaponLuck = 0;
			destruction.WeaponLowerRequirements = 0;
	////////////SSI 5%
	////////////REDUCE DEX PEN BY 1
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo anra = Anra = new CraftAttributeInfo();

			anra.ArmorPhysicalResist = 8;
			anra.ArmorFireResist = 8;
			anra.ArmorColdResist = 8;
			anra.ArmorPoisonResist = 8;
			anra.ArmorEnergyResist = 8;
			anra.ArmorDurability = 100;
			anra.ArmorLuck = 0;
			anra.ArmorLowerRequirements = 0;
			anra.WeaponFireDamage = 10;
			anra.WeaponColdDamage = 10;
			anra.WeaponPoisonDamage = 10;
			anra.WeaponEnergyDamage = 10;
			anra.WeaponDurability = 100;
			anra.WeaponLuck = 0;
			anra.WeaponLowerRequirements = 0;
	////////////SSI 10%
	////////////REDUCE DEX PEN BY 2
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo crystal = Crystal = new CraftAttributeInfo();

			crystal.ArmorPhysicalResist = 6;
			crystal.ArmorFireResist = 9;
			crystal.ArmorColdResist = 9;
			crystal.ArmorPoisonResist = 9;
			crystal.ArmorEnergyResist = 9;
			crystal.ArmorDurability = 100;
			crystal.ArmorLuck = 0;
			crystal.ArmorLowerRequirements = 0;
			crystal.WeaponFireDamage = 20;
			crystal.WeaponColdDamage = 20;
			crystal.WeaponPoisonDamage = 20;
			crystal.WeaponEnergyDamage = 20;
			crystal.WeaponDurability = 100;
			crystal.WeaponLuck = 0;
			crystal.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo doom = Doom = new CraftAttributeInfo();

			doom.ArmorPhysicalResist = 9;
			doom.ArmorFireResist = 9;
			doom.ArmorColdResist = 9;
			doom.ArmorPoisonResist = 9;
			doom.ArmorEnergyResist = 9;
			doom.ArmorDurability = 100;
			doom.ArmorLuck = 0;
			doom.ArmorLowerRequirements = 0;
			doom.WeaponFireDamage = 0;
			doom.WeaponColdDamage = 0;
			doom.WeaponPoisonDamage = 0;
			doom.WeaponEnergyDamage = 0;
			doom.WeaponDurability = 100;
			doom.WeaponLuck = 0;
			doom.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo goddess = Goddess = new CraftAttributeInfo();

			goddess.ArmorPhysicalResist = 8;
			goddess.ArmorFireResist = 10;
			goddess.ArmorColdResist = 10;
			goddess.ArmorPoisonResist = 10;
			goddess.ArmorEnergyResist = 10;
			goddess.ArmorDurability = 100;
			goddess.ArmorLuck = 0;
			goddess.ArmorLowerRequirements = 0;
			goddess.WeaponFireDamage = 10;
			goddess.WeaponColdDamage = 10;
			goddess.WeaponPoisonDamage = 0;
			goddess.WeaponEnergyDamage = 10;
			goddess.WeaponDurability = 100;
			goddess.WeaponLuck = 0;
			goddess.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo newCarpathia = NewCarpathia = new CraftAttributeInfo();

			newCarpathia.ArmorPhysicalResist = 10;
			newCarpathia.ArmorFireResist = 10;
			newCarpathia.ArmorColdResist = 10;
			newCarpathia.ArmorPoisonResist = 10;
			newCarpathia.ArmorEnergyResist = 10;
			newCarpathia.ArmorDurability = 100;
			newCarpathia.ArmorLuck = 0;
			newCarpathia.ArmorLowerRequirements = 0;
			newCarpathia.WeaponFireDamage = 20;
			newCarpathia.WeaponColdDamage = 20;
			newCarpathia.WeaponPoisonDamage = 20;
			newCarpathia.WeaponEnergyDamage = 20;
			newCarpathia.WeaponDurability = 100;
			newCarpathia.WeaponLuck = 0;
			newCarpathia.WeaponLowerRequirements = 0;
	////////////SSI 10%
	////////////REDUCE DEX PEN BY 2
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;

			CraftAttributeInfo spined = Spined = new CraftAttributeInfo();

			spined.ArmorPhysicalResist = 5;
			spined.ArmorLuck = 40;
			spined.RunicMinAttributes = 1;
			spined.RunicMaxAttributes = 3;
			spined.RunicMinIntensity = 20;
			spined.RunicMaxIntensity = 40;

			CraftAttributeInfo horned = Horned = new CraftAttributeInfo();

			horned.ArmorPhysicalResist = 2;
			horned.ArmorFireResist = 3;
			horned.ArmorColdResist = 2;
			horned.ArmorPoisonResist = 2;
			horned.ArmorEnergyResist = 2;
			horned.RunicMinAttributes = 3;
			horned.RunicMaxAttributes = 4;
			horned.RunicMinIntensity = 30;
			horned.RunicMaxIntensity = 70;

			CraftAttributeInfo barbed = Barbed = new CraftAttributeInfo();

			barbed.ArmorPhysicalResist = 2;
			barbed.ArmorFireResist = 1;
			barbed.ArmorColdResist = 2;
			barbed.ArmorPoisonResist = 3;
			barbed.ArmorEnergyResist = 4;
			barbed.RunicMinAttributes = 4;
			barbed.RunicMaxAttributes = 5;
			barbed.RunicMinIntensity = 40;
			barbed.RunicMaxIntensity = 100;

			CraftAttributeInfo red = RedScales = new CraftAttributeInfo();

			red.ArmorFireResist = 10;
			red.ArmorColdResist = -3;

			CraftAttributeInfo yellow = YellowScales = new CraftAttributeInfo();

			yellow.ArmorPhysicalResist = -3;
			yellow.ArmorLuck = 20;

			CraftAttributeInfo black = BlackScales = new CraftAttributeInfo();

			black.ArmorPhysicalResist = 10;
			black.ArmorEnergyResist = -3;

			CraftAttributeInfo green = GreenScales = new CraftAttributeInfo();

			green.ArmorFireResist = -3;
			green.ArmorPoisonResist = 10;

			CraftAttributeInfo white = WhiteScales = new CraftAttributeInfo();

			white.ArmorPhysicalResist = -3;
			white.ArmorColdResist = 10;

			CraftAttributeInfo blue = BlueScales = new CraftAttributeInfo();

			blue.ArmorPoisonResist = -3;
			blue.ArmorEnergyResist = 10;
		}
	}

	public class CraftResourceInfo
	{
		private int m_Hue;
		private int m_Number;
		private string m_Name;
		private CraftAttributeInfo m_AttributeInfo;
		private CraftResource m_Resource;
		private Type[] m_ResourceTypes;

		public int Hue{ get{ return m_Hue; } }
		public int Number{ get{ return m_Number; } }
		public string Name{ get{ return m_Name; } }
		public CraftAttributeInfo AttributeInfo{ get{ return m_AttributeInfo; } }
		public CraftResource Resource{ get{ return m_Resource; } }
		public Type[] ResourceTypes{ get{ return m_ResourceTypes; } }

		public CraftResourceInfo( int hue, int number, string name, CraftAttributeInfo attributeInfo, CraftResource resource, params Type[] resourceTypes )
		{
			m_Hue = hue;
			m_Number = number;
			m_Name = name;
			m_AttributeInfo = attributeInfo;
			m_Resource = resource;
			m_ResourceTypes = resourceTypes;

			for ( int i = 0; i < resourceTypes.Length; ++i )
				CraftResources.RegisterType( resourceTypes[i], resource );
		}
	}

	public class CraftResources
	{
		private static CraftResourceInfo[] m_MetalInfo = new CraftResourceInfo[]
			{
									// hue    number   name             attributeInfo                   resource                        resourceTypes
				new CraftResourceInfo( 0x000, 1053109, "Iron",			CraftAttributeInfo.Blank,		CraftResource.Iron,				typeof( IronIngot ),		typeof( IronOre ),			typeof( Granite ) ),
				new CraftResourceInfo( 0x973, 1053108, "Dull Copper",	CraftAttributeInfo.DullCopper,	CraftResource.DullCopper,		typeof( DullCopperIngot ),	typeof( DullCopperOre ),	typeof( DullCopperGranite ) ),
				new CraftResourceInfo( 0x966, 1053107, "Shadow Iron",	CraftAttributeInfo.ShadowIron,	CraftResource.ShadowIron,		typeof( ShadowIronIngot ),	typeof( ShadowIronOre ),	typeof( ShadowIronGranite ) ),
				new CraftResourceInfo( 0x96D, 1053106, "Copper",		CraftAttributeInfo.Copper,		CraftResource.Copper,			typeof( CopperIngot ),		typeof( CopperOre ),		typeof( CopperGranite ) ),
				new CraftResourceInfo( 0x972, 1053105, "Bronze",		CraftAttributeInfo.Bronze,		CraftResource.Bronze,			typeof( BronzeIngot ),		typeof( BronzeOre ),		typeof( BronzeGranite ) ),
				new CraftResourceInfo( 0x8A5, 1053104, "Gold",			CraftAttributeInfo.Golden,		CraftResource.Gold,				typeof( GoldIngot ),		typeof( GoldOre ),			typeof( GoldGranite ) ),
				new CraftResourceInfo( 0x979, 1053103, "Agapite",		CraftAttributeInfo.Agapite,		CraftResource.Agapite,			typeof( AgapiteIngot ),		typeof( AgapiteOre ),		typeof( AgapiteGranite ) ),
				new CraftResourceInfo( 0x89F, 1053102, "Verite",		CraftAttributeInfo.Verite,		CraftResource.Verite,			typeof( VeriteIngot ),		typeof( VeriteOre ),		typeof( VeriteGranite ) ),
				new CraftResourceInfo( 0x8AB, 1053101, "Valorite",		CraftAttributeInfo.Valorite,	CraftResource.Valorite,			typeof( ValoriteIngot ),	typeof( ValoriteOre ),		typeof( ValoriteGranite ) ),
				new CraftResourceInfo( 639, 		0, "Spike",			CraftAttributeInfo.Spike,		CraftResource.Spike,			typeof( SpikeIngot ),		typeof( SpikeOre ) ),
				new CraftResourceInfo( 1266, 		0, "Ice Rock",		CraftAttributeInfo.IceRock,		CraftResource.IceRock,			typeof( IceRockIngot ),		typeof( IceRockOre ) ),
				new CraftResourceInfo( 1149, 		0, "Gypsum",		CraftAttributeInfo.Gypsum,		CraftResource.Gypsum,			typeof( GypsumIngot ),		typeof( GypsumOre ) ),
				new CraftResourceInfo( 961, 		0, "Platinum",		CraftAttributeInfo.Platinum,	CraftResource.Platinum,			typeof( PlatinumIngot ),	typeof( PlatinumOre ) ),
				new CraftResourceInfo( 1154, 		0, "Silver Rock",	CraftAttributeInfo.SilverRock,	CraftResource.SilverRock,		typeof( SilverRockIngot ),	typeof( SilverRockOre ) ),
				new CraftResourceInfo( 545, 		0, "Dark Pagan",	CraftAttributeInfo.DarkPagan,	CraftResource.DarkPagan,		typeof( DarkPaganIngot ),	typeof( DarkPaganOre ) ),
				new CraftResourceInfo( 1151, 		0, "Mystic",		CraftAttributeInfo.Mystic,		CraftResource.Mystic,			typeof( MysticIngot ),		typeof( MysticOre ) ),
				new CraftResourceInfo( 1284, 		0, "Spectral",		CraftAttributeInfo.Spectral,	CraftResource.Spectral,			typeof( SpectralIngot ),	typeof( SpectralOre ) ),
				new CraftResourceInfo( 843, 		0, "Old Britain",	CraftAttributeInfo.OldBritain,	CraftResource.OldBritain,		typeof( OldBritainIngot ),	typeof( OldBritainOre ) ),
				new CraftResourceInfo( 1175, 		0, "Onyx",			CraftAttributeInfo.Onyx,		CraftResource.Onyx,				typeof( OnyxIngot ),		typeof( OnyxOre ) ),
				new CraftResourceInfo( 337, 		0, "Red Elven",		CraftAttributeInfo.RedElven,	CraftResource.RedElven,			typeof( RedElvenIngot ),	typeof( RedElvenOre ) ),
				new CraftResourceInfo( 666, 		0, "Undead",		CraftAttributeInfo.Undead,		CraftResource.Undead,			typeof( UndeadIngot ),		typeof( UndeadOre ) ),
				new CraftResourceInfo( 2213, 		0, "Pyrite",		CraftAttributeInfo.Pyrite,		CraftResource.Pyrite,			typeof( PyriteIngot ),		typeof( PyriteOre ) ),
				new CraftResourceInfo( 1153, 		0, "Virginity",		CraftAttributeInfo.Virginity,	CraftResource.Virginity,		typeof( VirginityIngot ),	typeof( VirginityOre ) ),
				new CraftResourceInfo( 667, 		0, "Malachite",		CraftAttributeInfo.Malachite,	CraftResource.Malachite,		typeof( MalachiteIngot ),	typeof( MalachiteOre ) ),
				new CraftResourceInfo( 1172, 		0, "Lava Rock",		CraftAttributeInfo.LavaRock,	CraftResource.LavaRock,			typeof( LavaRockIngot ),	typeof( LavaRockOre ) ),
				new CraftResourceInfo( 403, 		0, "Azurite",		CraftAttributeInfo.Azurite,		CraftResource.Azurite,			typeof( AzuriteIngot ),		typeof( AzuriteOre ) ),
				new CraftResourceInfo( 711, 		0, "Dripstone",		CraftAttributeInfo.Dripstone,	CraftResource.Dripstone,		typeof( DripStoneIngot ),	typeof( DripStoneOre ) ),
				new CraftResourceInfo( 988, 		0, "Executor",		CraftAttributeInfo.Executor,	CraftResource.Executor,			typeof( ExecutorIngot ),	typeof( ExecutorOre ) ),
				new CraftResourceInfo( 185, 		0, "Peachblue",		CraftAttributeInfo.Peachblue,	CraftResource.Peachblue,		typeof( PeachblueIngot ),	typeof( PeachblueOre ) ),
				new CraftResourceInfo( 1267, 		0, "Destruction",	CraftAttributeInfo.Destruction,	CraftResource.Destruction,		typeof( DestructionIngot ),	typeof( DestructionOre ) ),
				new CraftResourceInfo( 730, 		0, "Anra",			CraftAttributeInfo.Anra,		CraftResource.Anra,				typeof( AnraIngot ),		typeof( AnraOre ) ),
				new CraftResourceInfo( 91, 			0, "Crystal",		CraftAttributeInfo.Crystal,		CraftResource.Crystal,			typeof( CrystalIngot ),		typeof( CrystalOre ) ),
				new CraftResourceInfo( 60, 			0, "Doom",			CraftAttributeInfo.Doom,		CraftResource.Doom,				typeof( DoomIngot ),		typeof( DoomOre ) ),
				new CraftResourceInfo( 1167, 		0, "Goddess",		CraftAttributeInfo.Goddess,		CraftResource.Goddess,			typeof( GoddessIngot ),		typeof( GoddessOre ) ),
				new CraftResourceInfo( 1169, 		0, "New Carpathia",	CraftAttributeInfo.NewCarpathia,CraftResource.NewCarpathia,		typeof( NewCarpathiaIngot ),typeof( NewCarpathiaOre ) )
		};

		private static CraftResourceInfo[] m_ScaleInfo = new CraftResourceInfo[]
			{
				new CraftResourceInfo( 0x66D, 1053129, "Red Scales",	CraftAttributeInfo.RedScales,		CraftResource.RedScales,		typeof( RedScales ) ),
				new CraftResourceInfo( 0x8A8, 1053130, "Yellow Scales",	CraftAttributeInfo.YellowScales,	CraftResource.YellowScales,		typeof( YellowScales ) ),
				new CraftResourceInfo( 0x455, 1053131, "Black Scales",	CraftAttributeInfo.BlackScales,		CraftResource.BlackScales,		typeof( BlackScales ) ),
				new CraftResourceInfo( 0x851, 1053132, "Green Scales",	CraftAttributeInfo.GreenScales,		CraftResource.GreenScales,		typeof( GreenScales ) ),
				new CraftResourceInfo( 0x8FD, 1053133, "White Scales",	CraftAttributeInfo.WhiteScales,		CraftResource.WhiteScales,		typeof( WhiteScales ) ),
				new CraftResourceInfo( 0x8B0, 1053134, "Blue Scales",	CraftAttributeInfo.BlueScales,		CraftResource.BlueScales,		typeof( BlueScales ) )
			};

		private static CraftResourceInfo[] m_LeatherInfo = new CraftResourceInfo[]
			{
				new CraftResourceInfo( 0x000, 1049353, "Normal",		CraftAttributeInfo.Blank,		CraftResource.RegularLeather,	typeof( Leather ),			typeof( Hides ) ),
				new CraftResourceInfo( 0x283, 1049354, "Spined",		CraftAttributeInfo.Spined,		CraftResource.SpinedLeather,	typeof( SpinedLeather ),	typeof( SpinedHides ) ),
				new CraftResourceInfo( 0x227, 1049355, "Horned",		CraftAttributeInfo.Horned,		CraftResource.HornedLeather,	typeof( HornedLeather ),	typeof( HornedHides ) ),
				new CraftResourceInfo( 0x1C1, 1049356, "Barbed",		CraftAttributeInfo.Barbed,		CraftResource.BarbedLeather,	typeof( BarbedLeather ),	typeof( BarbedHides ) )
		};

		private static CraftResourceInfo[] m_AOSLeatherInfo = new CraftResourceInfo[]
			{
				new CraftResourceInfo( 0x000, 1049353, "Normal",		CraftAttributeInfo.Blank,		CraftResource.RegularLeather,	typeof( Leather ),			typeof( Hides ) ),
				new CraftResourceInfo( 0x8AC, 1049354, "Spined",		CraftAttributeInfo.Spined,		CraftResource.SpinedLeather,	typeof( SpinedLeather ),	typeof( SpinedHides ) ),
				new CraftResourceInfo( 0x845, 1049355, "Horned",		CraftAttributeInfo.Horned,		CraftResource.HornedLeather,	typeof( HornedLeather ),	typeof( HornedHides ) ),
				new CraftResourceInfo( 0x851, 1049356, "Barbed",		CraftAttributeInfo.Barbed,		CraftResource.BarbedLeather,	typeof( BarbedLeather ),	typeof( BarbedHides ) ),
		};

		/// <summary>
		/// Returns true if '<paramref name="resource"/>' is None, Iron, or RegularLeather. False if otherwise.
		/// </summary>
		public static bool IsStandard( CraftResource resource )
		{
			return ( resource == CraftResource.None || resource == CraftResource.Iron || resource == CraftResource.RegularLeather );
		}

		private static Hashtable m_TypeTable;

		/// <summary>
		/// Registers that '<paramref name="resourceType"/>' uses '<paramref name="resource"/>' so that it can later be queried by <see cref="CraftResources.GetFromType"/>
		/// </summary>
		public static void RegisterType( Type resourceType, CraftResource resource )
		{
			if ( m_TypeTable == null )
				m_TypeTable = new Hashtable();

			m_TypeTable[resourceType] = resource;
		}

		/// <summary>
		/// Returns the <see cref="CraftResource"/> value for which '<paramref name="resourceType"/>' uses -or- CraftResource.None if an unregistered type was specified.
		/// </summary>
		public static CraftResource GetFromType( Type resourceType )
		{
			if ( m_TypeTable == null )
				return CraftResource.None;

			object obj = m_TypeTable[resourceType];

			if ( !(obj is CraftResource) )
				return CraftResource.None;

			return (CraftResource)obj;
		}

		/// <summary>
		/// Returns a <see cref="CraftResourceInfo"/> instance describing '<paramref name="resource"/>' -or- null if an invalid resource was specified.
		/// </summary>
		public static CraftResourceInfo GetInfo( CraftResource resource )
		{
			CraftResourceInfo[] list = null;

			switch ( GetType( resource ) )
			{
				case CraftResourceType.Metal: list = m_MetalInfo; break;
				case CraftResourceType.Leather: list = Core.AOS ? m_AOSLeatherInfo : m_LeatherInfo; break;
				case CraftResourceType.Scales: list = m_ScaleInfo; break;
			}

			if ( list != null )
			{
				int index = GetIndex( resource );

				if ( index >= 0 && index < list.Length )
					return list[index];
			}

			return null;
		}

		/// <summary>
		/// Returns a <see cref="CraftResourceType"/> value indiciating the type of '<paramref name="resource"/>'.
		/// </summary>
		public static CraftResourceType GetType( CraftResource resource )
		{
			if ( resource >= CraftResource.Iron && resource <= CraftResource.Valorite )
				return CraftResourceType.Metal;

			if ( resource >= CraftResource.RegularLeather && resource <= CraftResource.BarbedLeather )
				return CraftResourceType.Leather;

			if ( resource >= CraftResource.RedScales && resource <= CraftResource.BlueScales )
				return CraftResourceType.Scales;

			return CraftResourceType.None;
		}

		/// <summary>
		/// Returns the first <see cref="CraftResource"/> in the series of resources for which '<paramref name="resource"/>' belongs.
		/// </summary>
		public static CraftResource GetStart( CraftResource resource )
		{
			switch ( GetType( resource ) )
			{
				case CraftResourceType.Metal: return CraftResource.Iron;
				case CraftResourceType.Leather: return CraftResource.RegularLeather;
				case CraftResourceType.Scales: return CraftResource.RedScales;
			}

			return CraftResource.None;
		}

		/// <summary>
		/// Returns the index of '<paramref name="resource"/>' in the seriest of resources for which it belongs.
		/// </summary>
		public static int GetIndex( CraftResource resource )
		{
			CraftResource start = GetStart( resource );

			if ( start == CraftResource.None )
				return 0;

			return (int)(resource - start);
		}

		/// <summary>
		/// Returns the <see cref="CraftResourceInfo.Number"/> property of '<paramref name="resource"/>' -or- 0 if an invalid resource was specified.
		/// </summary>
		public static int GetLocalizationNumber( CraftResource resource )
		{
			CraftResourceInfo info = GetInfo( resource );

			return ( info == null ? 0 : info.Number );
		}

		/// <summary>
		/// Returns the <see cref="CraftResourceInfo.Hue"/> property of '<paramref name="resource"/>' -or- 0 if an invalid resource was specified.
		/// </summary>
		public static int GetHue( CraftResource resource )
		{
			CraftResourceInfo info = GetInfo( resource );

			return ( info == null ? 0 : info.Hue );
		}

		/// <summary>
		/// Returns the <see cref="CraftResourceInfo.Name"/> property of '<paramref name="resource"/>' -or- an empty string if the resource specified was invalid.
		/// </summary>
		public static string GetName( CraftResource resource )
		{
			CraftResourceInfo info = GetInfo( resource );

			return ( info == null ? String.Empty : info.Name );
		}

		/// <summary>
		/// Returns the <see cref="CraftResource"/> value which represents '<paramref name="info"/>' -or- CraftResource.None if unable to convert.
		/// </summary>
		public static CraftResource GetFromOreInfo( OreInfo info )
		{
			if ( info.Name.IndexOf( "Spined" ) >= 0 )
				return CraftResource.SpinedLeather;
			else if ( info.Name.IndexOf( "Horned" ) >= 0 )
				return CraftResource.HornedLeather;
			else if ( info.Name.IndexOf( "Barbed" ) >= 0 )
				return CraftResource.BarbedLeather;
			else if ( info.Name.IndexOf( "Leather" ) >= 0 )
				return CraftResource.RegularLeather;

			if ( info.Level == 0 )
				return CraftResource.Iron;
			else if ( info.Level == 1 )
				return CraftResource.DullCopper;
			else if ( info.Level == 2 )
				return CraftResource.ShadowIron;
			else if ( info.Level == 3 )
				return CraftResource.Copper;
			else if ( info.Level == 4 )
				return CraftResource.Bronze;
			else if ( info.Level == 5 )
				return CraftResource.Gold;
			else if ( info.Level == 6 )
				return CraftResource.Agapite;
			else if ( info.Level == 7 )
				return CraftResource.Verite;
			else if ( info.Level == 8 )
				return CraftResource.Valorite;
			else if ( info.Level == 9 )
				return CraftResource.Spike;
			else if ( info.Level == 10 )
				return CraftResource.IceRock;
			else if ( info.Level == 11 )
				return CraftResource.Gypsum;
			else if ( info.Level == 12 )
				return CraftResource.Platinum;
			else if ( info.Level == 13 )
				return CraftResource.SilverRock;
			else if ( info.Level == 14 )
				return CraftResource.DarkPagan;
			else if ( info.Level == 15 )
				return CraftResource.Mystic;
			else if ( info.Level == 16 )
				return CraftResource.Spectral;
			else if ( info.Level == 17 )
				return CraftResource.OldBritain;
			else if ( info.Level == 18 )
				return CraftResource.Onyx;
			else if ( info.Level == 19 )
				return CraftResource.RedElven;
			else if ( info.Level == 20 )
				return CraftResource.Undead;
			else if ( info.Level == 21 )
				return CraftResource.Pyrite;
			else if ( info.Level == 22 )
				return CraftResource.Virginity;
			else if ( info.Level == 23 )
				return CraftResource.Malachite;
			else if ( info.Level == 24 )
				return CraftResource.LavaRock;
			else if ( info.Level == 25 )
				return CraftResource.Azurite;
			else if ( info.Level == 26 )
				return CraftResource.Dripstone;
			else if ( info.Level == 27 )
				return CraftResource.Executor;
			else if ( info.Level == 28 )
				return CraftResource.Peachblue;
			else if ( info.Level == 29 )
				return CraftResource.Destruction;
			else if ( info.Level == 30 )
				return CraftResource.Anra;
			else if ( info.Level == 31 )
				return CraftResource.Crystal;
			else if ( info.Level == 32 )
				return CraftResource.Doom;
			else if ( info.Level == 33 )
				return CraftResource.Goddess;
			else if ( info.Level == 34 )
				return CraftResource.NewCarpathia;

			return CraftResource.None;
		}

		/// <summary>
		/// Returns the <see cref="CraftResource"/> value which represents '<paramref name="info"/>', using '<paramref name="material"/>' to help resolve leather OreInfo instances.
		/// </summary>
		public static CraftResource GetFromOreInfo( OreInfo info, ArmorMaterialType material )
		{
			if ( material == ArmorMaterialType.Studded || material == ArmorMaterialType.Leather || material == ArmorMaterialType.Spined ||
				material == ArmorMaterialType.Horned || material == ArmorMaterialType.Barbed )
			{
				if ( info.Level == 0 )
					return CraftResource.RegularLeather;
				else if ( info.Level == 1 )
					return CraftResource.SpinedLeather;
				else if ( info.Level == 2 )
					return CraftResource.HornedLeather;
				else if ( info.Level == 3 )
					return CraftResource.BarbedLeather;

				return CraftResource.None;
			}

			return GetFromOreInfo( info );
		}
	}

	// NOTE: This class is only for compatability with very old RunUO versions.
	// No changes to it should be required for custom resources.
	public class OreInfo
	{
		public static readonly OreInfo Iron			= new OreInfo( 0, 0x000, "Iron" );
		public static readonly OreInfo DullCopper	= new OreInfo( 1, 0x973, "Dull Copper" );
		public static readonly OreInfo ShadowIron	= new OreInfo( 2, 0x966, "Shadow Iron" );
		public static readonly OreInfo Copper		= new OreInfo( 3, 0x96D, "Copper" );
		public static readonly OreInfo Bronze		= new OreInfo( 4, 0x972, "Bronze" );
		public static readonly OreInfo Gold			= new OreInfo( 5, 0x8A5, "Gold" );
		public static readonly OreInfo Agapite		= new OreInfo( 6, 0x979, "Agapite" );
		public static readonly OreInfo Verite		= new OreInfo( 7, 0x89F, "Verite" );
		public static readonly OreInfo Valorite		= new OreInfo( 8, 0x8AB, "Valorite" );
		public static readonly OreInfo Spike		= new OreInfo( 9, 639, "Spike" );
		public static readonly OreInfo IceRock		= new OreInfo( 10, 1266, "Ice Rock" );
		public static readonly OreInfo Gypsum		= new OreInfo( 11, 1149, "Gypsum" );
		public static readonly OreInfo Platinum		= new OreInfo( 12, 961, "Platinum" );
		public static readonly OreInfo SilverRock	= new OreInfo( 13, 1154, "Silver Rock" );
		public static readonly OreInfo DarkPagan	= new OreInfo( 14, 545, "Dark Pagan" );
		public static readonly OreInfo Mystic		= new OreInfo( 15, 1151, "Mystic" );
		public static readonly OreInfo Spectral		= new OreInfo( 16, 1284, "Spectral" );
		public static readonly OreInfo OldBritain	= new OreInfo( 17, 843, "Old Britain" );
		public static readonly OreInfo Onyx			= new OreInfo( 18, 1175, "Onyx" );
		public static readonly OreInfo RedElven		= new OreInfo( 19, 337, "Red Elven" );
		public static readonly OreInfo Undead		= new OreInfo( 20, 666, "Undead" );
		public static readonly OreInfo Pyrite		= new OreInfo( 21, 2213, "Pyrite" );
		public static readonly OreInfo Virginity	= new OreInfo( 22, 1153, "Virginity" );
		public static readonly OreInfo Malachite	= new OreInfo( 23, 667, "Malachite" );
		public static readonly OreInfo LavaRock		= new OreInfo( 24, 1172, "Lava Rock" );
		public static readonly OreInfo Azurite		= new OreInfo( 25, 403, "Azurite" );
		public static readonly OreInfo Dripstone	= new OreInfo( 26, 711, "Dripstone" );
		public static readonly OreInfo Executor		= new OreInfo( 27, 988, "Executor" );
		public static readonly OreInfo Peachblue	= new OreInfo( 28, 185, "Peachblue" );
		public static readonly OreInfo Destruction	= new OreInfo( 29, 1267, "Destruction" );
		public static readonly OreInfo Anra			= new OreInfo( 30, 730, "Anra" );
		public static readonly OreInfo Crystal		= new OreInfo( 31, 91, "Crystal" );
		public static readonly OreInfo Doom			= new OreInfo( 32, 60, "Doom" );
		public static readonly OreInfo Goddess		= new OreInfo( 33, 1167, "Goddess" );
		public static readonly OreInfo NewCarpathia	= new OreInfo( 34, 1169, "New Carpathia" );

		private int m_Level;
		private int m_Hue;
		private string m_Name;

		public OreInfo( int level, int hue, string name )
		{
			m_Level = level;
			m_Hue = hue;
			m_Name = name;
		}

		public int Level
		{
			get
			{
				return m_Level;
			}
		}

		public int Hue
		{
			get
			{
				return m_Hue;
			}
		}

		public string Name
		{
			get
			{
				return m_Name;
			}
		}
	}
}
 

milt

Knight
From the docs:

Code:
([COLOR=blue]ctor[/COLOR]) CraftResourceInfo( [COLOR=blue]int[/COLOR] hue, [COLOR=blue]int[/COLOR] number, [COLOR=blue]string[/COLOR] name, [URL="file:///C:/Documents%20and%20Settings/joshuat/My%20Documents/RunUO-1.0.0/Server.exe/docs/types/CraftAttributeInfo.html"][COLOR=#0000ff]CraftAttributeInfo[/COLOR][/URL] attributeInfo, [URL="file:///C:/Documents%20and%20Settings/joshuat/My%20Documents/RunUO-1.0.0/Server.exe/docs/types/CraftResource.html"][COLOR=#0000ff]CraftResource[/COLOR][/URL] resource, Type[] resourceTypes )

I think the problem may be the zeros, but without all code, etc I can't really help you much
 

milt

Knight
I found this is OreInfo too, did you add your ores in here?

Code:
  public static readonly OreInfo Iron   = new OreInfo( 0, 0x000, "Iron" );
  public static readonly OreInfo DullCopper = new OreInfo( 1, 0x973, "Dull Copper" );
  public static readonly OreInfo ShadowIron = new OreInfo( 2, 0x966, "Shadow Iron" );
  public static readonly OreInfo Copper  = new OreInfo( 3, 0x96D, "Copper" );
  public static readonly OreInfo Bronze  = new OreInfo( 4, 0x972, "Bronze" );
  public static readonly OreInfo Gold   = new OreInfo( 5, 0x8A5, "Gold" );
  public static readonly OreInfo Agapite  = new OreInfo( 6, 0x979, "Agapite" );
  public static readonly OreInfo Verite  = new OreInfo( 7, 0x89F, "Verite" );
  public static readonly OreInfo Valorite  = new OreInfo( 8, 0x8AB, "Valorite" );
 

milt

Knight
nm.... I see your full code now that you added it, and it looks like you did add it there. My guess is that it may be the zeros, but I haven't worked with ores that much.
 

Mr. Friday

Wanderer
I just noticed that I can't craft with the ~_NOTHING~ ingots. I get the message, you do not have sufficient materials. I am fairly sure that there is just a small problem somewhere in here, but I can't seem to find it. Hoping an ore guru like Daat or somebody will know the answer.

Also, the thing making me think that the 0's in the number column aren;t a problem is this code from Daat's OWLTR system's modified OreInfo.cs:

Code:
private static CraftResourceInfo[] m_MetalInfo = new CraftResourceInfo[]
			{
				new CraftResourceInfo( 0x000, 1053109,	"Iron",			CraftAttributeInfo.Blank,		CraftResource.Iron,				typeof( IronIngot ),		typeof( IronOre ),			typeof( Granite ) ),
				new CraftResourceInfo( 0x973, 1053108,	"Dull Copper",	CraftAttributeInfo.DullCopper,	CraftResource.DullCopper,		typeof( DullCopperIngot ),	typeof( DullCopperOre ),	typeof( DullCopperGranite ) ),
				new CraftResourceInfo( 0x966, 1053107,	"Shadow Iron",	CraftAttributeInfo.ShadowIron,	CraftResource.ShadowIron,		typeof( ShadowIronIngot ),	typeof( ShadowIronOre ),	typeof( ShadowIronGranite ) ),
				new CraftResourceInfo( 0x96D, 1053106,	"Copper",		CraftAttributeInfo.Copper,		CraftResource.Copper,			typeof( CopperIngot ),		typeof( CopperOre ),		typeof( CopperGranite ) ),
				new CraftResourceInfo( 0x972, 1053105,	"Bronze",		CraftAttributeInfo.Bronze,		CraftResource.Bronze,			typeof( BronzeIngot ),		typeof( BronzeOre ),		typeof( BronzeGranite ) ),
				new CraftResourceInfo( 0x8A5, 1053104,	"Gold",			CraftAttributeInfo.Golden,		CraftResource.Gold,				typeof( GoldIngot ),		typeof( GoldOre ),			typeof( GoldGranite ) ),
				new CraftResourceInfo( 0x979, 1053103,	"Agapite",		CraftAttributeInfo.Agapite,		CraftResource.Agapite,			typeof( AgapiteIngot ),		typeof( AgapiteOre ),		typeof( AgapiteGranite ) ),
				new CraftResourceInfo( 0x89F, 1053102,	"Verite",		CraftAttributeInfo.Verite,		CraftResource.Verite,			typeof( VeriteIngot ),		typeof( VeriteOre ),		typeof( VeriteGranite ) ),
				new CraftResourceInfo( 0x8AB, 1053101,	"Valorite",		CraftAttributeInfo.Valorite,	CraftResource.Valorite,			typeof( ValoriteIngot ),	typeof( ValoriteOre ),		typeof( ValoriteGranite ) ),
				new CraftResourceInfo( 1161,	0,		"Blaze",		CraftAttributeInfo.Blaze,		CraftResource.Blaze,			typeof( BlazeIngot ),		typeof( BlazeOre ),			typeof( BlazeGranite ) ),
				new CraftResourceInfo( 1152,	0,		"Ice",			CraftAttributeInfo.Ice,			CraftResource.Ice,				typeof( IceIngot ),			typeof( IceOre ),			typeof( IceGranite ) ),
				new CraftResourceInfo( 1272,	0,		"Toxic",		CraftAttributeInfo.Toxic,		CraftResource.Toxic,			typeof( ToxicIngot ),		typeof( ToxicOre ),			typeof( ToxicGranite ) ),
				new CraftResourceInfo( 1278,	0,		"Electrum",		CraftAttributeInfo.Electrum,	CraftResource.Electrum,			typeof( ElectrumIngot ),	typeof( ElectrumOre ),		typeof( ElectrumGranite ) ),
				new CraftResourceInfo( 1153,	0,		"Platinum",		CraftAttributeInfo.Platinum,	CraftResource.Platinum,			typeof( PlatinumIngot ),	typeof( PlatinumOre ),		typeof( PlatinumGranite ) ),
			};
 

milt

Knight
Hmmm, maybe his code for his ores has something different in it than yours, but I'm not sure. As for the problem of having sufficient metal, in the gump to craft, do you have your ores in there? When you open up the gump, down in the left corner you will see something that says IRON. If you click that, it will list the ores that you can use to craft. Are your ores in that list? If not, you will need to put them there
 

Mr. Friday

Wanderer
They are there, how else would I be able to attempt crafting with them?

In other words, if I choose Spike from the metal list with 20 ~1_NOTHING~ ingots in my pack (craftresource.Spike in props though) and I try to craftt a dagger, I get not enough materials.

There are so many places that I had to edit (around 15 by this point) that I am thinking I might have missed one.
 

Joeku

Lord
I did the same thing that you are doing, and I thought ahead: I kept a log of all the files that I had to edit to get this system working (including daat99's custom files). This was to edit only ore and leather, not wood. Here ya go:
Code:
DefBlacksmithy
DefTinkering
DefTailoring
DefMasonry
BulkMaterialType
OreInfo
Granite
Ore
Ingots
BaseArmor
BaseWeapon
MetalWorkersKey
StoneWorkersKey
TailorsKey
Mining
HarvestSystem
Elementals
LeatherElementals
SmallBOD
SmallBODAcceptGump
SmallSmithBOD
CraftItem
LargeBODAcceptGump
LargeBODGump
ResourceRecipe
RepairDeed
Recipies Lists
OreElementals
Master of The Arts
Hides
Leathers
BaseCreature
Mule
BOB
BOBGump
Masters Knife
Gargoyles Knife
Charged Dye Tub
Bag of Resources
Armor of Crafting
SmallTailorBOD
SmallBODAcceptGump
LargeBOD
ArmorEnums
BulkMaterialType
ProspectorsTool
Resource Recipe
They are all .cs files. I hope that helps!

P.S. I got mine to work fine, no trouble at all. Try re-editing Ingots.cs, Ores.cs, etc.

***EDIT***
I figured that I would post some of my files so you can see how I got it to work.

OreInfo.cs:
Code:
using System;
using System.Collections;
using Server.daat99;

namespace Server.Items
{
	public enum CraftResource
	{
		None = 0,
		Iron = 1,
		DullCopper,
		ShadowIron,
		Copper,
		Bronze,
		Gold,
		Agapite,
		Verite,
		Valorite,
		Volcanite,
		Syenite,
		Nitriton,
		Quartzite,
		Kyanite,

		RegularLeather = 101,
		SpinedLeather,
		HornedLeather,
		BarbedLeather,
		PolarLeather,
		SyntheticLeather,
		DaurianLeather,
		DaemonicLeather,
		ShadowLeather,
		AranakLeather,
		EtherealLeather,

		RedScales = 201,
		YellowScales,
		BlackScales,
		GreenScales,
		WhiteScales,
		BlueScales,
		CopperScales,
		SilverScales,
		GoldScales,

		Log = 300,
		Pine,
		Ash,
		Mohogany,
		Yew,
		Oak,
		Zircote,
		Ebony,
		Bamboo,
		PurpleHeart,
		Redwood,
		Petrified
	}

	public enum CraftResourceType
	{
		None,
		Metal,
		Leather,
		Scales,
		Wood
	}

	public class CraftAttributeInfo
	{
		private int m_WeaponFireDamage;
		private int m_WeaponColdDamage;
		private int m_WeaponPoisonDamage;
		private int m_WeaponEnergyDamage;
		private int m_WeaponDurability;
		private int m_WeaponLuck;
		private int m_WeaponGoldIncrease;
		private int m_WeaponLowerRequirements;

		private int m_ArmorPhysicalResist;
		private int m_ArmorFireResist;
		private int m_ArmorColdResist;
		private int m_ArmorPoisonResist;
		private int m_ArmorEnergyResist;
		private int m_ArmorDurability;
		private int m_ArmorLuck;
		private int m_ArmorGoldIncrease;
		private int m_ArmorLowerRequirements;

		private int m_RunicMinAttributes;
		private int m_RunicMaxAttributes;
		private int m_RunicMinIntensity;
		private int m_RunicMaxIntensity;

		public int WeaponFireDamage{ get{ return m_WeaponFireDamage; } set{ m_WeaponFireDamage = value; } }
		public int WeaponColdDamage{ get{ return m_WeaponColdDamage; } set{ m_WeaponColdDamage = value; } }
		public int WeaponPoisonDamage{ get{ return m_WeaponPoisonDamage; } set{ m_WeaponPoisonDamage = value; } }
		public int WeaponEnergyDamage{ get{ return m_WeaponEnergyDamage; } set{ m_WeaponEnergyDamage = value; } }
		public int WeaponDurability{ get{ return m_WeaponDurability; } set{ m_WeaponDurability = value; } }
		public int WeaponLuck{ get{ return m_WeaponLuck; } set{ m_WeaponLuck = value; } }
		public int WeaponGoldIncrease{ get{ return m_WeaponGoldIncrease; } set{ m_WeaponGoldIncrease = value; } }
		public int WeaponLowerRequirements{ get{ return m_WeaponLowerRequirements; } set{ m_WeaponLowerRequirements = value; } }

		public int ArmorPhysicalResist{ get{ return m_ArmorPhysicalResist; } set{ m_ArmorPhysicalResist = value; } }
		public int ArmorFireResist{ get{ return m_ArmorFireResist; } set{ m_ArmorFireResist = value; } }
		public int ArmorColdResist{ get{ return m_ArmorColdResist; } set{ m_ArmorColdResist = value; } }
		public int ArmorPoisonResist{ get{ return m_ArmorPoisonResist; } set{ m_ArmorPoisonResist = value; } }
		public int ArmorEnergyResist{ get{ return m_ArmorEnergyResist; } set{ m_ArmorEnergyResist = value; } }
		public int ArmorDurability{ get{ return m_ArmorDurability; } set{ m_ArmorDurability = value; } }
		public int ArmorLuck{ get{ return m_ArmorLuck; } set{ m_ArmorLuck = value; } }
		public int ArmorGoldIncrease{ get{ return m_ArmorGoldIncrease; } set{ m_ArmorGoldIncrease = value; } }
		public int ArmorLowerRequirements{ get{ return m_ArmorLowerRequirements; } set{ m_ArmorLowerRequirements = value; } }

		public int RunicMinAttributes{ get{ return m_RunicMinAttributes; } set{ m_RunicMinAttributes = value; } }
		public int RunicMaxAttributes{ get{ return m_RunicMaxAttributes; } set{ m_RunicMaxAttributes = value; } }
		public int RunicMinIntensity{ get{ return m_RunicMinIntensity; } set{ m_RunicMinIntensity = value; } }
		public int RunicMaxIntensity{ get{ return m_RunicMaxIntensity; } set{ m_RunicMaxIntensity = value; } }

		public CraftAttributeInfo()
		{
		}

		public static readonly CraftAttributeInfo Blank;
		public static readonly CraftAttributeInfo DullCopper, ShadowIron, Copper, Bronze, Golden, Agapite, Verite, Valorite, Volcanite, Syenite, Nitriton, Quartzite, Kyanite;
		public static readonly CraftAttributeInfo Spined, Horned, Barbed, Polar, Synthetic, DaurianL, Daemonic, Shadow, Aranak, Ethereal;
		public static readonly CraftAttributeInfo RedScales, YellowScales, BlackScales, GreenScales, WhiteScales, BlueScales, CopperScales, SilverScales, GoldScales;
		public static readonly CraftAttributeInfo Pine, Ash, Mohogany, Yew, Oak, Zircote, Ebony, Bamboo, PurpleHeart, Redwood, Petrified;

		static CraftAttributeInfo()
		{
			Blank = new CraftAttributeInfo();

			bool Uber = false;
			if (Daat99OWLTR.Ops != null)
				Uber = Daat99OWLTR.Ops[0].Setting;
			CraftAttributeInfo dullCopper = DullCopper = new CraftAttributeInfo();

			dullCopper.ArmorPhysicalResist = Uber ? 1 : Utility.Random(2);
			dullCopper.ArmorFireResist = Uber ? 1 : Utility.Random(2);
			dullCopper.ArmorColdResist = Uber ? 1 : Utility.Random(2);
			dullCopper.ArmorPoisonResist = Uber ? 1 : Utility.Random(2);
			dullCopper.ArmorEnergyResist = Uber ? 1 : Utility.Random(2);
			dullCopper.ArmorDurability = 10;
			dullCopper.WeaponDurability = 10;
			dullCopper.ArmorLowerRequirements = 5;
			dullCopper.WeaponLowerRequirements = 5;
			dullCopper.RunicMinAttributes = 1;
			dullCopper.RunicMaxAttributes = Uber ? 2 : 1;
			dullCopper.RunicMinIntensity = Uber ? 5 : 1;
			dullCopper.RunicMaxIntensity = 100;

			CraftAttributeInfo shadowIron = ShadowIron = new CraftAttributeInfo();

			shadowIron.ArmorPhysicalResist = Uber ? 2 : Utility.Random(3);
			shadowIron.ArmorFireResist = Uber ? 1 : Utility.Random(2);
			shadowIron.ArmorColdResist = Uber ? 1 : Utility.Random(2);
			shadowIron.ArmorPoisonResist = Uber ? 1 : Utility.Random(2);
			shadowIron.ArmorEnergyResist = Uber ? 1 : Utility.Random(2);
			shadowIron.ArmorDurability = 20;
			shadowIron.WeaponDurability = 20;
			shadowIron.ArmorLowerRequirements = 10;
			shadowIron.WeaponLowerRequirements = 10;
			shadowIron.WeaponColdDamage = 20;
			shadowIron.RunicMinAttributes = 1;
			shadowIron.RunicMaxAttributes = Uber ? 3 : 2;
			shadowIron.RunicMinIntensity = Uber ? 10 : 5;
			shadowIron.RunicMaxIntensity = 100;

			CraftAttributeInfo copper = Copper = new CraftAttributeInfo();

			copper.ArmorPhysicalResist = Uber ? 2 : Utility.Random(3);
			copper.ArmorFireResist = Uber ? 2 : Utility.Random(3);
			copper.ArmorColdResist = Uber ? 2 : Utility.Random(3);
			copper.ArmorPoisonResist = Uber ? 2 : Utility.Random(3);
			copper.ArmorEnergyResist = Uber ? 2 : Utility.Random(3);
			copper.ArmorDurability = 30;
			copper.WeaponDurability = 30;
			copper.ArmorLowerRequirements = 15;
			copper.WeaponLowerRequirements = 15;
			copper.WeaponPoisonDamage = 10;
			copper.WeaponEnergyDamage = 20;
			copper.RunicMinAttributes = 2;
			copper.RunicMaxAttributes = Uber ? 3 : 2;
			copper.RunicMinIntensity = Uber ? 15 : 10;
			copper.RunicMaxIntensity = 100;

			CraftAttributeInfo bronze = Bronze = new CraftAttributeInfo();

			bronze.ArmorPhysicalResist = Uber ? 2 : Utility.Random(3);
			bronze.ArmorFireResist = Uber ? 3 : Utility.Random(4);
			bronze.ArmorColdResist = Uber ? 2 : Utility.Random(3);
			bronze.ArmorPoisonResist = Uber ? 2 : Utility.Random(3);
			bronze.ArmorEnergyResist = Uber ? 2 : Utility.Random(3);
			bronze.ArmorDurability = 40;
			bronze.WeaponDurability = 40;
			bronze.ArmorLowerRequirements = 20;
			bronze.WeaponLowerRequirements = 20;
			bronze.WeaponFireDamage = 40;
			bronze.RunicMinAttributes = 1;
			bronze.RunicMaxAttributes = Uber ? 4 : 3;
			bronze.RunicMinIntensity = Uber ? 20 : 15;
			bronze.RunicMaxIntensity = 100;

			CraftAttributeInfo golden = Golden = new CraftAttributeInfo();

			golden.ArmorPhysicalResist = Uber ? 3 : Utility.Random(4);
			golden.ArmorFireResist = Uber ? 3 : Utility.Random(4);
			golden.ArmorColdResist = Uber ? 3 : Utility.Random(4);
			golden.ArmorPoisonResist = Uber ? 3 : Utility.Random(4);
			golden.ArmorEnergyResist = Uber ? 3 : Utility.Random(4);
			golden.ArmorDurability = 55;
			golden.WeaponDurability = 55;
			golden.ArmorLowerRequirements = 25;
			golden.WeaponLowerRequirements = 25;
			golden.ArmorLuck = 40;
			golden.WeaponLuck = 40;
			golden.RunicMinAttributes = 2;
			golden.RunicMaxAttributes = Uber ? 4 : 3;
			golden.RunicMinIntensity = Uber ? 25 : 20;
			golden.RunicMaxIntensity = 100;

			CraftAttributeInfo agapite = Agapite = new CraftAttributeInfo();

			agapite.ArmorPhysicalResist = Uber ? 3 : Utility.Random(4);
			agapite.ArmorFireResist = Uber ? 3 : Utility.Random(4);
			agapite.ArmorColdResist = Uber ? 4 : Utility.Random(5);
			agapite.ArmorPoisonResist = Uber ? 3 : Utility.Random(4);
			agapite.ArmorEnergyResist = Uber ? 3 : Utility.Random(4);
			agapite.ArmorDurability = 70;
			agapite.WeaponDurability = 70;
			agapite.ArmorLowerRequirements = 30;
			agapite.WeaponLowerRequirements = 30;
			agapite.WeaponColdDamage = 30;
			agapite.WeaponEnergyDamage = 20;
			agapite.RunicMinAttributes = 3;
			agapite.RunicMaxAttributes = Uber ? 5 : 3;
			agapite.RunicMinIntensity = Uber ? 30 : 25;
			agapite.RunicMaxIntensity = 100;

			CraftAttributeInfo verite = Verite = new CraftAttributeInfo();

			verite.ArmorPhysicalResist = Uber ? 4 : Utility.Random(5);
			verite.ArmorFireResist = Uber ? 4 : Utility.Random(5);
			verite.ArmorColdResist = Uber ? 4 : Utility.Random(5);
			verite.ArmorPoisonResist = Uber ? 4 : Utility.Random(5);
			verite.ArmorEnergyResist = Uber ? 4 : Utility.Random(5);
			verite.ArmorDurability = 85;
			verite.WeaponDurability = 85;
			verite.ArmorLowerRequirements = 40;
			verite.WeaponLowerRequirements = 40;
			verite.WeaponPoisonDamage = 40;
			verite.WeaponEnergyDamage = 20;
			verite.RunicMinAttributes = 2;
			verite.RunicMaxAttributes = Uber ? 5 : 4;
			verite.RunicMinIntensity = Uber ? 40 : 30;
			verite.RunicMaxIntensity = 100;

			CraftAttributeInfo valorite = Valorite = new CraftAttributeInfo();

			valorite.ArmorPhysicalResist = Uber ? 4 : Utility.Random(5);
			valorite.ArmorFireResist = Uber ? 4 : Utility.Random(5);
			valorite.ArmorColdResist = Uber ? 4 : Utility.Random(5);
			valorite.ArmorPoisonResist = Uber ? 5 : Utility.Random(6);
			valorite.ArmorEnergyResist = Uber ? 4 : Utility.Random(5);
			valorite.ArmorDurability = 100;
			valorite.WeaponDurability = 100;
			valorite.ArmorLowerRequirements = 50;
			valorite.WeaponLowerRequirements = 50;
			valorite.WeaponFireDamage = 10;
			valorite.WeaponColdDamage = 20;
			valorite.WeaponPoisonDamage = 10;
			valorite.WeaponEnergyDamage = 20;
			valorite.RunicMinAttributes = 3;
			valorite.RunicMaxAttributes = Uber ? 6 : 4;
			valorite.RunicMinIntensity = Uber ? 50 : 35;
			valorite.RunicMaxIntensity = 100;

			CraftAttributeInfo volcanite = Volcanite = new CraftAttributeInfo();

			volcanite.ArmorPhysicalResist = Uber ? 5 : Utility.Random(6);
			volcanite.ArmorFireResist = Uber ? 5 : Utility.Random(6);
			volcanite.ArmorColdResist = Uber ? 5 : Utility.Random(6);
			volcanite.ArmorPoisonResist = Uber ? 5 : Utility.Random(6);
			volcanite.ArmorEnergyResist = Uber ? 5 : Utility.Random(6);
			volcanite.ArmorDurability = 125;
			volcanite.WeaponDurability = 125;
			volcanite.ArmorLowerRequirements = 60;
			volcanite.WeaponLowerRequirements = 60;
			volcanite.WeaponFireDamage = 100;
			volcanite.RunicMinAttributes = 4;
			volcanite.RunicMaxAttributes = Uber ? 6 : 4;
			volcanite.RunicMinIntensity = Uber ? 60 : 40;
			volcanite.RunicMaxIntensity = 100;

			CraftAttributeInfo syenite = Syenite = new CraftAttributeInfo();

			syenite.ArmorPhysicalResist = Uber ? 5 : Utility.Random(6);
			syenite.ArmorFireResist = Uber ? 5 : Utility.Random(6);
			syenite.ArmorColdResist = Uber ? 5 : Utility.Random(6);
			syenite.ArmorPoisonResist = Uber ? 5 : Utility.Random(6);
			syenite.ArmorEnergyResist = Uber ? 6 : Utility.Random(7);
			syenite.ArmorDurability = 150;
			syenite.WeaponDurability = 150;
			syenite.ArmorLowerRequirements = 70;
			syenite.WeaponLowerRequirements = 70;
			syenite.WeaponColdDamage = 100;
			syenite.RunicMinAttributes = 2;
			syenite.RunicMaxAttributes = Uber ? 7 : 5;
			syenite.RunicMinIntensity = Uber ? 70 : 45;
			syenite.RunicMaxIntensity = 100;
		
			CraftAttributeInfo nitriton = Nitriton = new CraftAttributeInfo();

			nitriton.ArmorPhysicalResist = Uber ? 6 : Utility.Random(7);
			nitriton.ArmorFireResist = Uber ? 6 : Utility.Random(7);
			nitriton.ArmorColdResist = Uber ? 6 : Utility.Random(7);
			nitriton.ArmorPoisonResist = Uber ? 6 : Utility.Random(7);
			nitriton.ArmorEnergyResist = Uber ? 6 : Utility.Random(7);
			nitriton.ArmorDurability = 175;
			nitriton.WeaponDurability = 175;
			nitriton.ArmorLowerRequirements = 80;
			nitriton.WeaponLowerRequirements = 80;
			nitriton.WeaponPoisonDamage = 100;
			nitriton.RunicMinAttributes = 3;
			nitriton.RunicMaxAttributes = Uber ? 7 : 5;
			nitriton.RunicMinIntensity = Uber ? 80 : 50;
			nitriton.RunicMaxIntensity = 100;

			CraftAttributeInfo quartzite = Quartzite = new CraftAttributeInfo();

			quartzite.ArmorPhysicalResist = Uber ? 7 : Utility.Random(8);
			quartzite.ArmorFireResist = Uber ? 7 : Utility.Random(8);
			quartzite.ArmorColdResist = Uber ? 7 : Utility.Random(8);
			quartzite.ArmorPoisonResist = Uber ? 7 : Utility.Random(8);
			quartzite.ArmorEnergyResist = Uber ? 7 : Utility.Random(8);
			quartzite.ArmorDurability = 200;
			quartzite.WeaponDurability = 200;
			quartzite.ArmorLowerRequirements = 90;
			quartzite.WeaponLowerRequirements = 90;
			quartzite.WeaponEnergyDamage = 100;
			quartzite.RunicMinAttributes = 4;
			quartzite.RunicMaxAttributes = Uber ? 8 : 5;
			quartzite.RunicMinIntensity = Uber ? 90 : 55;
			quartzite.RunicMaxIntensity = 100;

			CraftAttributeInfo kyanite = Kyanite = new CraftAttributeInfo();

			kyanite.ArmorPhysicalResist = Uber ? 8 : Utility.Random(9);
			kyanite.ArmorFireResist = Uber ? 8 : Utility.Random(9);
			kyanite.ArmorColdResist = Uber ? 8 : Utility.Random(9);
			kyanite.ArmorPoisonResist = Uber ? 8 : Utility.Random(9);
			kyanite.ArmorEnergyResist = Uber ? 8 : Utility.Random(9);
			kyanite.ArmorDurability = 250;
			kyanite.WeaponDurability = 250;
			kyanite.ArmorLowerRequirements = 100;
			kyanite.WeaponLowerRequirements = 100;
			kyanite.RunicMinAttributes = 5;
			kyanite.RunicMaxAttributes = Uber ? 8 : 5;
			kyanite.RunicMinIntensity = Uber ? 100 : 60;
			kyanite.RunicMaxIntensity = 100;

			CraftAttributeInfo spined = Spined = new CraftAttributeInfo();

			spined.ArmorPhysicalResist = Uber ? 1 : Utility.Random(2);
			spined.ArmorFireResist = Uber ? 1 : Utility.Random(2);
			spined.ArmorColdResist = Uber ? 1 : Utility.Random(2);
			spined.ArmorPoisonResist = Uber ? 1 : Utility.Random(2);
			spined.ArmorEnergyResist = Uber ? 1 : Utility.Random(2);
			spined.ArmorDurability = 25;
			spined.ArmorLowerRequirements = 20;
			spined.ArmorLuck = 40;
			spined.RunicMinAttributes = 1;
			spined.RunicMaxAttributes = Uber ? 2 : 2;
			spined.RunicMinIntensity = 10;
			spined.RunicMaxIntensity = 100;

			CraftAttributeInfo horned = Horned = new CraftAttributeInfo();

			horned.ArmorPhysicalResist = Uber ? 2 : Utility.Random(3);
			horned.ArmorFireResist = Uber ? 2 : Utility.Random(3);
			horned.ArmorColdResist = Uber ? 2 : Utility.Random(3);
			horned.ArmorPoisonResist = Uber ? 2 : Utility.Random(3);
			horned.ArmorEnergyResist = Uber ? 2 : Utility.Random(3);
			horned.ArmorDurability = 50;
			horned.ArmorLowerRequirements = 30;
			horned.RunicMinAttributes = 2;
			horned.RunicMaxAttributes = Uber ? 3 : 2;
			horned.RunicMinIntensity = 20;
			horned.RunicMaxIntensity = 100;

			CraftAttributeInfo barbed = Barbed = new CraftAttributeInfo();

			barbed.ArmorPhysicalResist = Uber ? 3 : Utility.Random(4);
			barbed.ArmorFireResist = Uber ? 3 : Utility.Random(4);
			barbed.ArmorColdResist = Uber ? 3 : Utility.Random(4);
			barbed.ArmorPoisonResist = Uber ? 3 : Utility.Random(4);
			barbed.ArmorEnergyResist = Uber ? 3 : Utility.Random(4);
			barbed.ArmorDurability = 75;
			barbed.ArmorLowerRequirements = 40;
			barbed.RunicMinAttributes = 2;
			barbed.RunicMaxAttributes = Uber ? 4 : 3;
			barbed.RunicMinIntensity = 30;
			barbed.RunicMaxIntensity = 100;

			CraftAttributeInfo polar = Polar = new CraftAttributeInfo();

			polar.ArmorPhysicalResist = Uber ? 4 : Utility.Random(5);
			polar.ArmorFireResist = Uber ? 3 : Utility.Random(4);
			polar.ArmorColdResist = Uber ? 4 : Utility.Random(5);
			polar.ArmorPoisonResist = Uber ? 3 : Utility.Random(4);
			polar.ArmorEnergyResist = Uber ? 4 : Utility.Random(5);
			polar.ArmorDurability = 100;
			polar.ArmorLowerRequirements = 50;
			polar.RunicMinAttributes = 3;
			polar.RunicMaxAttributes = Uber ? 5 : 3;
			polar.RunicMinIntensity = Uber ? 40 : 35;
			polar.RunicMaxIntensity = 100;

			CraftAttributeInfo synthetic = Synthetic = new CraftAttributeInfo();

			synthetic.ArmorPhysicalResist = Uber ? 4 : Utility.Random(5);
			synthetic.ArmorFireResist = Uber ? 4 : Utility.Random(5);
			synthetic.ArmorColdResist = Uber ? 4 : Utility.Random(5);
			synthetic.ArmorPoisonResist = Uber ? 4 : Utility.Random(5);
			synthetic.ArmorEnergyResist = Uber ? 4 : Utility.Random(5);
			synthetic.ArmorLowerRequirements = 60;
			synthetic.ArmorDurability = 125;
			synthetic.RunicMinAttributes = 2;
			synthetic.RunicMaxAttributes = Uber ? 5 : 4;
			synthetic.RunicMinIntensity = Uber ? 50 : 40;
			synthetic.RunicMaxIntensity = 100;
			
			CraftAttributeInfo daurianl = DaurianL = new CraftAttributeInfo();

			daurianl.ArmorPhysicalResist = Uber ? 4 : Utility.Random(5);
			daurianl.ArmorFireResist = Uber ? 5 : Utility.Random(6);
			daurianl.ArmorColdResist = Uber ? 4 : Utility.Random(5);
			daurianl.ArmorPoisonResist = Uber ? 5 : Utility.Random(6);
			daurianl.ArmorEnergyResist = Uber ? 4 : Utility.Random(5);
			daurianl.ArmorLowerRequirements = 60;
			daurianl.ArmorDurability = 125;
			daurianl.RunicMinAttributes = 2;
			daurianl.RunicMaxAttributes = Uber ? 6 : 4;
			daurianl.RunicMinIntensity = Uber ? 60 : 40;
			daurianl.RunicMaxIntensity = 100;

			CraftAttributeInfo daemonic = Daemonic = new CraftAttributeInfo();

			daemonic.ArmorPhysicalResist = Uber ? 5 : Utility.Random(6);
			daemonic.ArmorFireResist = Uber ? 5 : Utility.Random(6);
			daemonic.ArmorColdResist = Uber ? 5 : Utility.Random(6);
			daemonic.ArmorPoisonResist = Uber ? 5 : Utility.Random(6);
			daemonic.ArmorEnergyResist = Uber ? 5 : Utility.Random(6);
			daemonic.ArmorDurability = 150;
			daemonic.ArmorLowerRequirements = 70;
			daemonic.RunicMinAttributes = 3;
			daemonic.RunicMaxAttributes = Uber ? 6 : 4;
			daemonic.RunicMinIntensity = Uber ? 70 : 45;
			daemonic.RunicMaxIntensity = 100;
			
			CraftAttributeInfo shadow = Shadow = new CraftAttributeInfo();

			shadow.ArmorPhysicalResist = Uber ? 6 : Utility.Random(7);
			shadow.ArmorFireResist = Uber ? 6 : Utility.Random(7);
			shadow.ArmorColdResist = Uber ? 6 : Utility.Random(7);
			shadow.ArmorPoisonResist = Uber ? 6 : Utility.Random(7);
			shadow.ArmorEnergyResist = Uber ? 6 : Utility.Random(7);
			shadow.ArmorDurability = 175;
			shadow.ArmorLowerRequirements = 80;
			shadow.RunicMinAttributes = 3;
			shadow.RunicMaxAttributes = Uber ? 7 : 5;
			shadow.RunicMinIntensity = Uber ? 80 : 50;
			shadow.RunicMaxIntensity = 100;
			
			CraftAttributeInfo aranak = Aranak = new CraftAttributeInfo();

			aranak.ArmorPhysicalResist = Uber ? 7 : Utility.Random(8);
			aranak.ArmorFireResist = Uber ? 7 : Utility.Random(8);
			aranak.ArmorColdResist = Uber ? 7 : Utility.Random(8);
			aranak.ArmorPoisonResist = Uber ? 7 : Utility.Random(8);
			aranak.ArmorEnergyResist = Uber ? 7 : Utility.Random(8);
			aranak.ArmorDurability = 200;
			aranak.ArmorLowerRequirements = 90;
			aranak.RunicMinAttributes = 4;
			aranak.RunicMaxAttributes = Uber ? 7 : 5;
			aranak.RunicMinIntensity = Uber ? 90 : 55;
			aranak.RunicMaxIntensity = 100;
			
			CraftAttributeInfo ethereal = Ethereal = new CraftAttributeInfo();

			ethereal.ArmorPhysicalResist = Uber ? 8 : Utility.Random(9);
			ethereal.ArmorFireResist = Uber ? 8 : Utility.Random(9);
			ethereal.ArmorColdResist = Uber ? 8 : Utility.Random(9);
			ethereal.ArmorPoisonResist = Uber ? 8 : Utility.Random(9);
			ethereal.ArmorEnergyResist = Uber ? 8 : Utility.Random(9);
			ethereal.ArmorDurability = 250;
			ethereal.ArmorLowerRequirements = 100;
			ethereal.RunicMinAttributes = 5;
			ethereal.RunicMaxAttributes = Uber ? 8 : 5;
			ethereal.RunicMinIntensity = Uber ? 100 : 60;
			ethereal.RunicMaxIntensity = 100;
			
			CraftAttributeInfo red = RedScales = new CraftAttributeInfo();

			red.ArmorFireResist = 10;
			red.ArmorColdResist = -3;

			CraftAttributeInfo yellow = YellowScales = new CraftAttributeInfo();

			yellow.ArmorPhysicalResist = -3;
			yellow.ArmorLuck = 20;

			CraftAttributeInfo black = BlackScales = new CraftAttributeInfo();

			black.ArmorPhysicalResist = 10;
			black.ArmorEnergyResist = -3;

			CraftAttributeInfo green = GreenScales = new CraftAttributeInfo();

			green.ArmorFireResist = -3;
			green.ArmorPoisonResist = 10;

			CraftAttributeInfo white = WhiteScales = new CraftAttributeInfo();

			white.ArmorPhysicalResist = -3;
			white.ArmorColdResist = 10;

			CraftAttributeInfo blue = BlueScales = new CraftAttributeInfo();

			blue.ArmorPoisonResist = -3;
			blue.ArmorEnergyResist = 10;

			CraftAttributeInfo coppers = CopperScales = new CraftAttributeInfo();

			coppers.ArmorPoisonResist = Uber ? 6 : Utility.Random(7);
			coppers.ArmorPhysicalResist = Uber ? 6 : Utility.Random(7);
			coppers.ArmorEnergyResist = Uber ? 6 : Utility.Random(7);

			CraftAttributeInfo silver = SilverScales = new CraftAttributeInfo();

			silver.ArmorColdResist = Uber ? 7 : Utility.Random(8);
			silver.ArmorEnergyResist = Uber ? 7 : Utility.Random(8);
			silver.ArmorPhysicalResist = Uber ? 7 : Utility.Random(8);

			CraftAttributeInfo gold = GoldScales = new CraftAttributeInfo();

			gold.ArmorPoisonResist = Uber ? 8 : Utility.Random(9);
			gold.ArmorColdResist = Uber ? 8 : Utility.Random(9);
			gold.ArmorPhysicalResist = Uber ? 8 : Utility.Random(9);
			gold.ArmorEnergyResist = Uber ? 8 : Utility.Random(9);
			gold.ArmorFireResist = Uber ? 8 : Utility.Random(9);
			
			CraftAttributeInfo pine = Pine = new CraftAttributeInfo();

			pine.WeaponColdDamage = 20;
			pine.WeaponDurability = 10;
			pine.WeaponLowerRequirements = 5;
			pine.RunicMinAttributes = 1;
			pine.RunicMaxAttributes = Uber ? 2 : 2;
			pine.RunicMinIntensity = Uber ? 10 : 5;
			pine.RunicMaxIntensity = 100;
			
			CraftAttributeInfo ash = Ash = new CraftAttributeInfo();

			ash.WeaponFireDamage = 40;
			ash.WeaponDurability = 25;
			ash.WeaponLowerRequirements = 10;
			ash.RunicMinAttributes = 2;
			ash.RunicMaxAttributes = Uber ? 3 : 2;
			ash.RunicMinIntensity = Uber ? 15 : 10;
			ash.RunicMaxIntensity = 100;
			
			CraftAttributeInfo mohogany = Mohogany = new CraftAttributeInfo();

			mohogany.WeaponPoisonDamage = 10;
			mohogany.WeaponEnergyDamage = 20;
			mohogany.WeaponDurability = 50;
			mohogany.WeaponLowerRequirements = 20;
			mohogany.RunicMinAttributes = 1;
			mohogany.RunicMaxAttributes = Uber ? 4 : 3;
			mohogany.RunicMinIntensity = Uber ? 20 : 15;
			mohogany.RunicMaxIntensity = 100;

			CraftAttributeInfo yew = Yew = new CraftAttributeInfo();

			yew.WeaponColdDamage = 30;
			yew.WeaponEnergyDamage = 20;
			yew.WeaponDurability = 75;
			yew.WeaponLowerRequirements = 30;
			yew.RunicMinAttributes = 2;
			yew.RunicMaxAttributes = Uber ? 5 : 3;
			yew.RunicMinIntensity = Uber ? 30 : 20;
			yew.RunicMaxIntensity = 100;

			CraftAttributeInfo oak = Oak = new CraftAttributeInfo();

			oak.WeaponPoisonDamage = 40;
			oak.WeaponEnergyDamage = 20;
			oak.WeaponDurability = 100;
			oak.WeaponLowerRequirements = 40;
			oak.RunicMinAttributes = 3;
			oak.RunicMaxAttributes = Uber ? 5 : 3;
			oak.RunicMinIntensity = Uber ? 40 : 25;
			oak.RunicMaxIntensity = 100;

			CraftAttributeInfo zircote = Zircote = new CraftAttributeInfo();

			zircote.WeaponDurability = 125;
			zircote.WeaponLowerRequirements = 50;
			zircote.WeaponFireDamage = 25;
			zircote.WeaponColdDamage = 25;
			zircote.WeaponPoisonDamage = 25;
			zircote.WeaponEnergyDamage = 25;
			zircote.RunicMinAttributes = 2;
			zircote.RunicMaxAttributes = Uber ? 6 : 4;
			zircote.RunicMinIntensity = Uber ? 50 : 30;
			zircote.RunicMaxIntensity = 100;

			CraftAttributeInfo ebony = Ebony = new CraftAttributeInfo();

			ebony.WeaponDurability = 150;
			ebony.WeaponLowerRequirements = 60;
			ebony.WeaponColdDamage = 100;
			ebony.RunicMinAttributes = 3;
			ebony.RunicMaxAttributes = Uber ? 6 : 4;
			ebony.RunicMinIntensity = Uber ? 60 : 35;
			ebony.RunicMaxIntensity = 100;
			
			CraftAttributeInfo bamboo = Bamboo = new CraftAttributeInfo();

			bamboo.WeaponDurability = 175;
			bamboo.WeaponLowerRequirements = 70;
			bamboo.WeaponEnergyDamage = 100;
			bamboo.RunicMinAttributes = 4;
			bamboo.RunicMaxAttributes = Uber ? 7 : 4;
			bamboo.RunicMinIntensity = Uber ? 70 : 40;
			bamboo.RunicMaxIntensity = 100;

			CraftAttributeInfo purpleheart = PurpleHeart = new CraftAttributeInfo();

			purpleheart.WeaponDurability = 200;
			purpleheart.WeaponLowerRequirements = 80;
			purpleheart.WeaponFireDamage = 100;
			purpleheart.RunicMinAttributes = 3;
			purpleheart.RunicMaxAttributes = Uber ? 7 : 5;
			purpleheart.RunicMinIntensity = Uber ? 80 : 50;
			purpleheart.RunicMaxIntensity = 100;

			CraftAttributeInfo redwood = Redwood = new CraftAttributeInfo();

			redwood.WeaponDurability = 225;
			redwood.WeaponLowerRequirements = 90;
			redwood.WeaponPoisonDamage = 100;
			redwood.RunicMinAttributes = 4;
			redwood.RunicMaxAttributes = Uber ? 8 : 5;
			redwood.RunicMinIntensity = Uber ? 90 : 55;
			redwood.RunicMaxIntensity = 100;

			CraftAttributeInfo petrified = Petrified = new CraftAttributeInfo();

			petrified.WeaponDurability = 250;
			petrified.WeaponLowerRequirements = 100;
			petrified.RunicMinAttributes = 5;
			petrified.RunicMaxAttributes = Uber ? 8 : 5;
			petrified.RunicMinIntensity = Uber ? 100 : 60;
			petrified.RunicMaxIntensity = 100;
		}
	}

	public class CraftResourceInfo
	{
		private int m_Hue;
		private int m_Number;
		private string m_Name;
		private CraftAttributeInfo m_AttributeInfo;
		private CraftResource m_Resource;
		private Type[] m_ResourceTypes;

		public int Hue{ get{ return m_Hue; } }
		public int Number{ get{ return m_Number; } }
		public string Name{ get{ return m_Name; } }
		public CraftAttributeInfo AttributeInfo{ get{ return m_AttributeInfo; } }
		public CraftResource Resource{ get{ return m_Resource; } }
		public Type[] ResourceTypes{ get{ return m_ResourceTypes; } }

		public CraftResourceInfo( int hue, int number, string name, CraftAttributeInfo attributeInfo, CraftResource resource, params Type[] resourceTypes )
		{
			m_Hue = hue;
			m_Number = number;
			m_Name = name;
			m_AttributeInfo = attributeInfo;
			m_Resource = resource;
			m_ResourceTypes = resourceTypes;

			for ( int i = 0; i < resourceTypes.Length; ++i )
				CraftResources.RegisterType( resourceTypes[i], resource );
		}
	}

	public class CraftResources
	{
		private static CraftResourceInfo[] m_MetalInfo = new CraftResourceInfo[]
			{
				new CraftResourceInfo( 0x000, 1053109,	"Iron",			CraftAttributeInfo.Blank,		CraftResource.Iron,				typeof( IronIngot ),		typeof( IronOre ),			typeof( Granite ) ),
				new CraftResourceInfo( 0x973, 1053108,	"Dull Copper",	CraftAttributeInfo.DullCopper,	CraftResource.DullCopper,		typeof( DullCopperIngot ),	typeof( DullCopperOre ),	typeof( DullCopperGranite ) ),
				new CraftResourceInfo( 0x966, 1053107,	"Shadow Iron",	CraftAttributeInfo.ShadowIron,	CraftResource.ShadowIron,		typeof( ShadowIronIngot ),	typeof( ShadowIronOre ),	typeof( ShadowIronGranite ) ),
				new CraftResourceInfo( 0x96D, 1053106,	"Copper",		CraftAttributeInfo.Copper,		CraftResource.Copper,			typeof( CopperIngot ),		typeof( CopperOre ),		typeof( CopperGranite ) ),
				new CraftResourceInfo( 0x972, 1053105,	"Bronze",		CraftAttributeInfo.Bronze,		CraftResource.Bronze,			typeof( BronzeIngot ),		typeof( BronzeOre ),		typeof( BronzeGranite ) ),
				new CraftResourceInfo( 0x8A5, 1053104,	"Gold",			CraftAttributeInfo.Golden,		CraftResource.Gold,				typeof( GoldIngot ),		typeof( GoldOre ),			typeof( GoldGranite ) ),
				new CraftResourceInfo( 0x979, 1053103,	"Agapite",		CraftAttributeInfo.Agapite,		CraftResource.Agapite,			typeof( AgapiteIngot ),		typeof( AgapiteOre ),		typeof( AgapiteGranite ) ),
				new CraftResourceInfo( 0x89F, 1053102,	"Verite",		CraftAttributeInfo.Verite,		CraftResource.Verite,			typeof( VeriteIngot ),		typeof( VeriteOre ),		typeof( VeriteGranite ) ),
				new CraftResourceInfo( 0x8AB, 1053101,	"Valorite",		CraftAttributeInfo.Valorite,	CraftResource.Valorite,			typeof( ValoriteIngot ),	typeof( ValoriteOre ),		typeof( ValoriteGranite ) ),
				new CraftResourceInfo( 2058,	0,		"Volcanite",		CraftAttributeInfo.Volcanite,		CraftResource.Volcanite,			typeof( VolcaniteIngot ),		typeof( VolcaniteOre ),			typeof( VolcaniteGranite ) ),
				new CraftResourceInfo( 1924,	0,		"Syenite",			CraftAttributeInfo.Syenite,			CraftResource.Syenite,				typeof( SyeniteIngot ),			typeof( SyeniteOre ),			typeof( SyeniteGranite ) ),
				new CraftResourceInfo( 2540,	0,		"Nitriton",		CraftAttributeInfo.Nitriton,		CraftResource.Nitriton,			typeof( NitritonIngot ),		typeof( NitritonOre ),			typeof( NitritonGranite ) ),
				new CraftResourceInfo( 2504,	0,		"Quartzite",		CraftAttributeInfo.Quartzite,	CraftResource.Quartzite,			typeof( QuartziteIngot ),	typeof( QuartziteOre ),		typeof( QuartziteGranite ) ),
				new CraftResourceInfo( 2527,	0,		"Kyanite",		CraftAttributeInfo.Kyanite,	CraftResource.Kyanite,			typeof( KyaniteIngot ),	typeof( KyaniteOre ),		typeof( KyaniteGranite ) ),
			};

		private static CraftResourceInfo[] m_ScaleInfo = new CraftResourceInfo[]
			{
				new CraftResourceInfo( 0x66D, 1053129,	"Red Scales",		CraftAttributeInfo.RedScales,		CraftResource.RedScales,		typeof( RedScales ) ),
				new CraftResourceInfo( 54,    1053130,	"Yellow Scales",	CraftAttributeInfo.YellowScales,	CraftResource.YellowScales,		typeof( YellowScales ) ),
				new CraftResourceInfo( 0x455, 1053131,	"Black Scales",		CraftAttributeInfo.BlackScales,		CraftResource.BlackScales,		typeof( BlackScales ) ),
				new CraftResourceInfo( 0x851, 1053132,	"Green Scales",		CraftAttributeInfo.GreenScales,		CraftResource.GreenScales,		typeof( GreenScales ) ),
				new CraftResourceInfo( 1153,  1053133,	"White Scales",		CraftAttributeInfo.WhiteScales,		CraftResource.WhiteScales,		typeof( WhiteScales ) ),
				new CraftResourceInfo( 0x8B0, 1053134,	"Blue Scales",		CraftAttributeInfo.BlueScales,		CraftResource.BlueScales,		typeof( BlueScales ) ),
				new CraftResourceInfo( 0x96D,	0,		"Copper Scales",	CraftAttributeInfo.CopperScales,	CraftResource.CopperScales,		typeof( CopperScales ) ),
				new CraftResourceInfo( 0x8FD,	0,		"Silver Scales",	CraftAttributeInfo.SilverScales,	CraftResource.SilverScales,		typeof( SilverScales ) ),
				new CraftResourceInfo( 49,  	0,		"Gold Scales",		CraftAttributeInfo.GoldScales,		CraftResource.GoldScales,		typeof( GoldScales ) ),
			};

		private static CraftResourceInfo[] m_LeatherInfo = new CraftResourceInfo[]
			{
				new CraftResourceInfo( 0x000, 1049353,		"Normal",		CraftAttributeInfo.Blank,			CraftResource.RegularLeather,	typeof( Leather ),			typeof( Hides ) ),
				new CraftResourceInfo( 0x8ac, 1049354,		"Spined",		CraftAttributeInfo.Spined,			CraftResource.SpinedLeather,	typeof( SpinedLeather ),	typeof( SpinedHides ) ),
				new CraftResourceInfo( 0x845, 1049355,		"Horned",		CraftAttributeInfo.Horned,			CraftResource.HornedLeather,	typeof( HornedLeather ),	typeof( HornedHides ) ),
				new CraftResourceInfo( 0x1C1, 1049356,		"Barbed",		CraftAttributeInfo.Barbed,			CraftResource.BarbedLeather,	typeof( BarbedLeather ),	typeof( BarbedHides ) ),
				new CraftResourceInfo( 1150,	0,			"Polar",		CraftAttributeInfo.Polar,			CraftResource.PolarLeather,		typeof( PolarLeather ),		typeof( PolarHides ) ),
				new CraftResourceInfo( 1023,	0,			"Synthetic",	CraftAttributeInfo.Synthetic,		CraftResource.SyntheticLeather,	typeof( SyntheticLeather ),	typeof( SyntheticHides ) ),
				new CraftResourceInfo( 2529,	0,			"Daurian",		CraftAttributeInfo.DaurianL,			CraftResource.DaurianLeather,		typeof( DaurianLeather ),		typeof( DaurianHides ) ),
				new CraftResourceInfo( 32,		0,			"Daemonic",		CraftAttributeInfo.Daemonic,		CraftResource.DaemonicLeather,	typeof( DaemonicLeather ),	typeof( DaemonicHides ) ),
				new CraftResourceInfo( 0x966,	0,			"Shadow",		CraftAttributeInfo.Shadow,			CraftResource.ShadowLeather,	typeof( ShadowLeather ),	typeof( ShadowHides ) ),
				new CraftResourceInfo( 2262,		0,			"Aranak",		CraftAttributeInfo.Aranak,			CraftResource.AranakLeather,		typeof( AranakLeather ),		typeof( AranakHides ) ),
				new CraftResourceInfo( 1159,	0,			"Ethereal",		CraftAttributeInfo.Ethereal,		CraftResource.EtherealLeather,	typeof( EtherealLeather ),	typeof( EtherealHides ) ),
		};

		private static CraftResourceInfo[] m_AOSLeatherInfo = new CraftResourceInfo[]
			{
				new CraftResourceInfo( 0x000, 1049353,		"Normal",		CraftAttributeInfo.Blank,			CraftResource.RegularLeather,	typeof( Leather ),			typeof( Hides ) ),
				new CraftResourceInfo( 0x8ac, 1049354,		"Spined",		CraftAttributeInfo.Spined,			CraftResource.SpinedLeather,	typeof( SpinedLeather ),	typeof( SpinedHides ) ),
				new CraftResourceInfo( 0x845, 1049355, 		"Horned",		CraftAttributeInfo.Horned,			CraftResource.HornedLeather,	typeof( HornedLeather ),	typeof( HornedHides ) ),
				new CraftResourceInfo( 0x851, 1049356,		"Barbed",		CraftAttributeInfo.Barbed,			CraftResource.BarbedLeather,	typeof( BarbedLeather ),	typeof( BarbedHides ) ),
				new CraftResourceInfo( 1150,	0,			"Polar",		CraftAttributeInfo.Polar,			CraftResource.PolarLeather,		typeof( PolarLeather ),		typeof( PolarHides ) ),
				new CraftResourceInfo( 1023,	0,			"Synthetic",	CraftAttributeInfo.Synthetic,		CraftResource.SyntheticLeather,	typeof( SyntheticLeather ),	typeof( SyntheticHides ) ),
				new CraftResourceInfo( 2529,	0,			"Daurian",		CraftAttributeInfo.DaurianL,			CraftResource.DaurianLeather,		typeof( DaurianLeather ),		typeof( DaurianHides ) ),
				new CraftResourceInfo( 32,		0,			"Daemonic",		CraftAttributeInfo.Daemonic,		CraftResource.DaemonicLeather,	typeof( DaemonicLeather ),	typeof( DaemonicHides ) ),
				new CraftResourceInfo( 0x966,	0,			"Shadow",		CraftAttributeInfo.Shadow,			CraftResource.ShadowLeather,	typeof( ShadowLeather ),	typeof( ShadowHides ) ),
				new CraftResourceInfo( 2262,		0,			"Aranak",		CraftAttributeInfo.Aranak,			CraftResource.AranakLeather,		typeof( AranakLeather ),		typeof( AranakHides ) ),
				new CraftResourceInfo( 1159,	0,			"Ethereal",		CraftAttributeInfo.Ethereal,		CraftResource.EtherealLeather,	typeof( EtherealLeather ),	typeof( EtherealHides ) ),
		};
		private static CraftResourceInfo[] m_WoodInfo = new CraftResourceInfo[]
			{
				new CraftResourceInfo( 0, 0,	"Log",			CraftAttributeInfo.Blank,		CraftResource.Log,			typeof( Log ) ),
				new CraftResourceInfo( 1262, 0,	"Pine",			CraftAttributeInfo.Pine,		CraftResource.Pine,			typeof( PineLog ) ),
				new CraftResourceInfo( 961,  0,	"Ash",			CraftAttributeInfo.Ash,			CraftResource.Ash,			typeof( AshLog ) ),
				new CraftResourceInfo( 355,  0,	"Mohogany",		CraftAttributeInfo.Mohogany,	CraftResource.Mohogany,		typeof( MohoganyLog ) ),
				new CraftResourceInfo( 1281, 0, "Yew",			CraftAttributeInfo.Yew,			CraftResource.Yew,			typeof( YewLog ) ),
				new CraftResourceInfo( 488,  0, "Oak",			CraftAttributeInfo.Oak,			CraftResource.Oak,			typeof( OakLog ) ),
				new CraftResourceInfo( 1271, 0, "Zircote",		CraftAttributeInfo.Zircote,		CraftResource.Zircote,		typeof( ZircoteLog ) ),
				new CraftResourceInfo( 43,   0, "Ebony",		CraftAttributeInfo.Ebony,		CraftResource.Ebony,		typeof( EbonyLog ) ),
				new CraftResourceInfo( 1152, 0,	"Bamboo",		CraftAttributeInfo.Bamboo,		CraftResource.Bamboo,		typeof( BambooLog ) ),
				new CraftResourceInfo( 114,  0, "PurpleHeart",	CraftAttributeInfo.PurpleHeart,	CraftResource.PurpleHeart,	typeof( PurpleHeartLog ) ),
				new CraftResourceInfo( 37,   0,	"Redwood",		CraftAttributeInfo.Redwood,		CraftResource.Redwood,		typeof( RedwoodLog ) ),
				new CraftResourceInfo( 1153, 0, "Petrified",	CraftAttributeInfo.Petrified,	CraftResource.Petrified,	typeof( PetrifiedLog ) ),
		};

		/// <summary>
		/// Returns true if '<paramref name="resource"/>' is None, Iron, or RegularLeather. False if otherwise.
		/// </summary>
		public static bool IsStandard( CraftResource resource )
		{
			return ( resource == CraftResource.None || resource == CraftResource.Iron || resource == CraftResource.RegularLeather );
		}

		private static Hashtable m_TypeTable;

		/// <summary>
		/// Registers that '<paramref name="resourceType"/>' uses '<paramref name="resource"/>' so that it can later be queried by <see cref="CraftResources.GetFromType"/>
		/// </summary>
		public static void RegisterType( Type resourceType, CraftResource resource )
		{
			if ( m_TypeTable == null )
				m_TypeTable = new Hashtable();

			m_TypeTable[resourceType] = resource;
		}

		/// <summary>
		/// Returns the <see cref="CraftResource"/> value for which '<paramref name="resourceType"/>' uses -or- CraftResource.None if an unregistered type was specified.
		/// </summary>
		public static CraftResource GetFromType( Type resourceType )
		{
			if ( m_TypeTable == null )
				return CraftResource.None;

			object obj = m_TypeTable[resourceType];

			if ( !(obj is CraftResource) )
				return CraftResource.None;

			return (CraftResource)obj;
		}

		/// <summary>
		/// Returns a <see cref="CraftResourceInfo"/> instance describing '<paramref name="resource"/>' -or- null if an invalid resource was specified.
		/// </summary>
		public static CraftResourceInfo GetInfo( CraftResource resource )
		{
			CraftResourceInfo[] list = null;

			switch ( GetType( resource ) )
			{
				case CraftResourceType.Metal: list = m_MetalInfo; break;
				case CraftResourceType.Leather: list = Core.AOS ? m_AOSLeatherInfo : m_LeatherInfo; break;
				case CraftResourceType.Scales: list = m_ScaleInfo; break;
				case CraftResourceType.Wood: list = m_WoodInfo; break;
			}

			if ( list != null )
			{
				int index = GetIndex( resource );

				if ( index >= 0 && index < list.Length )
					return list[index];
			}

			return null;
		}

		/// <summary>
		/// Returns a <see cref="CraftResourceType"/> value indiciating the type of '<paramref name="resource"/>'.
		/// </summary>
		public static CraftResourceType GetType( CraftResource resource )
		{
			if ( resource >= CraftResource.Iron && resource <= CraftResource.Kyanite )
				return CraftResourceType.Metal;

			if ( resource >= CraftResource.RegularLeather && resource <= CraftResource.EtherealLeather )
				return CraftResourceType.Leather;

			if ( resource >= CraftResource.RedScales && resource <= CraftResource.GoldScales )
				return CraftResourceType.Scales;

			if ( resource >= CraftResource.Log && resource <= CraftResource.Petrified )
				return CraftResourceType.Wood;

			return CraftResourceType.None;
		}

		/// <summary>
		/// Returns the first <see cref="CraftResource"/> in the series of resources for which '<paramref name="resource"/>' belongs.
		/// </summary>
		public static CraftResource GetStart( CraftResource resource )
		{
			switch ( GetType( resource ) )
			{
				case CraftResourceType.Metal: return CraftResource.Iron;
				case CraftResourceType.Leather: return CraftResource.RegularLeather;
				case CraftResourceType.Wood: return CraftResource.Log;
				case CraftResourceType.Scales: return CraftResource.RedScales;
			}

			return CraftResource.None;
		}

		/// <summary>
		/// Returns the index of '<paramref name="resource"/>' in the seriest of resources for which it belongs.
		/// </summary>
		public static int GetIndex( CraftResource resource )
		{
			CraftResource start = GetStart( resource );

			if ( start == CraftResource.None )
				return 0;

			return (int)(resource - start);
		}

		/// <summary>
		/// Returns the <see cref="CraftResourceInfo.Number"/> property of '<paramref name="resource"/>' -or- 0 if an invalid resource was specified.
		/// </summary>
		public static int GetLocalizationNumber( CraftResource resource )
		{
			CraftResourceInfo info = GetInfo( resource );

			return ( info == null ? 0 : info.Number );
		}

		/// <summary>
		/// Returns the <see cref="CraftResourceInfo.Hue"/> property of '<paramref name="resource"/>' -or- 0 if an invalid resource was specified.
		/// </summary>
		public static int GetHue( CraftResource resource )
		{
			CraftResourceInfo info = GetInfo( resource );

			return ( info == null ? 0 : info.Hue );
		}

		/// <summary>
		/// Returns the <see cref="CraftResourceInfo.Name"/> property of '<paramref name="resource"/>' -or- an empty string if the resource specified was invalid.
		/// </summary>
		public static string GetName( CraftResource resource )
		{
			CraftResourceInfo info = GetInfo( resource );

			return ( info == null ? String.Empty : info.Name );
		}

		/// <summary>
		/// Returns the <see cref="CraftResource"/> value which represents '<paramref name="info"/>' -or- CraftResource.None if unable to convert.
		/// </summary>
		public static CraftResource GetFromOreInfo( OreInfo info )
		{
			if ( info.Name.IndexOf( "Spined" ) >= 0 )
				return CraftResource.SpinedLeather;
			else if ( info.Name.IndexOf( "Horned" ) >= 0 )
				return CraftResource.HornedLeather;
			else if ( info.Name.IndexOf( "Barbed" ) >= 0 )
				return CraftResource.BarbedLeather;
			else if ( info.Name.IndexOf( "Polar" ) >= 0 )
				return CraftResource.PolarLeather;
			else if ( info.Name.IndexOf( "Synthetic" ) >= 0 )
				return CraftResource.SyntheticLeather;
			else if ( info.Name.IndexOf( "Daurian" ) >= 0 )
				return CraftResource.DaurianLeather;
			else if ( info.Name.IndexOf( "Daemonic" ) >= 0 )
				return CraftResource.DaemonicLeather;
			else if ( info.Name.IndexOf( "Shadow" ) >= 0 )
				return CraftResource.ShadowLeather;
			else if ( info.Name.IndexOf( "Aranak" ) >= 0 )
				return CraftResource.AranakLeather;
			else if ( info.Name.IndexOf( "Ethereal" ) >= 0 )
				return CraftResource.EtherealLeather;
			else if ( info.Name.IndexOf( "Leather" ) >= 0 )
				return CraftResource.RegularLeather;

			if ( info.Level == 0 )
				return CraftResource.Iron;
			else if ( info.Level == 1 )
				return CraftResource.DullCopper;
			else if ( info.Level == 2 )
				return CraftResource.ShadowIron;
			else if ( info.Level == 3 )
				return CraftResource.Copper;
			else if ( info.Level == 4 )
				return CraftResource.Bronze;
			else if ( info.Level == 5 )
				return CraftResource.Gold;
			else if ( info.Level == 6 )
				return CraftResource.Agapite;
			else if ( info.Level == 7 )
				return CraftResource.Verite;
			else if ( info.Level == 8 )
				return CraftResource.Valorite;
			else if ( info.Level == 9 )
				return CraftResource.Volcanite;
			else if ( info.Level == 10 )
				return CraftResource.Syenite;
			else if ( info.Level == 11 )
				return CraftResource.Nitriton;
			else if ( info.Level == 12 )
				return CraftResource.Quartzite;
			else if ( info.Level == 13 )
				return CraftResource.Kyanite;

			else if ( info.Level == 300 )
				return CraftResource.Log;
			else if ( info.Level == 301 )
				return CraftResource.Pine;
			else if ( info.Level == 302 )
				return CraftResource.Ash;
			else if ( info.Level == 303 )
				return CraftResource.Mohogany;
			else if ( info.Level == 304 )
				return CraftResource.Yew;
			else if ( info.Level == 305 )
				return CraftResource.Oak;
			else if ( info.Level == 306 )
				return CraftResource.Zircote;
			else if ( info.Level == 307 )
				return CraftResource.Ebony;
			else if ( info.Level == 308 )
				return CraftResource.Bamboo;
			else if ( info.Level == 309 )
				return CraftResource.PurpleHeart;
			else if ( info.Level == 310 )
				return CraftResource.Redwood;
			else if ( info.Level == 311 )
				return CraftResource.Petrified;
						
			return CraftResource.None;
		}

		/// <summary>
		/// Returns the <see cref="CraftResource"/> value which represents '<paramref name="info"/>', using '<paramref name="material"/>' to help resolve leather OreInfo instances.
		/// </summary>
		public static CraftResource GetFromOreInfo( OreInfo info, ArmorMaterialType material )
		{
			if ( material == ArmorMaterialType.Studded || material == ArmorMaterialType.Leather || material == ArmorMaterialType.Spined ||
				material == ArmorMaterialType.Horned || material == ArmorMaterialType.Barbed || material == ArmorMaterialType.Polar || 
				material == ArmorMaterialType.Synthetic || material == ArmorMaterialType.DaurianL || material == ArmorMaterialType.Daemonic ||
				material == ArmorMaterialType.Shadow || material == ArmorMaterialType.Aranak || material == ArmorMaterialType.Ethereal )
			{
				if ( info.Level == 0 )
					return CraftResource.RegularLeather;
				else if ( info.Level == 1 )
					return CraftResource.SpinedLeather;
				else if ( info.Level == 2 )
					return CraftResource.HornedLeather;
				else if ( info.Level == 3 )
					return CraftResource.BarbedLeather;
				else if ( info.Level == 4 )
					return CraftResource.PolarLeather;
				else if ( info.Level == 5 )
					return CraftResource.SyntheticLeather;
				else if ( info.Level == 6 )
					return CraftResource.DaurianLeather;
				else if ( info.Level == 7 )
					return CraftResource.DaemonicLeather;
				else if ( info.Level == 8 )
					return CraftResource.ShadowLeather;
				else if ( info.Level == 9 )
					return CraftResource.AranakLeather;
				else if ( info.Level == 10 )
					return CraftResource.EtherealLeather;

				return CraftResource.None;
			}

			return GetFromOreInfo( info );
		}
	}

	// NOTE: This class is only for compatability with very old RunUO versions.
	// No changes to it should be required for custom resources.
	public class OreInfo
	{
		public static readonly OreInfo Iron			= new OreInfo( 0, 0x000, "Iron" );
		public static readonly OreInfo DullCopper	= new OreInfo( 1, 0x973, "Dull Copper" );
		public static readonly OreInfo ShadowIron	= new OreInfo( 2, 0x966, "Shadow Iron" );
		public static readonly OreInfo Copper		= new OreInfo( 3, 0x96D, "Copper" );
		public static readonly OreInfo Bronze		= new OreInfo( 4, 0x972, "Bronze" );
		public static readonly OreInfo Gold			= new OreInfo( 5, 0x8A5, "Gold" );
		public static readonly OreInfo Agapite		= new OreInfo( 6, 0x979, "Agapite" );
		public static readonly OreInfo Verite		= new OreInfo( 7, 0x89F, "Verite" );
		public static readonly OreInfo Valorite		= new OreInfo( 8, 0x8AB, "Valorite" );
		public static readonly OreInfo Volcanite		= new OreInfo( 9, 2058,  "Volcanite" );
		public static readonly OreInfo Syenite			= new OreInfo( 10, 1924, "Syenite" );
		public static readonly OreInfo Nitriton		= new OreInfo( 11, 2540, "Nitriton" );
		public static readonly OreInfo Quartzite		= new OreInfo( 12, 2504, "Quartzite" );
		public static readonly OreInfo Kyanite		= new OreInfo( 13, 2527, "Kyanite" );
		public static readonly OreInfo Log			= new OreInfo( 300, 0, "Log" );
		public static readonly OreInfo Pine			= new OreInfo( 301, 1262, "Pine" );
		public static readonly OreInfo Ash	 		= new OreInfo( 302, 961, "Ash" );
		public static readonly OreInfo Mohogany     = new OreInfo( 303, 355, "Mohogany" );
		public static readonly OreInfo Yew        	= new OreInfo( 304, 1281, "Yew" );
		public static readonly OreInfo Oak        	= new OreInfo( 305, 488, "Oak" );
		public static readonly OreInfo Zircote     	= new OreInfo( 306, 1271, "Zircote" );
		public static readonly OreInfo Ebony        = new OreInfo( 307, 43, "Ebony" );
		public static readonly OreInfo Bamboo      	= new OreInfo( 308, 1152, "Bamboo" );
		public static readonly OreInfo PurpleHeart 	= new OreInfo( 309, 114, "PurpleHeart" );
		public static readonly OreInfo Redwood     	= new OreInfo( 310, 37, "Redwood" );
		public static readonly OreInfo Petrified    = new OreInfo( 311, 1153, "Petrified" );

		private int m_Level;
		private int m_Hue;
		private string m_Name;

		public OreInfo( int level, int hue, string name )
		{
			m_Level = level;
			m_Hue = hue;
			m_Name = name;
		}

		public int Level
		{
			get
			{
				return m_Level;
			}
		}

		public int Hue
		{
			get
			{
				return m_Hue;
			}
		}

		public string Name
		{
			get
			{
				return m_Name;
			}
		}
	}
}
Ingots.cs:
Code:
using System;
using Server.Items;
using Server.Network;

namespace Server.Items
{
	public abstract class BaseIngot : Item, ICommodity
	{
		private CraftResource m_Resource;

		[CommandProperty( AccessLevel.GameMaster )]
		public CraftResource Resource
		{
			get{ return m_Resource; }
			set{ m_Resource = value; InvalidateProperties(); }
		}
		
		string ICommodity.Description
		{
			get
			{
				return String.Format( Amount == 1 ? "{0} {1} ingot" : "{0} {1} ingots", Amount, CraftResources.GetName( m_Resource ).ToLower() );
			}
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 1 ); // version

			writer.Write( (int) m_Resource );
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();

			switch ( version )
			{
				case 1:
				{
					m_Resource = (CraftResource)reader.ReadInt();
					break;
				}
				case 0:
				{
					OreInfo info;

					switch ( reader.ReadInt() )
					{
						case 0: info = OreInfo.Iron; break;
						case 1: info = OreInfo.DullCopper; break;
						case 2: info = OreInfo.ShadowIron; break;
						case 3: info = OreInfo.Copper; break;
						case 4: info = OreInfo.Bronze; break;
						case 5: info = OreInfo.Gold; break;
						case 6: info = OreInfo.Agapite; break;
						case 7: info = OreInfo.Verite; break;
						case 8: info = OreInfo.Valorite; break;
						case 9: info = OreInfo.Volcanite; break;
						case 10: info = OreInfo.Syenite; break;
						case 11: info = OreInfo.Nitriton; break;
						case 12: info = OreInfo.Quartzite; break;
						case 13: info = OreInfo.Kyanite; break;
						default: info = null; break;
					}

					m_Resource = CraftResources.GetFromOreInfo( info );
					break;
				}
			}
		}

		public BaseIngot( CraftResource resource ) : this( resource, 1 )
		{
		}

		public BaseIngot( CraftResource resource, int amount ) : base( 0x1BF2 )
		{
			Stackable = true;
			Weight = 0.1;
			Amount = amount;
			Hue = CraftResources.GetHue( resource );

			m_Resource = resource;
		}

		public BaseIngot( Serial serial ) : base( serial )
		{
		}

		public override void AddNameProperty( ObjectPropertyList list )
		{
			if ( Amount > 1 )
				list.Add( 1050039, "{0}\t#{1}", Amount, 1027154 ); // ~1_NUMBER~ ~2_ITEMNAME~
			else
				list.Add( 1027154 ); // ingots
		}

		public override void GetProperties( ObjectPropertyList list )
		{
			base.GetProperties( list );

			if ( !CraftResources.IsStandard( m_Resource ) )
			{
				int num = CraftResources.GetLocalizationNumber( m_Resource );

				if ( num > 0 )
					list.Add( num );
				else
					list.Add( CraftResources.GetName( m_Resource ) );
			}
		}

		public override int LabelNumber
		{
			get
			{
				if ( m_Resource >= CraftResource.DullCopper && m_Resource <= CraftResource.Kyanite )
					return 1042684 + (int)(m_Resource - CraftResource.DullCopper);

				return 1042692;
			}
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class IronIngot : BaseIngot
	{
		[Constructable]
		public IronIngot() : this( 1 )
		{
		}

		[Constructable]
		public IronIngot( int amount ) : base( CraftResource.Iron, amount )
		{
			Name = "Iron Ingots";
		}

		public IronIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new IronIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class DullCopperIngot : BaseIngot
	{
		[Constructable]
		public DullCopperIngot() : this( 1 )
		{
		}

		[Constructable]
		public DullCopperIngot( int amount ) : base( CraftResource.DullCopper, amount )
		{
			Name = "Dull Copper Ingots";
		}

		public DullCopperIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DullCopperIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class ShadowIronIngot : BaseIngot
	{
		[Constructable]
		public ShadowIronIngot() : this( 1 )
		{
		}

		[Constructable]
		public ShadowIronIngot( int amount ) : base( CraftResource.ShadowIron, amount )
		{
			Name = "Shadow Iron Ingots";
		}

		public ShadowIronIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new ShadowIronIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class CopperIngot : BaseIngot
	{
		[Constructable]
		public CopperIngot() : this( 1 )
		{
		}

		[Constructable]
		public CopperIngot( int amount ) : base( CraftResource.Copper, amount )
		{
			Name = "Copper Ingots";
		}

		public CopperIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new CopperIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class BronzeIngot : BaseIngot
	{
		[Constructable]
		public BronzeIngot() : this( 1 )
		{
		}

		[Constructable]
		public BronzeIngot( int amount ) : base( CraftResource.Bronze, amount )
		{
			Name = "Bronze Ingots";
		}

		public BronzeIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new BronzeIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class GoldIngot : BaseIngot
	{
		[Constructable]
		public GoldIngot() : this( 1 )
		{
		}

		[Constructable]
		public GoldIngot( int amount ) : base( CraftResource.Gold, amount )
		{
			Name = "Golden Ingots";
		}

		public GoldIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new GoldIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class AgapiteIngot : BaseIngot
	{
		[Constructable]
		public AgapiteIngot() : this( 1 )
		{
		}

		[Constructable]
		public AgapiteIngot( int amount ) : base( CraftResource.Agapite, amount )
		{
			Name = "Agapite Ingots";
		}

		public AgapiteIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new AgapiteIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class VeriteIngot : BaseIngot
	{
		[Constructable]
		public VeriteIngot() : this( 1 )
		{
		}

		[Constructable]
		public VeriteIngot( int amount ) : base( CraftResource.Verite, amount )
		{
			Name = "Verite Ingots";
		}

		public VeriteIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new VeriteIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class ValoriteIngot : BaseIngot
	{
		[Constructable]
		public ValoriteIngot() : this( 1 )
		{
		}

		[Constructable]
		public ValoriteIngot( int amount ) : base( CraftResource.Valorite, amount )
		{
			Name = "Valorite Ingots";
		}

		public ValoriteIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new ValoriteIngot( amount ), amount );
		}
	}
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class VolcaniteIngot : BaseIngot
	{
		[Constructable]
		public VolcaniteIngot() : this( 1 )
		{
		}

		[Constructable]
		public VolcaniteIngot( int amount ) : base( CraftResource.Volcanite, amount )
		{
			Name = "Volcanite Ingots";
		}

		public VolcaniteIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new VolcaniteIngot( amount ), amount );
		}
	}
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class SyeniteIngot : BaseIngot
	{
		[Constructable]
		public SyeniteIngot() : this( 1 )
		{
		}

		[Constructable]
		public SyeniteIngot( int amount ) : base( CraftResource.Syenite, amount )
		{
			Name = "Syenite Ingots";
		}

		public SyeniteIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new SyeniteIngot( amount ), amount );
		}
	}
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class NitritonIngot : BaseIngot
	{
		[Constructable]
		public NitritonIngot() : this( 1 )
		{
		}

		[Constructable]
		public NitritonIngot( int amount ) : base( CraftResource.Nitriton, amount )
		{
			Name = "Nitriton Ingots";
		}

		public NitritonIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new NitritonIngot( amount ), amount );
		}
	}
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class QuartziteIngot : BaseIngot
	{
		[Constructable]
		public QuartziteIngot() : this( 1 )
		{
		}

		[Constructable]
		public QuartziteIngot( int amount ) : base( CraftResource.Quartzite, amount )
		{
			Name = "Quartzite Ingots";
		}

		public QuartziteIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new QuartziteIngot( amount ), amount );
		}
	}
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class KyaniteIngot : BaseIngot
	{
		[Constructable]
		public KyaniteIngot() : this( 1 )
		{
		}

		[Constructable]
		public KyaniteIngot( int amount ) : base( CraftResource.Kyanite, amount )
		{
			Name = "Kyanite Ingots";
		}

		public KyaniteIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new KyaniteIngot( amount ), amount );
		}
	}
}
Ore.cs:
Code:
using System;
using Server.Items;
using Server.Mobiles;
using Server.Network;
using Server.Targeting;
using Server.Engines.Craft;
using Server.daat99;

namespace Server.Items
{
	public abstract class BaseOre : Item, ICommodity
	{
		private CraftResource m_Resource;

		[CommandProperty( AccessLevel.GameMaster )]
		public CraftResource Resource
		{
			get{ return m_Resource; }
			set{ m_Resource = value; InvalidateProperties(); }
		}

		string ICommodity.Description
		{
			get
			{
				return String.Format( "{0} {1} ore", Amount, CraftResources.GetName( m_Resource ).ToLower() );
			}
		}

		public abstract BaseIngot GetIngot();

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 1 ); // version

			writer.Write( (int) m_Resource );
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();

			switch ( version )
			{
				case 1:
				{
					m_Resource = (CraftResource)reader.ReadInt();
					break;
				}
				case 0:
				{
					OreInfo info;

					switch ( reader.ReadInt() )
					{
						case 0: info = OreInfo.Iron; break;
						case 1: info = OreInfo.DullCopper; break;
						case 2: info = OreInfo.ShadowIron; break;
						case 3: info = OreInfo.Copper; break;
						case 4: info = OreInfo.Bronze; break;
						case 5: info = OreInfo.Gold; break;
						case 6: info = OreInfo.Agapite; break;
						case 7: info = OreInfo.Verite; break;
						case 8: info = OreInfo.Valorite; break;

						case 9: info = OreInfo.Volcanite; break;
						case 10: info = OreInfo.Syenite; break;
						case 11: info = OreInfo.Nitriton; break;
						case 12: info = OreInfo.Quartzite; break;
						case 13: info = OreInfo.Kyanite; break;

						default: info = null; break;
					}

					m_Resource = CraftResources.GetFromOreInfo( info );
					break;
				}
			}
		}

		public BaseOre( CraftResource resource ) : this( resource, 1 )
		{
		}

		public BaseOre( CraftResource resource, int amount ) : base( 0x19B9 )
		{
			Stackable = true;
			Weight = 12.0;
			Amount = amount;
			Hue = CraftResources.GetHue( resource );

			m_Resource = resource;
		}

		public BaseOre( Serial serial ) : base( serial )
		{
		}

		public override void AddNameProperty( ObjectPropertyList list )
		{
			if ( Amount > 1 )
				list.Add( 1050039, "{0}\t#{1}", Amount, 1026583 ); // ~1_NUMBER~ ~2_ITEMNAME~
			else
				list.Add( 1026583 ); // ore
		}

		public override void GetProperties( ObjectPropertyList list )
		{
			base.GetProperties( list );

			if ( !CraftResources.IsStandard( m_Resource ) )
			{
				int num = CraftResources.GetLocalizationNumber( m_Resource );

				if ( num > 0 )
					list.Add( num );
				else
					list.Add( CraftResources.GetName( m_Resource ) );
			}
		}

		public override int LabelNumber
		{
			get
			{
				if ( m_Resource >= CraftResource.DullCopper && m_Resource <= CraftResource.Kyanite )
					return 1042845 + (int)(m_Resource - CraftResource.DullCopper);

				return 1042853; // iron ore;
			}
		}

		public override void OnDoubleClick( Mobile from )
		{
			if ( !Movable )
				return;

			if ( from.InRange( this.GetWorldLocation(), 2 ) )
			{
				from.SendLocalizedMessage( 501971 ); // Select the forge on which to smelt the ore, or another pile of ore with which to combine it.
				from.Target = new InternalTarget( this );
			}
			else
			{
				from.SendLocalizedMessage( 501976 ); // The ore is too far away.
			}
		}

		private class InternalTarget : Target
		{
			private BaseOre m_Ore;

			public InternalTarget( BaseOre ore ) :  base ( 2, false, TargetFlags.None )
			{
				m_Ore = ore;
			}

			private bool IsForge( Mobile from, object obj )
			{
				if ( obj.GetType().IsDefined( typeof( ForgeAttribute ), false ) )
					return true;

				if (Daat99OWLTR.Ops[10].Setting)
				{
					if ( obj is Mule )
					{
						Mule mule = obj as Mule;
						if ( mule.ControlMaster != from )
						{
							from.SendMessage(53, "You don't own that mule!!!");
							from.PlaySound(1074); //no
							return false;
						}
						else
							return true;
					}
				}
				int itemID = 0;

				if ( obj is Item )
					itemID = ((Item)obj).ItemID;
				else if ( obj is StaticTarget )
					itemID = ((StaticTarget)obj).ItemID & 0x3FFF;

				return ( itemID == 4017 || (itemID >= 6522 && itemID <= 6569) );
			}

			protected override void OnTarget( Mobile from, object targeted )
			{
				if ( m_Ore.Deleted )
					return;

				if ( !from.InRange( m_Ore.GetWorldLocation(), 2 ) )
				{
					from.SendLocalizedMessage( 501976 ); // The ore is too far away.
					return;
				}

				if ( IsForge( from, targeted ) )
				{
					double difficulty;

					switch ( m_Ore.Resource )
					{
						default: difficulty = 50.0; break;
						case CraftResource.DullCopper: difficulty = 60.0; break;
						case CraftResource.ShadowIron: difficulty = 65.0; break;
						case CraftResource.Copper: difficulty = 70.0; break;
						case CraftResource.Bronze: difficulty = 75.0; break;
						case CraftResource.Gold: difficulty = 80.0; break;
						case CraftResource.Agapite: difficulty = 85.0; break;
						case CraftResource.Verite: difficulty = 90.0; break;
						case CraftResource.Valorite: difficulty = 95.0; break;

						case CraftResource.Volcanite: difficulty = 100.0; break;
						case CraftResource.Syenite: difficulty = 105.0; break;
						case CraftResource.Nitriton: difficulty = 110.0; break;
						case CraftResource.Quartzite: difficulty = 115.0; break;
						case CraftResource.Kyanite: difficulty = 119.0; break;

					}

					double minSkill = difficulty - 25.0;
					double maxSkill = difficulty + 25.0;
					
					if ( difficulty > 50.0 && difficulty > from.Skills[SkillName.Mining].Value )
					{
						from.SendLocalizedMessage( 501986 ); // You have no idea how to smelt this strange ore!
						return;
					}

					if ( from.CheckTargetSkill( SkillName.Mining, targeted, minSkill, maxSkill ) )
					{
						int toConsume = m_Ore.Amount;

						if ( toConsume <= 0 )
						{
							from.SendLocalizedMessage( 501987 ); // There is not enough metal-bearing ore in this pile to make an ingot.
						}
						else
						{
							if ( toConsume > 30000 )
								toConsume = 30000;

							BaseIngot ingot = m_Ore.GetIngot();
							ingot.Amount = toConsume * 2;

							m_Ore.Consume( toConsume );
							from.AddToBackpack( ingot );
							//from.PlaySound( 0x57 );


							from.SendLocalizedMessage( 501988 ); // You smelt the ore removing the impurities and put the metal in your backpack.
						}
					}
					else if ( m_Ore.Amount < 2 )
					{
						from.SendLocalizedMessage( 501989 ); // You burn away the impurities but are left with no useable metal.
						m_Ore.Delete();
					}
					else
					{
						from.SendLocalizedMessage( 501990 ); // You burn away the impurities but are left with less useable metal.
						m_Ore.Amount /= 2;
					}
				}
			}
		}
	}

	public class IronOre : BaseOre
	{
		[Constructable]
		public IronOre() : this( 1 )
		{
		}

		[Constructable]
		public IronOre( int amount ) : base( CraftResource.Iron, amount )
		{
			Name = "Iron Ore";
		}

		public IronOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new IronOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new IronIngot();
		}
	}

	public class DullCopperOre : BaseOre
	{
		[Constructable]
		public DullCopperOre() : this( 1 )
		{
		}

		[Constructable]
		public DullCopperOre( int amount ) : base( CraftResource.DullCopper, amount )
		{
			Name = "Dull Copper Ore";
		}

		public DullCopperOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DullCopperOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new DullCopperIngot();
		}
	}

	public class ShadowIronOre : BaseOre
	{
		[Constructable]
		public ShadowIronOre() : this( 1 )
		{
		}

		[Constructable]
		public ShadowIronOre( int amount ) : base( CraftResource.ShadowIron, amount )
		{
			Name = "Shadow Iron Ore";
		}

		public ShadowIronOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new ShadowIronOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new ShadowIronIngot();
		}
	}

	public class CopperOre : BaseOre
	{
		[Constructable]
		public CopperOre() : this( 1 )
		{
		}

		[Constructable]
		public CopperOre( int amount ) : base( CraftResource.Copper, amount )
		{
			Name = "Copper Ore";
		}

		public CopperOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new CopperOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new CopperIngot();
		}
	}

	public class BronzeOre : BaseOre
	{
		[Constructable]
		public BronzeOre() : this( 1 )
		{
		}

		[Constructable]
		public BronzeOre( int amount ) : base( CraftResource.Bronze, amount )
		{
			Name = "Bronze Ore";
		}

		public BronzeOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new BronzeOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new BronzeIngot();
		}
	}

	public class GoldOre : BaseOre
	{
		[Constructable]
		public GoldOre() : this( 1 )
		{
		}

		[Constructable]
		public GoldOre( int amount ) : base( CraftResource.Gold, amount )
		{
			Name = "Golden Ore";
		}

		public GoldOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new GoldOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new GoldIngot();
		}
	}

	public class AgapiteOre : BaseOre
	{
		[Constructable]
		public AgapiteOre() : this( 1 )
		{
		}

		[Constructable]
		public AgapiteOre( int amount ) : base( CraftResource.Agapite, amount )
		{
			Name = "Agapite Ore";
		}

		public AgapiteOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new AgapiteOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new AgapiteIngot();
		}
	}

	public class VeriteOre : BaseOre
	{
		[Constructable]
		public VeriteOre() : this( 1 )
		{
		}

		[Constructable]
		public VeriteOre( int amount ) : base( CraftResource.Verite, amount )
		{
			Name = "Verite Ore";
		}

		public VeriteOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new VeriteOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new VeriteIngot();
		}
	}

	public class ValoriteOre : BaseOre
	{
		[Constructable]
		public ValoriteOre() : this( 1 )
		{
		}

		[Constructable]
		public ValoriteOre( int amount ) : base( CraftResource.Valorite, amount )
		{
			Name = "Valorite Ore";
		}

		public ValoriteOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new ValoriteOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new ValoriteIngot();
		}
	}

	public class VolcaniteOre : BaseOre
	{
		[Constructable]
		public VolcaniteOre() : this( 1 )
		{
		}

		[Constructable]
		public VolcaniteOre( int amount ) : base( CraftResource.Volcanite, amount )
		{
			Name = "Volcanite Ore";
		}

		public VolcaniteOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new VolcaniteOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new VolcaniteIngot();
		}
	}
	public class SyeniteOre : BaseOre
	{
		[Constructable]
		public SyeniteOre() : this( 1 )
		{
		}

		[Constructable]
		public SyeniteOre( int amount ) : base( CraftResource.Syenite, amount )
		{
			Name = "Syenite Ore";
		}

		public SyeniteOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new SyeniteOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new SyeniteIngot();
		}
	}
	public class NitritonOre : BaseOre
	{
		[Constructable]
		public NitritonOre() : this( 1 )
		{
		}

		[Constructable]
		public NitritonOre( int amount ) : base( CraftResource.Nitriton, amount )
		{
			Name = "Nitriton Ore";
		}

		public NitritonOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new NitritonOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new NitritonIngot();
		}
	}
	public class QuartziteOre : BaseOre
	{
		[Constructable]
		public QuartziteOre() : this( 1 )
		{
		}

		[Constructable]
		public QuartziteOre( int amount ) : base( CraftResource.Quartzite, amount )
		{
			Name = "Quartzite Ore";
		}

		public QuartziteOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new QuartziteOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new QuartziteIngot();
		}
	}
	public class KyaniteOre : BaseOre
	{
		[Constructable]
		public KyaniteOre() : this( 1 )
		{
		}

		[Constructable]
		public KyaniteOre( int amount ) : base( CraftResource.Kyanite, amount )
		{
			Name = "Kyanite Ore";
		}

		public KyaniteOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new KyaniteOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new KyaniteIngot();
		}
	}

}
Leathers.cs:
Code:
using System;
using Server.Items;
using Server.Network;

namespace Server.Items
{
	public abstract class BaseLeather : Item, ICommodity
	{
		private CraftResource m_Resource;

		[CommandProperty( AccessLevel.GameMaster )]
		public CraftResource Resource
		{
			get{ return m_Resource; }
			set{ m_Resource = value; InvalidateProperties(); }
		}
		
		string ICommodity.Description
		{
			get
			{
				return String.Format( Amount == 1 ? "{0} piece of leather" : "{0} pieces of leather", Amount );
			}
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 1 ); // version

			writer.Write( (int) m_Resource );
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();

			switch ( version )
			{
				case 1:
				{
					m_Resource = (CraftResource)reader.ReadInt();
					break;
				}
				case 0:
				{
					OreInfo info = new OreInfo( reader.ReadInt(), reader.ReadInt(), reader.ReadString() );

					m_Resource = CraftResources.GetFromOreInfo( info );
					break;
				}
			}
		}

		public BaseLeather( CraftResource resource ) : this( resource, 1 )
		{
		}

		public BaseLeather( CraftResource resource, int amount ) : base( 0x1081 )
		{
			Stackable = true;
			Weight = 1.0;
			Amount = amount;
			Hue = CraftResources.GetHue( resource );

			m_Resource = resource;
		}

		public BaseLeather( Serial serial ) : base( serial )
		{
		}

		public override void AddNameProperty( ObjectPropertyList list )
		{
			if ( Amount > 1 )
				list.Add( 1050039, "{0}\t#{1}", Amount, 1024199 ); // ~1_NUMBER~ ~2_ITEMNAME~
			else
				list.Add( 1024199 ); // cut leather
		}

		public override void GetProperties( ObjectPropertyList list )
		{
			base.GetProperties( list );

			if ( !CraftResources.IsStandard( m_Resource ) )
			{
				int num = CraftResources.GetLocalizationNumber( m_Resource );

				if ( num > 0 )
					list.Add( num );
				else
					list.Add( CraftResources.GetName( m_Resource ) );
			}
		}

		public override int LabelNumber
		{
			get
			{
				if ( m_Resource >= CraftResource.SpinedLeather && m_Resource <= CraftResource.EtherealLeather )
					return 1049684 + (int)(m_Resource - CraftResource.SpinedLeather);

				return 1047022;
			}
		}
	}

	[FlipableAttribute( 0x1081, 0x1082 )]
	public class Leather : BaseLeather
	{
		[Constructable]
		public Leather() : this( 1 )
		{
		}

		[Constructable]
		public Leather( int amount ) : base( CraftResource.RegularLeather, amount )
		{
			Name = "Regular Leather";
		}

		public Leather( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new Leather( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1081, 0x1082 )]
	public class SpinedLeather : BaseLeather
	{
		[Constructable]
		public SpinedLeather() : this( 1 )
		{
		}

		[Constructable]
		public SpinedLeather( int amount ) : base( CraftResource.SpinedLeather, amount )
		{
			Name = "Spined Leather";
		}

		public SpinedLeather( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new SpinedLeather( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1081, 0x1082 )]
	public class HornedLeather : BaseLeather
	{
		[Constructable]
		public HornedLeather() : this( 1 )
		{
		}

		[Constructable]
		public HornedLeather( int amount ) : base( CraftResource.HornedLeather, amount )
		{
			Name = "Horned Leather";
		}

		public HornedLeather( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new HornedLeather( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1081, 0x1082 )]
	public class BarbedLeather : BaseLeather
	{
		[Constructable]
		public BarbedLeather() : this( 1 )
		{
		}

		[Constructable]
		public BarbedLeather( int amount ) : base( CraftResource.BarbedLeather, amount )
		{
			Name = "Barbed Leather";
		}

		public BarbedLeather( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new BarbedLeather( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1081, 0x1082 )]
	public class PolarLeather : BaseLeather
	{
		[Constructable]
		public PolarLeather() : this( 1 )
		{
		}

		[Constructable]
		public PolarLeather( int amount ) : base( CraftResource.PolarLeather, amount )
		{
			Name = "Polar Leather";
		}

		public PolarLeather( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new PolarLeather( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1081, 0x1082 )]
	public class SyntheticLeather : BaseLeather
	{
		[Constructable]
		public SyntheticLeather() : this( 1 )
		{
		}

		[Constructable]
		public SyntheticLeather( int amount ) : base( CraftResource.SyntheticLeather, amount )
		{
			Name = "Synthetic Leather";
		}

		public SyntheticLeather( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new SyntheticLeather( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1081, 0x1082 )]
	public class DaurianLeather : BaseLeather
	{
		[Constructable]
		public DaurianLeather() : this( 1 )
		{
		}

		[Constructable]
		public DaurianLeather( int amount ) : base( CraftResource.DaurianLeather, amount )
		{
			Name = "Daurian Leather";
		}

		public DaurianLeather( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DaurianLeather( amount ), amount );
		}
	}
	
	[FlipableAttribute( 0x1081, 0x1082 )]
	public class DaemonicLeather : BaseLeather
	{
		[Constructable]
		public DaemonicLeather() : this( 1 )
		{
		}

		[Constructable]
		public DaemonicLeather( int amount ) : base( CraftResource.DaemonicLeather, amount )
		{
			Name = "Daemonic Leather";
		}

		public DaemonicLeather( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DaemonicLeather( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1081, 0x1082 )]
	public class ShadowLeather : BaseLeather
	{
		[Constructable]
		public ShadowLeather() : this( 1 )
		{
		}

		[Constructable]
		public ShadowLeather( int amount ) : base( CraftResource.ShadowLeather, amount )
		{
			Name = "Shadow Leather";
		}

		public ShadowLeather( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new ShadowLeather( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1081, 0x1082 )]
	public class AranakLeather : BaseLeather
	{
		[Constructable]
		public AranakLeather() : this( 1 )
		{
		}

		[Constructable]
		public AranakLeather( int amount ) : base( CraftResource.AranakLeather, amount )
		{
			Name = "Aranak Leather";
		}

		public AranakLeather( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new AranakLeather( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1081, 0x1082 )]
	public class EtherealLeather : BaseLeather
	{
		[Constructable]
		public EtherealLeather() : this( 1 )
		{
		}

		[Constructable]
		public EtherealLeather( int amount ) : base( CraftResource.EtherealLeather, amount )
		{
			Name = "Ethereal Leather";
		}

		public EtherealLeather( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new EtherealLeather( amount ), amount );
		}
	}
}
Hides.cs:
Code:
using System;
using Server.Items;
using Server.Network;

namespace Server.Items
{
	public abstract class BaseHides : Item, ICommodity
	{
		private CraftResource m_Resource;

		[CommandProperty( AccessLevel.GameMaster )]
		public CraftResource Resource
		{
			get{ return m_Resource; }
			set{ m_Resource = value; InvalidateProperties(); }
		}
		
		string ICommodity.Description
		{
			get
			{
				return String.Format( Amount == 1 ? "{0} pile of hides" : "{0} piles of hides", Amount );
			}
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 1 ); // version

			writer.Write( (int) m_Resource );
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();

			switch ( version )
			{
				case 1:
				{
					m_Resource = (CraftResource)reader.ReadInt();
					break;
				}
				case 0:
				{
					OreInfo info = new OreInfo( reader.ReadInt(), reader.ReadInt(), reader.ReadString() );

					m_Resource = CraftResources.GetFromOreInfo( info );
					break;
				}
			}
		}

		public BaseHides( CraftResource resource ) : this( resource, 1 )
		{
		}

		public BaseHides( CraftResource resource, int amount ) : base( 0x1079 )
		{
			Stackable = true;
			Weight = 5.0;
			Amount = amount;
			Hue = CraftResources.GetHue( resource );
			m_Resource = resource;
		}

		public BaseHides( Serial serial ) : base( serial )
		{
		}

		public override void AddNameProperty( ObjectPropertyList list )
		{
			if ( Amount > 1 )
				list.Add( 1050039, "{0}\t#{1}", Amount, 1024216 ); // ~1_NUMBER~ ~2_ITEMNAME~
			else
				list.Add( 1024216 ); // pile of hides
		}

		public override void GetProperties( ObjectPropertyList list )
		{
			base.GetProperties( list );

			if ( !CraftResources.IsStandard( m_Resource ) )
			{
				int num = CraftResources.GetLocalizationNumber( m_Resource );

				if ( num > 0 )
					list.Add( num );
				else
					list.Add( CraftResources.GetName( m_Resource ) );
			}
		}

		public override int LabelNumber
		{
			get
			{
				if ( m_Resource >= CraftResource.SpinedLeather && m_Resource <= CraftResource.EtherealLeather )
					return 1049687 + (int)(m_Resource - CraftResource.SpinedLeather);

				return 1047023;
			}
		}
	}

	[FlipableAttribute( 0x1079, 0x1078 )]
	public class Hides : BaseHides, IScissorable
	{
		[Constructable]
		public Hides() : this( 1 )
		{
		}

		[Constructable]
		public Hides( int amount ) : base( CraftResource.RegularLeather, amount )
		{
			Name = "Regular Hides";
		}

		public Hides( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new Hides( amount ), amount );
		}

		public bool Scissor( Mobile from, Scissors scissors )
		{
			if ( Deleted || !from.CanSee( this ) ) return false;

			base.ScissorHelper( from, new Leather(), 1 );

			return true;
		}
	}

	[FlipableAttribute( 0x1079, 0x1078 )]
	public class SpinedHides : BaseHides, IScissorable
	{
		[Constructable]
		public SpinedHides() : this( 1 )
		{
		}

		[Constructable]
		public SpinedHides( int amount ) : base( CraftResource.SpinedLeather, amount )
		{
			Name = "Spined Hides";
		}

		public SpinedHides( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new SpinedHides( amount ), amount );
		}

		public bool Scissor( Mobile from, Scissors scissors )
		{
			if ( Deleted || !from.CanSee( this ) ) return false;

			base.ScissorHelper( from, new SpinedLeather(), 1 );

			return true;
		}
	}

	[FlipableAttribute( 0x1079, 0x1078 )]
	public class HornedHides : BaseHides, IScissorable
	{
		[Constructable]
		public HornedHides() : this( 1 )
		{
		}

		[Constructable]
		public HornedHides( int amount ) : base( CraftResource.HornedLeather, amount )
		{
			Name = "Horned Hides";
		}

		public HornedHides( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new HornedHides( amount ), amount );
		}

		public bool Scissor( Mobile from, Scissors scissors )
		{
			if ( Deleted || !from.CanSee( this ) ) return false;

			base.ScissorHelper( from, new HornedLeather(), 1 );

			return true;
		}
	}

	[FlipableAttribute( 0x1079, 0x1078 )]
	public class BarbedHides : BaseHides, IScissorable
	{
		[Constructable]
		public BarbedHides() : this( 1 )
		{
		}

		[Constructable]
		public BarbedHides( int amount ) : base( CraftResource.BarbedLeather, amount )
		{
			Name = "Barbed Hides";
		}

		public BarbedHides( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new BarbedHides( amount ), amount );
		}

		public bool Scissor( Mobile from, Scissors scissors )
		{
			if ( Deleted || !from.CanSee( this ) ) return false;

			base.ScissorHelper( from, new BarbedLeather(), 1 );

			return true;
		}
	}

	[FlipableAttribute( 0x1079, 0x1078 )]
	public class PolarHides : BaseHides, IScissorable
	{
		[Constructable]
		public PolarHides() : this( 1 )
		{
		}

		[Constructable]
		public PolarHides( int amount ) : base( CraftResource.PolarLeather, amount )
		{
			Name = "Polar Hides";
		}

		public PolarHides( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new PolarHides( amount ), amount );
		}

		public bool Scissor( Mobile from, Scissors scissors )
		{
			if ( Deleted || !from.CanSee( this ) ) return false;

			base.ScissorHelper( from, new PolarLeather(), 1 );

			return true;
		}
	}
	
	[FlipableAttribute( 0x1079, 0x1078 )]
	public class SyntheticHides : BaseHides, IScissorable
	{
		[Constructable]
		public SyntheticHides() : this( 1 )
		{
		}

		[Constructable]
		public SyntheticHides( int amount ) : base( CraftResource.SyntheticLeather, amount )
		{
			Name = "Synthetic Hides";
		}

		public SyntheticHides( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new SyntheticHides( amount ), amount );
		}

		public bool Scissor( Mobile from, Scissors scissors )
		{
			if ( Deleted || !from.CanSee( this ) ) return false;

			base.ScissorHelper( from, new SyntheticLeather(), 1 );

			return true;
		}
	}

	[FlipableAttribute( 0x1079, 0x1078 )]
	public class DaurianHides : BaseHides, IScissorable
	{
		[Constructable]
		public DaurianHides() : this( 1 )
		{
		}

		[Constructable]
		public DaurianHides( int amount ) : base( CraftResource.DaurianLeather, amount )
		{
			Name = "Daurian Hides";
		}

		public DaurianHides( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DaurianHides( amount ), amount );
		}

		public bool Scissor( Mobile from, Scissors scissors )
		{
			if ( Deleted || !from.CanSee( this ) ) return false;

			base.ScissorHelper( from, new DaurianLeather(), 1 );

			return true;
		}
	}

	[FlipableAttribute( 0x1079, 0x1078 )]
	public class DaemonicHides : BaseHides, IScissorable
	{
		[Constructable]
		public DaemonicHides() : this( 1 )
		{
		}

		[Constructable]
		public DaemonicHides( int amount ) : base( CraftResource.DaemonicLeather, amount )
		{
			Name = "Daemonic Hides";
		}

		public DaemonicHides( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DaemonicHides( amount ), amount );
		}

		public bool Scissor( Mobile from, Scissors scissors )
		{
			if ( Deleted || !from.CanSee( this ) ) return false;

			base.ScissorHelper( from, new DaemonicLeather(), 1 );

			return true;
		}
	}

	[FlipableAttribute( 0x1079, 0x1078 )]
	public class ShadowHides : BaseHides, IScissorable
	{
		[Constructable]
		public ShadowHides() : this( 1 )
		{
		}

		[Constructable]
		public ShadowHides( int amount ) : base( CraftResource.ShadowLeather, amount )
		{
			Name = "Shadow Hides";
		}

		public ShadowHides( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new ShadowHides( amount ), amount );
		}

		public bool Scissor( Mobile from, Scissors scissors )
		{
			if ( Deleted || !from.CanSee( this ) ) return false;

			base.ScissorHelper( from, new ShadowLeather(), 1 );

			return true;
		}
	}

	[FlipableAttribute( 0x1079, 0x1078 )]
	public class AranakHides : BaseHides, IScissorable
	{
		[Constructable]
		public AranakHides() : this( 1 )
		{
		}

		[Constructable]
		public AranakHides( int amount ) : base( CraftResource.AranakLeather, amount )
		{
			Name = "Aranak Hides";
		}

		public AranakHides( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new AranakHides( amount ), amount );
		}

		public bool Scissor( Mobile from, Scissors scissors )
		{
			if ( Deleted || !from.CanSee( this ) ) return false;

			base.ScissorHelper( from, new AranakLeather(), 1 );

			return true;
		}
	}

	[FlipableAttribute( 0x1079, 0x1078 )]
	public class EtherealHides : BaseHides, IScissorable
	{
		[Constructable]
		public EtherealHides() : this( 1 )
		{
		}

		[Constructable]
		public EtherealHides( int amount ) : base( CraftResource.EtherealLeather, amount )
		{
			Name = "Ethereal Hides";
		}

		public EtherealHides( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new EtherealHides( amount ), amount );
		}

		public bool Scissor( Mobile from, Scissors scissors )
		{
			if ( Deleted || !from.CanSee( this ) ) return false;

			base.ScissorHelper( from, new EtherealLeather(), 1 );

			return true;
		}
	}
}
Hope that helps man! Good luck!
 

Mr. Friday

Wanderer
Your system seems higly reliant on Daat's code. I am writing all of mine from scratch so that I can understand how it all works better. The list is very helpful, but I think I have already editted in all the scripts that need editting to simply add in new ores/ingots:

Code:
Mining.cs
Ore.cs
Ingots.cs
OreInfo.cs
DefBlacksmithy.cs
BaseArmor.cs
BaseWeapon.cs

Here are my Ore.cs and Ingots.cs, as you say, probably where the problems are. BTW, I noticed on difference is that at the bottom where specific ore classes are defined, I had no Name = "xxx"; line, as the distro script didn;t, so I added one in for all ores, and it didn't make a difference in game (still ~1_NOTHING~).

Ore.cs:
Code:
using System;
using Server.Items;
using Server.Network;
using Server.Targeting;
using Server.Engines.Craft;

namespace Server.Items
{
	public abstract class BaseOre : Item, ICommodity
	{
		private CraftResource m_Resource;

		[CommandProperty( AccessLevel.GameMaster )]
		public CraftResource Resource
		{
			get{ return m_Resource; }
			set{ m_Resource = value; InvalidateProperties(); }
		}

		string ICommodity.Description
		{
			get
			{
				return String.Format( "{0} {1} ore", Amount, CraftResources.GetName( m_Resource ).ToLower() );
			}
		}

		public abstract BaseIngot GetIngot();

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 1 ); // version

			writer.Write( (int) m_Resource );
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();

			switch ( version )
			{
				case 1:
				{
					m_Resource = (CraftResource)reader.ReadInt();
					break;
				}
				case 0:
				{
					OreInfo info;

					switch ( reader.ReadInt() )
					{
						case 0: info = OreInfo.Iron; break;
						case 1: info = OreInfo.DullCopper; break;
						case 2: info = OreInfo.ShadowIron; break;
						case 3: info = OreInfo.Copper; break;
						case 4: info = OreInfo.Bronze; break;
						case 5: info = OreInfo.Gold; break;
						case 6: info = OreInfo.Agapite; break;
						case 7: info = OreInfo.Verite; break;
						case 8: info = OreInfo.Valorite; break;
						case 9: info = OreInfo.Spike; break;
						case 10: info = OreInfo.IceRock; break;
						case 11: info = OreInfo.Gypsum; break;
						case 12: info = OreInfo.Platinum; break;
						case 13: info = OreInfo.SilverRock; break;
						case 14: info = OreInfo.DarkPagan; break;
						case 15: info = OreInfo.Mystic; break;
						case 16: info = OreInfo.Spectral; break;
						case 17: info = OreInfo.OldBritain; break;
						case 18: info = OreInfo.Onyx; break;
						case 19: info = OreInfo.RedElven; break;
						case 20: info = OreInfo.Undead; break;
						case 21: info = OreInfo.Pyrite; break;
						case 22: info = OreInfo.Virginity; break;
						case 23: info = OreInfo.Malachite; break;
						case 24: info = OreInfo.LavaRock; break;
						case 25: info = OreInfo.Azurite; break;
						case 26: info = OreInfo.Dripstone; break;
						case 27: info = OreInfo.Executor; break;
						case 28: info = OreInfo.Peachblue; break;
						case 29: info = OreInfo.Destruction; break;
						case 30: info = OreInfo.Anra; break;
						case 31: info = OreInfo.Crystal; break;
						case 32: info = OreInfo.Doom; break;
						case 33: info = OreInfo.Goddess; break;
						case 34: info = OreInfo.NewCarpathia; break;
						default: info = null; break;
					}

					m_Resource = CraftResources.GetFromOreInfo( info );
					break;
				}
			}
		}

		public BaseOre( CraftResource resource ) : this( resource, 1 )
		{
		}

		public BaseOre( CraftResource resource, int amount ) : base( 0x19B9 )
		{
			Stackable = true;
			Weight = 12.0;
			Amount = amount;
			Hue = CraftResources.GetHue( resource );

			m_Resource = resource;
		}

		public BaseOre( Serial serial ) : base( serial )
		{
		}

		public override void AddNameProperty( ObjectPropertyList list )
		{
			if ( Amount > 1 )
				list.Add( 1050039, "{0}\t#{1}", Amount, 1026583 ); // ~1_NUMBER~ ~2_ITEMNAME~
			else
				list.Add( 1026583 ); // ore
		}

		public override void GetProperties( ObjectPropertyList list )
		{
			base.GetProperties( list );

			if ( !CraftResources.IsStandard( m_Resource ) )
			{
				int num = CraftResources.GetLocalizationNumber( m_Resource );

				if ( num > 0 )
					list.Add( num );
				else
					list.Add( CraftResources.GetName( m_Resource ) );
			}
		}

		public override int LabelNumber
		{
			get
			{
				if ( m_Resource >= CraftResource.DullCopper && m_Resource <= CraftResource.Valorite )
					return 1042845 + (int)(m_Resource - CraftResource.DullCopper);

				return 1042853; // iron ore;
			}
		}

		public override void OnDoubleClick( Mobile from )
		{
			if ( !Movable )
				return;

			if ( from.InRange( this.GetWorldLocation(), 2 ) )
			{
				from.SendLocalizedMessage( 501971 ); // Select the forge on which to smelt the ore, or another pile of ore with which to combine it.
				from.Target = new InternalTarget( this );
			}
			else
			{
				from.SendLocalizedMessage( 501976 ); // The ore is too far away.
			}
		}

		private class InternalTarget : Target
		{
			private BaseOre m_Ore;

			public InternalTarget( BaseOre ore ) :  base ( 2, false, TargetFlags.None )
			{
				m_Ore = ore;
			}

			private bool IsForge( object obj )
			{
				if ( obj.GetType().IsDefined( typeof( ForgeAttribute ), false ) )
					return true;

				int itemID = 0;

				if ( obj is Item )
					itemID = ((Item)obj).ItemID;
				else if ( obj is StaticTarget )
					itemID = ((StaticTarget)obj).ItemID & 0x3FFF;

				return ( itemID == 4017 || (itemID >= 6522 && itemID <= 6569) );
			}

			protected override void OnTarget( Mobile from, object targeted )
			{
				if ( m_Ore.Deleted )
					return;

				if ( !from.InRange( m_Ore.GetWorldLocation(), 2 ) )
				{
					from.SendLocalizedMessage( 501976 ); // The ore is too far away.
					return;
				}

				if ( IsForge( targeted ) )
				{
					double difficulty;

					switch ( m_Ore.Resource )
					{
						default: difficulty = 50.0; break;
						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;
						case CraftResource.Spike: difficulty = 111.0; break;
						case CraftResource.IceRock: difficulty = 114.0; break;
						case CraftResource.Gypsum: difficulty = 117.0; break;
						case CraftResource.Platinum: difficulty = 120.0; break;
						case CraftResource.SilverRock: difficulty = 121.0; break;
						case CraftResource.DarkPagan: difficulty = 122.0; break;
						case CraftResource.Mystic: difficulty = 123.0; break;
						case CraftResource.Spectral: difficulty = 124.0; break;
						case CraftResource.OldBritain: difficulty = 125.0; break;
						case CraftResource.Onyx: difficulty = 126.0; break;
						case CraftResource.RedElven: difficulty = 127.0; break;
						case CraftResource.Undead: difficulty = 128.0; break;
						case CraftResource.Pyrite: difficulty = 129.0; break;
						case CraftResource.Virginity: difficulty = 130.0; break;
						case CraftResource.Malachite: difficulty = 131.0; break;
						case CraftResource.LavaRock: difficulty = 132.0; break;
						case CraftResource.Azurite: difficulty = 133.0; break;
						case CraftResource.Dripstone: difficulty = 134.0; break;
						case CraftResource.Executor: difficulty = 135.0; break;
						case CraftResource.Peachblue: difficulty = 136.0; break;
						case CraftResource.Destruction: difficulty = 137.0; break;
						case CraftResource.Anra: difficulty = 137.5; break;
						case CraftResource.Crystal: difficulty = 138.0; break;
						case CraftResource.Doom: difficulty = 138.5; break;
						case CraftResource.Goddess: difficulty = 139.0; break;
						case CraftResource.NewCarpathia: difficulty = 149.0; break;
					}

					double minSkill = difficulty - 25.0;
					double maxSkill = difficulty + 25.0;
					
					if ( difficulty > 50.0 && difficulty > from.Skills[SkillName.Mining].Value )
					{
						from.SendLocalizedMessage( 501986 ); // You have no idea how to smelt this strange ore!
						return;
					}

					if ( from.CheckTargetSkill( SkillName.Mining, targeted, minSkill, maxSkill ) )
					{
						int toConsume = m_Ore.Amount;

						if ( toConsume <= 0 )
						{
							from.SendLocalizedMessage( 501987 ); // There is not enough metal-bearing ore in this pile to make an ingot.
						}
						else
						{
							if ( toConsume > 30000 )
								toConsume = 30000;

							BaseIngot ingot = m_Ore.GetIngot();
							ingot.Amount = toConsume * 2;

							m_Ore.Consume( toConsume );
							from.AddToBackpack( ingot );
							//from.PlaySound( 0x57 );


							from.SendLocalizedMessage( 501988 ); // You smelt the ore removing the impurities and put the metal in your backpack.
						}
					}
					else if ( m_Ore.Amount < 2 )
					{
						from.SendLocalizedMessage( 501989 ); // You burn away the impurities but are left with no useable metal.
						m_Ore.Delete();
					}
					else
					{
						from.SendLocalizedMessage( 501990 ); // You burn away the impurities but are left with less useable metal.
						m_Ore.Amount /= 2;
					}
				}
			}
		}
	}

	public class IronOre : BaseOre
	{
		[Constructable]
		public IronOre() : this( 1 )
		{
		}

		[Constructable]
		public IronOre( int amount ) : base( CraftResource.Iron, amount )
		{
			Name = "Iron";
		}

		public IronOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new IronOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new IronIngot();
		}
	}

	public class DullCopperOre : BaseOre
	{
		[Constructable]
		public DullCopperOre() : this( 1 )
		{
		}

		[Constructable]
		public DullCopperOre( int amount ) : base( CraftResource.DullCopper, amount )
		{
			Name = "Dull Copper";
		}

		public DullCopperOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DullCopperOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new DullCopperIngot();
		}
	}

	public class ShadowIronOre : BaseOre
	{
		[Constructable]
		public ShadowIronOre() : this( 1 )
		{
		}

		[Constructable]
		public ShadowIronOre( int amount ) : base( CraftResource.ShadowIron, amount )
		{
			Name = "Shadow Iron";
		}

		public ShadowIronOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new ShadowIronOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new ShadowIronIngot();
		}
	}

	public class CopperOre : BaseOre
	{
		[Constructable]
		public CopperOre() : this( 1 )
		{
		}

		[Constructable]
		public CopperOre( int amount ) : base( CraftResource.Copper, amount )
		{
			Name = "Copper";
		}

		public CopperOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new CopperOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new CopperIngot();
		}
	}

	public class BronzeOre : BaseOre
	{
		[Constructable]
		public BronzeOre() : this( 1 )
		{
		}

		[Constructable]
		public BronzeOre( int amount ) : base( CraftResource.Bronze, amount )
		{
			Name = "Bronze";
		}

		public BronzeOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new BronzeOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new BronzeIngot();
		}
	}

	public class GoldOre : BaseOre
	{
		[Constructable]
		public GoldOre() : this( 1 )
		{
		}

		[Constructable]
		public GoldOre( int amount ) : base( CraftResource.Gold, amount )
		{
			Name = "Gold";
		}

		public GoldOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new GoldOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new GoldIngot();
		}
	}

	public class AgapiteOre : BaseOre
	{
		[Constructable]
		public AgapiteOre() : this( 1 )
		{
		}

		[Constructable]
		public AgapiteOre( int amount ) : base( CraftResource.Agapite, amount )
		{
			Name = "Agapite";
		}

		public AgapiteOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new AgapiteOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new AgapiteIngot();
		}
	}

	public class VeriteOre : BaseOre
	{
		[Constructable]
		public VeriteOre() : this( 1 )
		{
		}

		[Constructable]
		public VeriteOre( int amount ) : base( CraftResource.Verite, amount )
		{
			Name = "Verite";
		}

		public VeriteOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new VeriteOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new VeriteIngot();
		}
	}

	public class ValoriteOre : BaseOre
	{
		[Constructable]
		public ValoriteOre() : this( 1 )
		{
		}

		[Constructable]
		public ValoriteOre( int amount ) : base( CraftResource.Valorite, amount )
		{
			Name = "Valorite";
		}

		public ValoriteOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new ValoriteOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new ValoriteIngot();
		}
	}
	
	public class SpikeOre : BaseOre
	{
		[Constructable]
		public SpikeOre() : this( 1 )
		{
		}

		[Constructable]
		public SpikeOre( int amount ) : base( CraftResource.Spike, amount )
		{
			Name = "Spike";
		}

		public SpikeOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new SpikeOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new SpikeIngot();
		}
	}
	 
	 public class IceRockOre : BaseOre
	{
		[Constructable]
		public IceRockOre() : this( 1 )
		{
		}

		[Constructable]
		public IceRockOre( int amount ) : base( CraftResource.IceRock, amount )
		{
			Name = "Ice Rock";
		}

		public IceRockOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new IceRockOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new IceRockIngot();
		}
	}
	 
	 public class GypsumOre : BaseOre
	{
		[Constructable]
		public GypsumOre() : this( 1 )
		{
		}

		[Constructable]
		public GypsumOre( int amount ) : base( CraftResource.Gypsum, amount )
		{
			Name = "Gypsum";
		}

		public GypsumOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new GypsumOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new GypsumIngot();
		}
	}
	 
	 public class PlatinumOre : BaseOre
	{
		[Constructable]
		public PlatinumOre() : this( 1 )
		{
		}

		[Constructable]
		public PlatinumOre( int amount ) : base( CraftResource.Platinum, amount )
		{
			Name = "Platinum";
		}

		public PlatinumOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new PlatinumOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new PlatinumIngot();
		}
	}
	 
	 public class SilverRockOre : BaseOre
	{
		[Constructable]
		public SilverRockOre() : this( 1 )
		{
		}

		[Constructable]
		public SilverRockOre( int amount ) : base( CraftResource.SilverRock, amount )
		{
			Name = "Silver Rock";
		}

		public SilverRockOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new SilverRockOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new SilverRockIngot();
		}
	}
	 
	 public class DarkPaganOre : BaseOre
	{
		[Constructable]
		public DarkPaganOre() : this( 1 )
		{
		}

		[Constructable]
		public DarkPaganOre( int amount ) : base( CraftResource.DarkPagan, amount )
		{
			Name = "Dark Pagan";
		}

		public DarkPaganOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DarkPaganOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new DarkPaganIngot();
		}
	}
	 
	 public class MysticOre : BaseOre
	{
		[Constructable]
		public MysticOre() : this( 1 )
		{
		}

		[Constructable]
		public MysticOre( int amount ) : base( CraftResource.Mystic, amount )
		{
			Name = "Mystic";
		}

		public MysticOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new MysticOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new MysticIngot();
		}
	}
	 
	 public class SpectralOre : BaseOre
	{
		[Constructable]
		public SpectralOre() : this( 1 )
		{
		}

		[Constructable]
		public SpectralOre( int amount ) : base( CraftResource.Spectral, amount )
		{
			Name = "Spectral";
		}

		public SpectralOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new SpectralOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new SpectralIngot();
		}
	}
	 
	 public class OldBritainOre : BaseOre
	{
		[Constructable]
		public OldBritainOre() : this( 1 )
		{
		}

		[Constructable]
		public OldBritainOre( int amount ) : base( CraftResource.OldBritain, amount )
		{
			Name = "Old Britain";
		}

		public OldBritainOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new OldBritainOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new OldBritainIngot();
		}
	}
	
	 public class OnyxOre : BaseOre
	{
		[Constructable]
		public OnyxOre() : this( 1 )
		{
		}

		[Constructable]
		public OnyxOre( int amount ) : base( CraftResource.Onyx, amount )
		{
			Name = "Onyx";
		}

		public OnyxOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new OnyxOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new OnyxIngot();
		}
	}
	 
	 public class RedElvenOre : BaseOre
	{
		[Constructable]
		public RedElvenOre() : this( 1 )
		{
		}

		[Constructable]
		public RedElvenOre( int amount ) : base( CraftResource.RedElven, amount )
		{
			Name = "Red Elven";
		}

		public RedElvenOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new RedElvenOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new RedElvenIngot();
		}
	}
	 
	 public class UndeadOre : BaseOre
	{
		[Constructable]
		public UndeadOre() : this( 1 )
		{
		}

		[Constructable]
		public UndeadOre( int amount ) : base( CraftResource.Undead, amount )
		{
			Name = "Undead";
		}

		public UndeadOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new UndeadOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new UndeadIngot();
		}
	}
	 
	 public class PyriteOre : BaseOre
	{
		[Constructable]
		public PyriteOre() : this( 1 )
		{
		}

		[Constructable]
		public PyriteOre( int amount ) : base( CraftResource.Pyrite, amount )
		{
			Name = "Pyrite";
		}

		public PyriteOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new PyriteOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new PyriteIngot();
		}
	}
	 
	 public class VirginityOre : BaseOre
	{
		[Constructable]
		public VirginityOre() : this( 1 )
		{
		}

		[Constructable]
		public VirginityOre( int amount ) : base( CraftResource.Virginity, amount )
		{
			Name = "Virginity";
		}

		public VirginityOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new VirginityOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new VirginityIngot();
		}
	}
	 
	 public class MalachiteOre : BaseOre
	{
		[Constructable]
		public MalachiteOre() : this( 1 )
		{
		}

		[Constructable]
		public MalachiteOre( int amount ) : base( CraftResource.Malachite, amount )
		{
			Name = "Malachite";
		}

		public MalachiteOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new MalachiteOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new MalachiteIngot();
		}
	}
	 
	 public class LavaRockOre : BaseOre
	{
		[Constructable]
		public LavaRockOre() : this( 1 )
		{
		}

		[Constructable]
		public LavaRockOre( int amount ) : base( CraftResource.LavaRock, amount )
		{
			Name = "Lava Rock";
		}

		public LavaRockOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new LavaRockOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new LavaRockIngot();
		}
	}
	 
	 public class AzuriteOre : BaseOre
	{
		[Constructable]
		public AzuriteOre() : this( 1 )
		{
		}

		[Constructable]
		public AzuriteOre( int amount ) : base( CraftResource.Azurite, amount )
		{
			Name = "Azurite";
		}

		public AzuriteOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new AzuriteOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new AzuriteIngot();
		}
	}
	 
	 public class DripStoneOre : BaseOre
	{
		[Constructable]
		public DripStoneOre() : this( 1 )
		{
		}

		[Constructable]
		public DripStoneOre( int amount ) : base( CraftResource.Dripstone, amount )
		{
			Name = "Dripstone";
		}

		public DripStoneOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DripStoneOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new DripStoneIngot();
		}
	}
	 
	 public class ExecutorOre : BaseOre
	{
		[Constructable]
		public ExecutorOre() : this( 1 )
		{
		}

		[Constructable]
		public ExecutorOre( int amount ) : base( CraftResource.Executor, amount )
		{
			Name = "Executor";
		}

		public ExecutorOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new ExecutorOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new ExecutorIngot();
		}
	}
	 
	 public class PeachblueOre : BaseOre
	{
		[Constructable]
		public PeachblueOre() : this( 1 )
		{
		}

		[Constructable]
		public PeachblueOre( int amount ) : base( CraftResource.Peachblue, amount )
		{
			Name = "Peachblue";
		}

		public PeachblueOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new PeachblueOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new PeachblueIngot();
		}
	}
	 
	 public class DestructionOre : BaseOre
	{
		[Constructable]
		public DestructionOre() : this( 1 )
		{
		}

		[Constructable]
		public DestructionOre( int amount ) : base( CraftResource.Destruction, amount )
		{
			Name = "Destruction";
		}

		public DestructionOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DestructionOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new DestructionIngot();
		}
	}
	 
	 public class AnraOre : BaseOre
	{
		[Constructable]
		public AnraOre() : this( 1 )
		{
		}

		[Constructable]
		public AnraOre( int amount ) : base( CraftResource.Anra, amount )
		{
			Name = "Anra";
		}

		public AnraOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new AnraOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new AnraIngot();
		}
	}
	 
	 public class CrystalOre : BaseOre
	{
		[Constructable]
		public CrystalOre() : this( 1 )
		{
		}

		[Constructable]
		public CrystalOre( int amount ) : base( CraftResource.Crystal, amount )
		{
			Name = "Crystal";
		}

		public CrystalOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new CrystalOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new CrystalIngot();
		}
	}
	 
	 public class DoomOre : BaseOre
	{
		[Constructable]
		public DoomOre() : this( 1 )
		{
		}

		[Constructable]
		public DoomOre( int amount ) : base( CraftResource.Doom, amount )
		{
			Name = "Doom";
		}

		public DoomOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DoomOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new DoomIngot();
		}
	}
	 
	 public class GoddessOre : BaseOre
	{
		[Constructable]
		public GoddessOre() : this( 1 )
		{
		}

		[Constructable]
		public GoddessOre( int amount ) : base( CraftResource.Goddess, amount )
		{
			Name = "Goddess";
		}

		public GoddessOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new GoddessOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new GoddessIngot();
		}
	}
	 
	 public class NewCarpathiaOre : BaseOre
	{
		[Constructable]
		public NewCarpathiaOre() : this( 1 )
		{
		}

		[Constructable]
		public NewCarpathiaOre( int amount ) : base( CraftResource.NewCarpathia, amount )
		{
			Name = "New Carpathia";
		}

		public NewCarpathiaOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new NewCarpathiaOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new NewCarpathiaIngot();
		}
	}
}

Ingots.cs:

Code:
using System;
using Server.Items;
using Server.Network;

namespace Server.Items
{
	public abstract class BaseIngot : Item, ICommodity
	{
		private CraftResource m_Resource;

		[CommandProperty( AccessLevel.GameMaster )]
		public CraftResource Resource
		{
			get{ return m_Resource; }
			set{ m_Resource = value; InvalidateProperties(); }
		}
		
		string ICommodity.Description
		{
			get
			{
				return String.Format( Amount == 1 ? "{0} {1} ingot" : "{0} {1} ingots", Amount, CraftResources.GetName( m_Resource ).ToLower() );
			}
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 1 ); // version

			writer.Write( (int) m_Resource );
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();

			switch ( version )
			{
				case 1:
				{
					m_Resource = (CraftResource)reader.ReadInt();
					break;
				}
				case 0:
				{
					OreInfo info;

					switch ( reader.ReadInt() )
					{
						case 0: info = OreInfo.Iron; break;
						case 1: info = OreInfo.DullCopper; break;
						case 2: info = OreInfo.ShadowIron; break;
						case 3: info = OreInfo.Copper; break;
						case 4: info = OreInfo.Bronze; break;
						case 5: info = OreInfo.Gold; break;
						case 6: info = OreInfo.Agapite; break;
						case 7: info = OreInfo.Verite; break;
						case 8: info = OreInfo.Valorite; break;
						case 9: info = OreInfo.Spike; break;
						case 10: info = OreInfo.IceRock; break;
						case 11: info = OreInfo.Gypsum; break;
						case 12: info = OreInfo.Platinum; break;
						case 13: info = OreInfo.SilverRock; break;
						case 14: info = OreInfo.DarkPagan; break;
						case 15: info = OreInfo.Mystic; break;
						case 16: info = OreInfo.Spectral; break;
						case 17: info = OreInfo.OldBritain; break;
						case 18: info = OreInfo.Onyx; break;
						case 19: info = OreInfo.RedElven; break;
						case 20: info = OreInfo.Undead; break;
						case 21: info = OreInfo.Pyrite; break;
						case 22: info = OreInfo.Virginity; break;
						case 23: info = OreInfo.Malachite; break;
						case 24: info = OreInfo.LavaRock; break;
						case 25: info = OreInfo.Azurite; break;
						case 26: info = OreInfo.Dripstone; break;
						case 27: info = OreInfo.Executor; break;
						case 28: info = OreInfo.Peachblue; break;
						case 29: info = OreInfo.Destruction; break;
						case 30: info = OreInfo.Anra; break;
						case 31: info = OreInfo.Crystal; break;
						case 32: info = OreInfo.Doom; break;
						case 33: info = OreInfo.Goddess; break;
						case 34: info = OreInfo.NewCarpathia; break;
						default: info = null; break;
					}

					m_Resource = CraftResources.GetFromOreInfo( info );
					break;
				}
			}
		}

		public BaseIngot( CraftResource resource ) : this( resource, 1 )
		{
		}

		public BaseIngot( CraftResource resource, int amount ) : base( 0x1BF2 )
		{
			Stackable = true;
			Weight = 0.1;
			Amount = amount;
			Hue = CraftResources.GetHue( resource );

			m_Resource = resource;
		}

		public BaseIngot( Serial serial ) : base( serial )
		{
		}

		public override void AddNameProperty( ObjectPropertyList list )
		{
			if ( Amount > 1 )
				list.Add( 1050039, "{0}\t#{1}", Amount, 1027154 ); // ~1_NUMBER~ ~2_ITEMNAME~
			else
				list.Add( 1027154 ); // ingots
		}

		public override void GetProperties( ObjectPropertyList list )
		{
			base.GetProperties( list );

			if ( !CraftResources.IsStandard( m_Resource ) )
			{
				int num = CraftResources.GetLocalizationNumber( m_Resource );

				if ( num > 0 )
					list.Add( num );
				else
					list.Add( CraftResources.GetName( m_Resource ) );
			}
		}

		public override int LabelNumber
		{
			get
			{
				if ( m_Resource >= CraftResource.DullCopper && m_Resource <= CraftResource.Valorite )
					return 1042684 + (int)(m_Resource - CraftResource.DullCopper);

				return 1042692;
			}
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class IronIngot : BaseIngot
	{
		[Constructable]
		public IronIngot() : this( 1 )
		{
		}

		[Constructable]
		public IronIngot( int amount ) : base( CraftResource.Iron, amount )
		{
		}

		public IronIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new IronIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class DullCopperIngot : BaseIngot
	{
		[Constructable]
		public DullCopperIngot() : this( 1 )
		{
		}

		[Constructable]
		public DullCopperIngot( int amount ) : base( CraftResource.DullCopper, amount )
		{
		}

		public DullCopperIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DullCopperIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class ShadowIronIngot : BaseIngot
	{
		[Constructable]
		public ShadowIronIngot() : this( 1 )
		{
		}

		[Constructable]
		public ShadowIronIngot( int amount ) : base( CraftResource.ShadowIron, amount )
		{
		}

		public ShadowIronIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new ShadowIronIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class CopperIngot : BaseIngot
	{
		[Constructable]
		public CopperIngot() : this( 1 )
		{
		}

		[Constructable]
		public CopperIngot( int amount ) : base( CraftResource.Copper, amount )
		{
		}

		public CopperIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new CopperIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class BronzeIngot : BaseIngot
	{
		[Constructable]
		public BronzeIngot() : this( 1 )
		{
		}

		[Constructable]
		public BronzeIngot( int amount ) : base( CraftResource.Bronze, amount )
		{
		}

		public BronzeIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new BronzeIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class GoldIngot : BaseIngot
	{
		[Constructable]
		public GoldIngot() : this( 1 )
		{
		}

		[Constructable]
		public GoldIngot( int amount ) : base( CraftResource.Gold, amount )
		{
		}

		public GoldIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new GoldIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class AgapiteIngot : BaseIngot
	{
		[Constructable]
		public AgapiteIngot() : this( 1 )
		{
		}

		[Constructable]
		public AgapiteIngot( int amount ) : base( CraftResource.Agapite, amount )
		{
		}

		public AgapiteIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new AgapiteIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class VeriteIngot : BaseIngot
	{
		[Constructable]
		public VeriteIngot() : this( 1 )
		{
		}

		[Constructable]
		public VeriteIngot( int amount ) : base( CraftResource.Verite, amount )
		{
		}

		public VeriteIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new VeriteIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class ValoriteIngot : BaseIngot
	{
		[Constructable]
		public ValoriteIngot() : this( 1 )
		{
		}

		[Constructable]
		public ValoriteIngot( int amount ) : base( CraftResource.Valorite, amount )
		{
		}

		public ValoriteIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new ValoriteIngot( amount ), amount );
		}
	}
	
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class SpikeIngot : BaseIngot
	{
		[Constructable]
		public SpikeIngot() : this( 1 )
		{
		}

		[Constructable]
		public SpikeIngot( int amount ) : base( CraftResource.Spike, amount )
		{
		}

		public SpikeIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new SpikeIngot( amount ), amount );
		}
	}
	
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class IceRockIngot : BaseIngot
	{
		[Constructable]
		public IceRockIngot() : this( 1 )
		{
		}

		[Constructable]
		public IceRockIngot( int amount ) : base( CraftResource.IceRock, amount )
		{
		}

		public IceRockIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new IceRockIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class GypsumIngot : BaseIngot
	{
		[Constructable]
		public GypsumIngot() : this( 1 )
		{
		}

		[Constructable]
		public GypsumIngot( int amount ) : base( CraftResource.Gypsum, amount )
		{
		}

		public GypsumIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new GypsumIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class PlatinumIngot : BaseIngot
	{
		[Constructable]
		public PlatinumIngot() : this( 1 )
		{
		}

		[Constructable]
		public PlatinumIngot( int amount ) : base( CraftResource.Platinum, amount )
		{
		}

		public PlatinumIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new PlatinumIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class SilverRockIngot : BaseIngot
	{
		[Constructable]
		public SilverRockIngot() : this( 1 )
		{
		}

		[Constructable]
		public SilverRockIngot( int amount ) : base( CraftResource.SilverRock, amount )
		{
		}

		public SilverRockIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new SilverRockIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class DarkPaganIngot : BaseIngot
	{
		[Constructable]
		public DarkPaganIngot() : this( 1 )
		{
		}

		[Constructable]
		public DarkPaganIngot( int amount ) : base( CraftResource.DarkPagan, amount )
		{
		}

		public DarkPaganIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DarkPaganIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class MysticIngot : BaseIngot
	{
		[Constructable]
		public MysticIngot() : this( 1 )
		{
		}

		[Constructable]
		public MysticIngot( int amount ) : base( CraftResource.Mystic, amount )
		{
		}

		public MysticIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new MysticIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class SpectralIngot : BaseIngot
	{
		[Constructable]
		public SpectralIngot() : this( 1 )
		{
		}

		[Constructable]
		public SpectralIngot( int amount ) : base( CraftResource.Spectral, amount )
		{
		}

		public SpectralIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new SpectralIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class OldBritainIngot : BaseIngot
	{
		[Constructable]
		public OldBritainIngot() : this( 1 )
		{
		}

		[Constructable]
		public OldBritainIngot( int amount ) : base( CraftResource.OldBritain, amount )
		{
		}

		public OldBritainIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new OldBritainIngot( amount ), amount );
		}
	}
	
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class OnyxIngot : BaseIngot
	{
		[Constructable]
		public OnyxIngot() : this( 1 )
		{
		}

		[Constructable]
		public OnyxIngot( int amount ) : base( CraftResource.Onyx, amount )
		{
		}

		public OnyxIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new OnyxIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class RedElvenIngot : BaseIngot
	{
		[Constructable]
		public RedElvenIngot() : this( 1 )
		{
		}

		[Constructable]
		public RedElvenIngot( int amount ) : base( CraftResource.RedElven, amount )
		{
		}

		public RedElvenIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new RedElvenIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class UndeadIngot : BaseIngot
	{
		[Constructable]
		public UndeadIngot() : this( 1 )
		{
		}

		[Constructable]
		public UndeadIngot( int amount ) : base( CraftResource.Undead, amount )
		{
		}

		public UndeadIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new UndeadIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class PyriteIngot : BaseIngot
	{
		[Constructable]
		public PyriteIngot() : this( 1 )
		{
		}

		[Constructable]
		public PyriteIngot( int amount ) : base( CraftResource.Pyrite, amount )
		{
		}

		public PyriteIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new PyriteIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class VirginityIngot : BaseIngot
	{
		[Constructable]
		public VirginityIngot() : this( 1 )
		{
		}

		[Constructable]
		public VirginityIngot( int amount ) : base( CraftResource.Virginity, amount )
		{
		}

		public VirginityIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new VirginityIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class MalachiteIngot : BaseIngot
	{
		[Constructable]
		public MalachiteIngot() : this( 1 )
		{
		}

		[Constructable]
		public MalachiteIngot( int amount ) : base( CraftResource.Malachite, amount )
		{
		}

		public MalachiteIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new MalachiteIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class LavaRockIngot : BaseIngot
	{
		[Constructable]
		public LavaRockIngot() : this( 1 )
		{
		}

		[Constructable]
		public LavaRockIngot( int amount ) : base( CraftResource.LavaRock, amount )
		{
		}

		public LavaRockIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new LavaRockIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class AzuriteIngot : BaseIngot
	{
		[Constructable]
		public AzuriteIngot() : this( 1 )
		{
		}

		[Constructable]
		public AzuriteIngot( int amount ) : base( CraftResource.Azurite, amount )
		{
		}

		public AzuriteIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new AzuriteIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class DripStoneIngot : BaseIngot
	{
		[Constructable]
		public DripStoneIngot() : this( 1 )
		{
		}

		[Constructable]
		public DripStoneIngot( int amount ) : base( CraftResource.Dripstone, amount )
		{
		}

		public DripStoneIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DripStoneIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class ExecutorIngot : BaseIngot
	{
		[Constructable]
		public ExecutorIngot() : this( 1 )
		{
		}

		[Constructable]
		public ExecutorIngot( int amount ) : base( CraftResource.Executor, amount )
		{
		}

		public ExecutorIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new ExecutorIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class PeachblueIngot : BaseIngot
	{
		[Constructable]
		public PeachblueIngot() : this( 1 )
		{
		}

		[Constructable]
		public PeachblueIngot( int amount ) : base( CraftResource.Peachblue, amount )
		{
		}

		public PeachblueIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new PeachblueIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class DestructionIngot : BaseIngot
	{
		[Constructable]
		public DestructionIngot() : this( 1 )
		{
		}

		[Constructable]
		public DestructionIngot( int amount ) : base( CraftResource.Destruction, amount )
		{
		}

		public DestructionIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DestructionIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class AnraIngot : BaseIngot
	{
		[Constructable]
		public AnraIngot() : this( 1 )
		{
		}

		[Constructable]
		public AnraIngot( int amount ) : base( CraftResource.Anra, amount )
		{
		}

		public AnraIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new AnraIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class CrystalIngot : BaseIngot
	{
		[Constructable]
		public CrystalIngot() : this( 1 )
		{
		}

		[Constructable]
		public CrystalIngot( int amount ) : base( CraftResource.Crystal, amount )
		{
		}

		public CrystalIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new CrystalIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class DoomIngot : BaseIngot
	{
		[Constructable]
		public DoomIngot() : this( 1 )
		{
		}

		[Constructable]
		public DoomIngot( int amount ) : base( CraftResource.Doom, amount )
		{
		}

		public DoomIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DoomIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class GoddessIngot : BaseIngot
	{
		[Constructable]
		public GoddessIngot() : this( 1 )
		{
		}

		[Constructable]
		public GoddessIngot( int amount ) : base( CraftResource.Goddess, amount )
		{
		}

		public GoddessIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new GoddessIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class NewCarpathiaIngot : BaseIngot
	{
		[Constructable]
		public NewCarpathiaIngot() : this( 1 )
		{
		}

		[Constructable]
		public NewCarpathiaIngot( int amount ) : base( CraftResource.NewCarpathia, amount )
		{
		}

		public NewCarpathiaIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new NewCarpathiaIngot( amount ), amount );
		}
	}
}
 

Joeku

Lord
Alright... go in-game and see what the name property is (i.e. [Get Name). Then post it here.

***EDIT***
On the ores, I mean. If it is showing the Name Property as what it is supposed to be, then there is something wrong in your OreInfo.cs most likely.

***RE-EDIT***
Also, post your entire OreInfo.cs please.
 

Mr. Friday

Wanderer
Full OreInfo.cs can be found in the first post in this thread.

Also, since adding the Name = "xxx"; line to Ore.cs classes when I do [get name on the ore it returns the correct name (yet still displays ~1_NOTHING~). However, [get name yeilds - null - for the ingots still, so I will be adding in the Name line in Ingots.cs now as well.

I suppose there is something wrong in OreInfo.cs.

I will repost it here:

Code:
using System;
using System.Collections;

namespace Server.Items
{
	public enum CraftResource
	{
		None = 0,
		Iron = 1,
		DullCopper,
		ShadowIron,
		Copper,
		Bronze,
		Gold,
		Agapite,
		Verite,
		Valorite,
		Spike,
		IceRock,
		Gypsum,
		Platinum,
		SilverRock,
		DarkPagan,
		Mystic,
		Spectral,
		OldBritain,
		Onyx,
		RedElven,
		Undead,
		Pyrite,
		Virginity,
		Malachite,
		LavaRock,
		Azurite,
		Dripstone,
		Executor,
		Peachblue,
		Destruction,
		Anra,
		Crystal,
		Doom,
		Goddess,
		NewCarpathia,

		RegularLeather = 101,
		SpinedLeather,
		HornedLeather,
		BarbedLeather,

		RedScales = 201,
		YellowScales,
		BlackScales,
		GreenScales,
		WhiteScales,
		BlueScales
	}

	public enum CraftResourceType
	{
		None,
		Metal,
		Leather,
		Scales
	}

	public class CraftAttributeInfo
	{
		private int m_WeaponFireDamage;
		private int m_WeaponColdDamage;
		private int m_WeaponPoisonDamage;
		private int m_WeaponEnergyDamage;
		private int m_WeaponDurability;
		private int m_WeaponLuck;
		private int m_WeaponGoldIncrease;
		private int m_WeaponLowerRequirements;
		private SlayerName m_WeaponSlayer;
		private int m_WeaponSSI;

		private int m_ArmorPhysicalResist;
		private int m_ArmorFireResist;
		private int m_ArmorColdResist;
		private int m_ArmorPoisonResist;
		private int m_ArmorEnergyResist;
		private int m_ArmorDurability;
		private int m_ArmorLuck;
		private int m_ArmorGoldIncrease;
		private int m_ArmorLowerRequirements;

		private int m_RunicMinAttributes;
		private int m_RunicMaxAttributes;
		private int m_RunicMinIntensity;
		private int m_RunicMaxIntensity;

		public int WeaponFireDamage{ get{ return m_WeaponFireDamage; } set{ m_WeaponFireDamage = value; } }
		public int WeaponColdDamage{ get{ return m_WeaponColdDamage; } set{ m_WeaponColdDamage = value; } }
		public int WeaponPoisonDamage{ get{ return m_WeaponPoisonDamage; } set{ m_WeaponPoisonDamage = value; } }
		public int WeaponEnergyDamage{ get{ return m_WeaponEnergyDamage; } set{ m_WeaponEnergyDamage = value; } }
		public int WeaponDurability{ get{ return m_WeaponDurability; } set{ m_WeaponDurability = value; } }
		public int WeaponLuck{ get{ return m_WeaponLuck; } set{ m_WeaponLuck = value; } }
		public int WeaponGoldIncrease{ get{ return m_WeaponGoldIncrease; } set{ m_WeaponGoldIncrease = value; } }
		public int WeaponLowerRequirements{ get{ return m_WeaponLowerRequirements; } set{ m_WeaponLowerRequirements = value; } }
		public SlayerName WeaponSlayer{ get{ return m_WeaponSlayer; } set{ m_WeaponSlayer = value; } }
		public int WeaponSSI{ get{ return m_WeaponSSI; } set{ m_WeaponSSI = value; } }

		public int ArmorPhysicalResist{ get{ return m_ArmorPhysicalResist; } set{ m_ArmorPhysicalResist = value; } }
		public int ArmorFireResist{ get{ return m_ArmorFireResist; } set{ m_ArmorFireResist = value; } }
		public int ArmorColdResist{ get{ return m_ArmorColdResist; } set{ m_ArmorColdResist = value; } }
		public int ArmorPoisonResist{ get{ return m_ArmorPoisonResist; } set{ m_ArmorPoisonResist = value; } }
		public int ArmorEnergyResist{ get{ return m_ArmorEnergyResist; } set{ m_ArmorEnergyResist = value; } }
		public int ArmorDurability{ get{ return m_ArmorDurability; } set{ m_ArmorDurability = value; } }
		public int ArmorLuck{ get{ return m_ArmorLuck; } set{ m_ArmorLuck = value; } }
		public int ArmorGoldIncrease{ get{ return m_ArmorGoldIncrease; } set{ m_ArmorGoldIncrease = value; } }
		public int ArmorLowerRequirements{ get{ return m_ArmorLowerRequirements; } set{ m_ArmorLowerRequirements = value; } }

		public int RunicMinAttributes{ get{ return m_RunicMinAttributes; } set{ m_RunicMinAttributes = value; } }
		public int RunicMaxAttributes{ get{ return m_RunicMaxAttributes; } set{ m_RunicMaxAttributes = value; } }
		public int RunicMinIntensity{ get{ return m_RunicMinIntensity; } set{ m_RunicMinIntensity = value; } }
		public int RunicMaxIntensity{ get{ return m_RunicMaxIntensity; } set{ m_RunicMaxIntensity = value; } }

		public CraftAttributeInfo()
		{
		}

		public static readonly CraftAttributeInfo Blank;
		public static readonly CraftAttributeInfo DullCopper, ShadowIron, Copper, Bronze, Golden, Agapite, Verite, Valorite, Spike, IceRock, Gypsum, Platinum, SilverRock, DarkPagan, Mystic, Spectral, OldBritain, Onyx, RedElven, Undead, Pyrite, Virginity, Malachite, LavaRock, Azurite, Dripstone, Executor, Peachblue, Destruction, Anra, Crystal, Doom, Goddess, NewCarpathia;
		public static readonly CraftAttributeInfo Spined, Horned, Barbed;
		public static readonly CraftAttributeInfo RedScales, YellowScales, BlackScales, GreenScales, WhiteScales, BlueScales;

		static CraftAttributeInfo()
		{
			Blank = new CraftAttributeInfo();

			CraftAttributeInfo dullCopper = DullCopper = new CraftAttributeInfo();

			dullCopper.ArmorPhysicalResist = 6;
			dullCopper.ArmorDurability = 50;
			dullCopper.ArmorLowerRequirements = 20;
			dullCopper.WeaponDurability = 100;
			dullCopper.WeaponLowerRequirements = 50;
			dullCopper.RunicMinAttributes = 1;
			dullCopper.RunicMaxAttributes = 2;
			dullCopper.RunicMinIntensity = 10;
			dullCopper.RunicMaxIntensity = 35;

			CraftAttributeInfo shadowIron = ShadowIron = new CraftAttributeInfo();

			shadowIron.ArmorPhysicalResist = 2;
			shadowIron.ArmorFireResist = 1;
			shadowIron.ArmorEnergyResist = 5;
			shadowIron.ArmorDurability = 100;
			shadowIron.WeaponColdDamage = 20;
			shadowIron.WeaponDurability = 50;
			shadowIron.RunicMinAttributes = 2;
			shadowIron.RunicMaxAttributes = 2;
			shadowIron.RunicMinIntensity = 20;
			shadowIron.RunicMaxIntensity = 45;

			CraftAttributeInfo copper = Copper = new CraftAttributeInfo();

			copper.ArmorPhysicalResist = 1;
			copper.ArmorFireResist = 1;
			copper.ArmorPoisonResist = 5;
			copper.ArmorEnergyResist = 2;
			copper.WeaponPoisonDamage = 10;
			copper.WeaponEnergyDamage = 20;
			copper.RunicMinAttributes = 2;
			copper.RunicMaxAttributes = 3;
			copper.RunicMinIntensity = 25;
			copper.RunicMaxIntensity = 50;

			CraftAttributeInfo bronze = Bronze = new CraftAttributeInfo();

			bronze.ArmorPhysicalResist = 3;
			bronze.ArmorColdResist = 5;
			bronze.ArmorPoisonResist = 1;
			bronze.ArmorEnergyResist = 1;
			bronze.WeaponFireDamage = 40;
			bronze.RunicMinAttributes = 3;
			bronze.RunicMaxAttributes = 3;
			bronze.RunicMinIntensity = 30;
			bronze.RunicMaxIntensity = 65;

			CraftAttributeInfo golden = Golden = new CraftAttributeInfo();

			golden.ArmorPhysicalResist = 1;
			golden.ArmorFireResist = 1;
			golden.ArmorColdResist = 2;
			golden.ArmorEnergyResist = 2;
			golden.ArmorLuck = 40;
			golden.ArmorLowerRequirements = 30;
			golden.WeaponLuck = 40;
			golden.WeaponLowerRequirements = 50;
			golden.RunicMinAttributes = 3;
			golden.RunicMaxAttributes = 4;
			golden.RunicMinIntensity = 35;
			golden.RunicMaxIntensity = 75;

			CraftAttributeInfo agapite = Agapite = new CraftAttributeInfo();

			agapite.ArmorPhysicalResist = 2;
			agapite.ArmorFireResist = 3;
			agapite.ArmorColdResist = 2;
			agapite.ArmorPoisonResist = 2;
			agapite.ArmorEnergyResist = 2;
			agapite.WeaponColdDamage = 30;
			agapite.WeaponEnergyDamage = 20;
			agapite.RunicMinAttributes = 4;
			agapite.RunicMaxAttributes = 4;
			agapite.RunicMinIntensity = 40;
			agapite.RunicMaxIntensity = 80;

			CraftAttributeInfo verite = Verite = new CraftAttributeInfo();

			verite.ArmorPhysicalResist = 3;
			verite.ArmorFireResist = 3;
			verite.ArmorColdResist = 2;
			verite.ArmorPoisonResist = 3;
			verite.ArmorEnergyResist = 1;
			verite.WeaponPoisonDamage = 40;
			verite.WeaponEnergyDamage = 20;
			verite.RunicMinAttributes = 4;
			verite.RunicMaxAttributes = 5;
			verite.RunicMinIntensity = 45;
			verite.RunicMaxIntensity = 90;

			CraftAttributeInfo valorite = Valorite = new CraftAttributeInfo();

			valorite.ArmorPhysicalResist = 4;
			valorite.ArmorColdResist = 3;
			valorite.ArmorPoisonResist = 3;
			valorite.ArmorEnergyResist = 3;
			valorite.ArmorDurability = 50;
			valorite.WeaponFireDamage = 10;
			valorite.WeaponColdDamage = 20;
			valorite.WeaponPoisonDamage = 10;
			valorite.WeaponEnergyDamage = 20;
			valorite.RunicMinAttributes = 5;
			valorite.RunicMaxAttributes = 5;
			valorite.RunicMinIntensity = 50;
			valorite.RunicMaxIntensity = 100;
			
			CraftAttributeInfo spike = Spike = new CraftAttributeInfo();

			spike.ArmorPhysicalResist = 8;
			spike.ArmorFireResist = 1;
			spike.ArmorColdResist = 1;
			spike.ArmorPoisonResist = 1;
			spike.ArmorEnergyResist = 2;
			spike.ArmorDurability = 150;
			spike.ArmorLuck = 0;
			spike.ArmorLowerRequirements = 0;
			spike.WeaponFireDamage = 0;
			spike.WeaponColdDamage = 0;
			spike.WeaponPoisonDamage = 0;
			spike.WeaponEnergyDamage = 0;
			spike.WeaponDurability = 150;
			spike.WeaponLuck = 0;
			spike.WeaponLowerRequirements = 0;
			//spike.RunicMinAttributes = 5;
			//spike.RunicMaxAttributes = 5;
			//spike.RunicMinIntensity = 50;
			//spike.RunicMaxIntensity = 100;
			
			CraftAttributeInfo iceRock = IceRock = new CraftAttributeInfo();

			iceRock.ArmorPhysicalResist = 2;
			iceRock.ArmorFireResist = -10;
			iceRock.ArmorColdResist = 10;
			iceRock.ArmorPoisonResist = 1;
			iceRock.ArmorEnergyResist = 1;
			iceRock.ArmorDurability = 50;
			iceRock.ArmorLuck = 0;
			iceRock.ArmorLowerRequirements = 0;
			iceRock.WeaponFireDamage = 0;
			iceRock.WeaponColdDamage = 100;
			iceRock.WeaponPoisonDamage = 0;
			iceRock.WeaponEnergyDamage = 0;
			iceRock.WeaponDurability = 50;
			iceRock.WeaponLuck = 0;
			iceRock.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo gypsum = Gypsum = new CraftAttributeInfo();

			gypsum.ArmorPhysicalResist = 4;
			gypsum.ArmorFireResist = 4;
			gypsum.ArmorColdResist = 4;
			gypsum.ArmorPoisonResist = 1;
			gypsum.ArmorEnergyResist = 4;
			gypsum.ArmorDurability = 50;
			gypsum.ArmorLuck = 20;
			gypsum.ArmorLowerRequirements = 0;
			gypsum.WeaponFireDamage = 20;
			gypsum.WeaponColdDamage = 20;
			gypsum.WeaponPoisonDamage = 0;
			gypsum.WeaponEnergyDamage = 20;
			gypsum.WeaponDurability = 50;
			gypsum.WeaponLuck = 20;
			gypsum.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo platinum = Platinum = new CraftAttributeInfo();

			platinum.ArmorPhysicalResist = 0;
			platinum.ArmorFireResist = 1;
			platinum.ArmorColdResist = 3;
			platinum.ArmorPoisonResist = 4;
			platinum.ArmorEnergyResist = -10;
			platinum.ArmorDurability = 30;
			platinum.ArmorLuck = 100;
			platinum.ArmorLowerRequirements = 00;
			platinum.WeaponFireDamage = 0;
			platinum.WeaponColdDamage = 0;
			platinum.WeaponPoisonDamage = 0;
			platinum.WeaponEnergyDamage = 0;
			platinum.WeaponDurability = 30;
			platinum.WeaponLuck = 100;
			platinum.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo silverRock = SilverRock = new CraftAttributeInfo();

			silverRock.ArmorPhysicalResist = 3;
			silverRock.ArmorFireResist = 1;
			silverRock.ArmorColdResist = 2;
			silverRock.ArmorPoisonResist = 10;
			silverRock.ArmorEnergyResist = 0;
			silverRock.ArmorDurability = 50;
			silverRock.ArmorLuck = 0;
			silverRock.ArmorLowerRequirements = 0;
			silverRock.WeaponFireDamage = 0;
			silverRock.WeaponColdDamage = 0;
			silverRock.WeaponPoisonDamage = 0;
			silverRock.WeaponEnergyDamage = 0;
			silverRock.WeaponDurability = 50;
			silverRock.WeaponLuck = 0;
			silverRock.WeaponLowerRequirements = 0;
			silverRock.WeaponSlayer = SlayerName.Silver;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo darkPagan = DarkPagan = new CraftAttributeInfo();

			darkPagan.ArmorPhysicalResist = 4;
			darkPagan.ArmorFireResist = 4;
			darkPagan.ArmorColdResist = 4;
			darkPagan.ArmorPoisonResist = 3;
			darkPagan.ArmorEnergyResist = 4;
			darkPagan.ArmorDurability = 100;
			darkPagan.ArmorLuck = 0;
			darkPagan.ArmorLowerRequirements = 0;
			darkPagan.WeaponFireDamage = 10;
			darkPagan.WeaponColdDamage = 10;
			darkPagan.WeaponPoisonDamage = 10;
			darkPagan.WeaponEnergyDamage = 10;
			darkPagan.WeaponDurability = 100;
			darkPagan.WeaponLuck = 0;
			darkPagan.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo mystic = Mystic = new CraftAttributeInfo();

			mystic.ArmorPhysicalResist = 1;
			mystic.ArmorFireResist = 5;
			mystic.ArmorColdResist = 5;
			mystic.ArmorPoisonResist = 5;
			mystic.ArmorEnergyResist = 5;
			mystic.ArmorDurability = 100;
			mystic.ArmorLuck = 0;
			mystic.ArmorLowerRequirements = 0;
			mystic.WeaponFireDamage = 25;
			mystic.WeaponColdDamage = 25;
			mystic.WeaponPoisonDamage = 25;
			mystic.WeaponEnergyDamage = 25;
			mystic.WeaponDurability = 100;
			mystic.WeaponLuck = 0;
			mystic.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo spectral = Spectral = new CraftAttributeInfo();

			spectral.ArmorPhysicalResist = 3;
			spectral.ArmorFireResist = 3;
			spectral.ArmorColdResist = 3;
			spectral.ArmorPoisonResist = 3;
			spectral.ArmorEnergyResist = 3;
			spectral.ArmorDurability = 40;
			spectral.ArmorLuck = 0;
			spectral.ArmorLowerRequirements = 0;
			spectral.WeaponFireDamage = 0;
			spectral.WeaponColdDamage = 0;
			spectral.WeaponPoisonDamage = 0;
			spectral.WeaponEnergyDamage = 0;
			spectral.WeaponDurability = 40;
			spectral.WeaponLuck = 0;
			spectral.WeaponLowerRequirements = 0;
			spectral.WeaponSSI = 10;
	////////////REDUCE DEX PEN BY 3
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo oldBritain = OldBritain = new CraftAttributeInfo();

			oldBritain.ArmorPhysicalResist = 5;
			oldBritain.ArmorFireResist = 5;
			oldBritain.ArmorColdResist = 5;
			oldBritain.ArmorPoisonResist = 5;
			oldBritain.ArmorEnergyResist = 5;
			oldBritain.ArmorDurability = 100;
			oldBritain.ArmorLuck = 0;
			oldBritain.ArmorLowerRequirements = 0;
			oldBritain.WeaponFireDamage = 0;
			oldBritain.WeaponColdDamage = 0;
			oldBritain.WeaponPoisonDamage = 0;
			oldBritain.WeaponEnergyDamage = 0;
			oldBritain.WeaponDurability = 100;
			oldBritain.WeaponLuck = 0;
			oldBritain.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo onyx = Onyx = new CraftAttributeInfo();

			onyx.ArmorPhysicalResist = 5;
			onyx.ArmorFireResist = 4;
			onyx.ArmorColdResist = 4;
			onyx.ArmorPoisonResist = 4;
			onyx.ArmorEnergyResist = 4;
			onyx.ArmorDurability = 100;
			onyx.ArmorLuck = 0;
			onyx.ArmorLowerRequirements = 0;
			onyx.WeaponFireDamage = 0;
			onyx.WeaponColdDamage = 0;
			onyx.WeaponPoisonDamage = 0;
			onyx.WeaponEnergyDamage = 0;
			onyx.WeaponDurability = 100;
			onyx.WeaponLuck = 0;
			onyx.WeaponLowerRequirements = 0;
			onyx.WeaponSSI = 5;
	////////////REDUCE DEX PEN BY 1
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo redElven = RedElven = new CraftAttributeInfo();

			redElven.ArmorPhysicalResist = 3;
			redElven.ArmorFireResist = 6;
			redElven.ArmorColdResist = 6;
			redElven.ArmorPoisonResist = 6;
			redElven.ArmorEnergyResist = 6;
			redElven.ArmorDurability = 150;
			redElven.ArmorLuck = 0;
			redElven.ArmorLowerRequirements = 0;
			redElven.WeaponFireDamage = 10;
			redElven.WeaponColdDamage = 10;
			redElven.WeaponPoisonDamage = 10;
			redElven.WeaponEnergyDamage = 10;
			redElven.WeaponDurability = 150;
			redElven.WeaponLuck = 0;
			redElven.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo undead = Undead = new CraftAttributeInfo();

			undead.ArmorPhysicalResist = 3;
			undead.ArmorFireResist = -5;
			undead.ArmorColdResist = 8;
			undead.ArmorPoisonResist = 10;
			undead.ArmorEnergyResist = 2;
			undead.ArmorDurability = 100;
			undead.ArmorLuck = 0;
			undead.ArmorLowerRequirements = 0;
			undead.WeaponFireDamage = 0;
			undead.WeaponColdDamage = 50;
			undead.WeaponPoisonDamage = 50;
			undead.WeaponEnergyDamage = 0;
			undead.WeaponDurability = 100;
			undead.WeaponLuck = 0;
			undead.WeaponLowerRequirements = 0;
	////////////50% Necro protection
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo pyrite = Pyrite = new CraftAttributeInfo();

			pyrite.ArmorPhysicalResist = 6;
			pyrite.ArmorFireResist = 5;
			pyrite.ArmorColdResist = 3;
			pyrite.ArmorPoisonResist = 3;
			pyrite.ArmorEnergyResist = 5;
			pyrite.ArmorDurability = 100;
			pyrite.ArmorLuck = -25;
			pyrite.ArmorLowerRequirements = 0;
			pyrite.WeaponFireDamage = 0;
			pyrite.WeaponColdDamage = 0;
			pyrite.WeaponPoisonDamage = 0;
			pyrite.WeaponEnergyDamage = 0;
			pyrite.WeaponDurability = 100;
			pyrite.WeaponLuck = -25;
			pyrite.WeaponLowerRequirements = 0;
			pyrite.WeaponSSI = 5;
	////////////REDUCE DEX PEN BY 1
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo virginity = Virginity = new CraftAttributeInfo();

			virginity.ArmorPhysicalResist = 5;
			virginity.ArmorFireResist = 4;
			virginity.ArmorColdResist = 4;
			virginity.ArmorPoisonResist = 4;
			virginity.ArmorEnergyResist = 4;
			virginity.ArmorDurability = 100;
			virginity.ArmorLuck = 0;
			virginity.ArmorLowerRequirements = 00;
			virginity.WeaponFireDamage = 0;
			virginity.WeaponColdDamage = 0;
			virginity.WeaponPoisonDamage = 0;
			virginity.WeaponEnergyDamage = 0;
			virginity.WeaponDurability = 100;
			virginity.WeaponLuck = 0;
			virginity.WeaponLowerRequirements = 0;
			virginity.WeaponSSI = 5;
	////////////50% Necro protection
	////////////REDUCE DEX PEN BY 1
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo malachite = Malachite = new CraftAttributeInfo();

			malachite.ArmorPhysicalResist = 6;
			malachite.ArmorFireResist = 6;
			malachite.ArmorColdResist = 6;
			malachite.ArmorPoisonResist = 6;
			malachite.ArmorEnergyResist = 6;
			malachite.ArmorDurability = 100;
			malachite.ArmorLuck = 0;
			malachite.ArmorLowerRequirements = 0;
			malachite.WeaponFireDamage = 10;
			malachite.WeaponColdDamage = 10;
			malachite.WeaponPoisonDamage = 10;
			malachite.WeaponEnergyDamage = 10;
			malachite.WeaponDurability = 100;
			malachite.WeaponLuck = 0;
			malachite.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo lavaRock = LavaRock = new CraftAttributeInfo();

			lavaRock.ArmorPhysicalResist = 5;
			lavaRock.ArmorFireResist = 10;
			lavaRock.ArmorColdResist = -10;
			lavaRock.ArmorPoisonResist = 0;
			lavaRock.ArmorEnergyResist = 0;
			lavaRock.ArmorDurability = 00;
			lavaRock.ArmorLuck = 00;
			lavaRock.ArmorLowerRequirements = 00;
			lavaRock.WeaponFireDamage = 00;
			lavaRock.WeaponColdDamage = 00;
			lavaRock.WeaponPoisonDamage = 00;
			lavaRock.WeaponEnergyDamage = 00;
			lavaRock.WeaponDurability = 00;
			lavaRock.WeaponLuck = 00;
			lavaRock.WeaponLowerRequirements = 00;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo azurite = Azurite = new CraftAttributeInfo();

			azurite.ArmorPhysicalResist = 6;
			azurite.ArmorFireResist = 6;
			azurite.ArmorColdResist = 6;
			azurite.ArmorPoisonResist = 6;
			azurite.ArmorEnergyResist = 6;
			azurite.ArmorDurability = 100;
			azurite.ArmorLuck = 0;
			azurite.ArmorLowerRequirements = 0;
			azurite.WeaponFireDamage = 10;
			azurite.WeaponColdDamage = 10;
			azurite.WeaponPoisonDamage = 10;
			azurite.WeaponEnergyDamage = 10;
			azurite.WeaponDurability = 100;
			azurite.WeaponLuck = 0;
			azurite.WeaponLowerRequirements = 0;
			azurite.WeaponSSI = 5;
	////////////REDUCE DEX PEN BY 1
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo dripstone = Dripstone = new CraftAttributeInfo();

			dripstone.ArmorPhysicalResist = 4;
			dripstone.ArmorFireResist = 8;
			dripstone.ArmorColdResist = 8;
			dripstone.ArmorPoisonResist = 8;
			dripstone.ArmorEnergyResist = 8;
			dripstone.ArmorDurability = 100;
			dripstone.ArmorLuck = 0;
			dripstone.ArmorLowerRequirements = 0;
			dripstone.WeaponFireDamage = 20;
			dripstone.WeaponColdDamage = 20;
			dripstone.WeaponPoisonDamage = 20;
			dripstone.WeaponEnergyDamage = 20;
			dripstone.WeaponDurability = 100;
			dripstone.WeaponLuck = 0;
			dripstone.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo executor = Executor = new CraftAttributeInfo();

			executor.ArmorPhysicalResist = 5;
			executor.ArmorFireResist = 8;
			executor.ArmorColdResist = 8;
			executor.ArmorPoisonResist = 8;
			executor.ArmorEnergyResist = 8;
			executor.ArmorDurability = 100;
			executor.ArmorLuck = 0;
			executor.ArmorLowerRequirements = 0;
			executor.WeaponFireDamage = 10;
			executor.WeaponColdDamage = 10;
			executor.WeaponPoisonDamage = 10;
			executor.WeaponEnergyDamage = 10;
			executor.WeaponDurability = 100;
			executor.WeaponLuck = 0;
			executor.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo peachblue = Peachblue = new CraftAttributeInfo();

			peachblue.ArmorPhysicalResist = 7;
			peachblue.ArmorFireResist = 7;
			peachblue.ArmorColdResist = 7;
			peachblue.ArmorPoisonResist = 7;
			peachblue.ArmorEnergyResist = 7;
			peachblue.ArmorDurability = 100;
			peachblue.ArmorLuck = 0;
			peachblue.ArmorLowerRequirements = 0;
			peachblue.WeaponFireDamage = 0;
			peachblue.WeaponColdDamage = 0;
			peachblue.WeaponPoisonDamage = 0;
			peachblue.WeaponEnergyDamage = 0;
			peachblue.WeaponDurability = 100;
			peachblue.WeaponLuck = 0;
			peachblue.WeaponLowerRequirements = 0;
			peachblue.WeaponSSI = 10;
	////////////REDUCE DEX PEN BY 2
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo destruction = Destruction = new CraftAttributeInfo();

			destruction.ArmorPhysicalResist = 7;
			destruction.ArmorFireResist = 7;
			destruction.ArmorColdResist = 7;
			destruction.ArmorPoisonResist = 7;
			destruction.ArmorEnergyResist = 9;
			destruction.ArmorDurability = 200;
			destruction.ArmorLuck = 0;
			destruction.ArmorLowerRequirements = 0;
			destruction.WeaponFireDamage = 10;
			destruction.WeaponColdDamage = 10;
			destruction.WeaponPoisonDamage = 10;
			destruction.WeaponEnergyDamage = 10;
			destruction.WeaponDurability = 200;
			destruction.WeaponLuck = 0;
			destruction.WeaponLowerRequirements = 0;
			destruction.WeaponSSI = 5;
	////////////REDUCE DEX PEN BY 1
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo anra = Anra = new CraftAttributeInfo();

			anra.ArmorPhysicalResist = 8;
			anra.ArmorFireResist = 8;
			anra.ArmorColdResist = 8;
			anra.ArmorPoisonResist = 8;
			anra.ArmorEnergyResist = 8;
			anra.ArmorDurability = 100;
			anra.ArmorLuck = 0;
			anra.ArmorLowerRequirements = 0;
			anra.WeaponFireDamage = 10;
			anra.WeaponColdDamage = 10;
			anra.WeaponPoisonDamage = 10;
			anra.WeaponEnergyDamage = 10;
			anra.WeaponDurability = 100;
			anra.WeaponLuck = 0;
			anra.WeaponLowerRequirements = 0;
			anra.WeaponSSI = 10;
	////////////REDUCE DEX PEN BY 2
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo crystal = Crystal = new CraftAttributeInfo();

			crystal.ArmorPhysicalResist = 6;
			crystal.ArmorFireResist = 9;
			crystal.ArmorColdResist = 9;
			crystal.ArmorPoisonResist = 9;
			crystal.ArmorEnergyResist = 9;
			crystal.ArmorDurability = 100;
			crystal.ArmorLuck = 0;
			crystal.ArmorLowerRequirements = 0;
			crystal.WeaponFireDamage = 20;
			crystal.WeaponColdDamage = 20;
			crystal.WeaponPoisonDamage = 20;
			crystal.WeaponEnergyDamage = 20;
			crystal.WeaponDurability = 100;
			crystal.WeaponLuck = 0;
			crystal.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo doom = Doom = new CraftAttributeInfo();

			doom.ArmorPhysicalResist = 9;
			doom.ArmorFireResist = 9;
			doom.ArmorColdResist = 9;
			doom.ArmorPoisonResist = 9;
			doom.ArmorEnergyResist = 9;
			doom.ArmorDurability = 100;
			doom.ArmorLuck = 0;
			doom.ArmorLowerRequirements = 0;
			doom.WeaponFireDamage = 0;
			doom.WeaponColdDamage = 0;
			doom.WeaponPoisonDamage = 0;
			doom.WeaponEnergyDamage = 0;
			doom.WeaponDurability = 100;
			doom.WeaponLuck = 0;
			doom.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo goddess = Goddess = new CraftAttributeInfo();

			goddess.ArmorPhysicalResist = 8;
			goddess.ArmorFireResist = 10;
			goddess.ArmorColdResist = 10;
			goddess.ArmorPoisonResist = 10;
			goddess.ArmorEnergyResist = 10;
			goddess.ArmorDurability = 100;
			goddess.ArmorLuck = 0;
			goddess.ArmorLowerRequirements = 0;
			goddess.WeaponFireDamage = 10;
			goddess.WeaponColdDamage = 10;
			goddess.WeaponPoisonDamage = 0;
			goddess.WeaponEnergyDamage = 10;
			goddess.WeaponDurability = 100;
			goddess.WeaponLuck = 0;
			goddess.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo newCarpathia = NewCarpathia = new CraftAttributeInfo();

			newCarpathia.ArmorPhysicalResist = 10;
			newCarpathia.ArmorFireResist = 10;
			newCarpathia.ArmorColdResist = 10;
			newCarpathia.ArmorPoisonResist = 10;
			newCarpathia.ArmorEnergyResist = 10;
			newCarpathia.ArmorDurability = 100;
			newCarpathia.ArmorLuck = 0;
			newCarpathia.ArmorLowerRequirements = 0;
			newCarpathia.WeaponFireDamage = 20;
			newCarpathia.WeaponColdDamage = 20;
			newCarpathia.WeaponPoisonDamage = 20;
			newCarpathia.WeaponEnergyDamage = 20;
			newCarpathia.WeaponDurability = 100;
			newCarpathia.WeaponLuck = 0;
			newCarpathia.WeaponLowerRequirements = 0;
			newCarpathia.WeaponSSI = 15;
	////////////REDUCE DEX PEN BY 2
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;

			CraftAttributeInfo spined = Spined = new CraftAttributeInfo();

			spined.ArmorPhysicalResist = 5;
			spined.ArmorLuck = 40;
			spined.RunicMinAttributes = 1;
			spined.RunicMaxAttributes = 3;
			spined.RunicMinIntensity = 20;
			spined.RunicMaxIntensity = 40;

			CraftAttributeInfo horned = Horned = new CraftAttributeInfo();

			horned.ArmorPhysicalResist = 2;
			horned.ArmorFireResist = 3;
			horned.ArmorColdResist = 2;
			horned.ArmorPoisonResist = 2;
			horned.ArmorEnergyResist = 2;
			horned.RunicMinAttributes = 3;
			horned.RunicMaxAttributes = 4;
			horned.RunicMinIntensity = 30;
			horned.RunicMaxIntensity = 70;

			CraftAttributeInfo barbed = Barbed = new CraftAttributeInfo();

			barbed.ArmorPhysicalResist = 2;
			barbed.ArmorFireResist = 1;
			barbed.ArmorColdResist = 2;
			barbed.ArmorPoisonResist = 3;
			barbed.ArmorEnergyResist = 4;
			barbed.RunicMinAttributes = 4;
			barbed.RunicMaxAttributes = 5;
			barbed.RunicMinIntensity = 40;
			barbed.RunicMaxIntensity = 100;

			CraftAttributeInfo red = RedScales = new CraftAttributeInfo();

			red.ArmorFireResist = 10;
			red.ArmorColdResist = -3;

			CraftAttributeInfo yellow = YellowScales = new CraftAttributeInfo();

			yellow.ArmorPhysicalResist = -3;
			yellow.ArmorLuck = 20;

			CraftAttributeInfo black = BlackScales = new CraftAttributeInfo();

			black.ArmorPhysicalResist = 10;
			black.ArmorEnergyResist = -3;

			CraftAttributeInfo green = GreenScales = new CraftAttributeInfo();

			green.ArmorFireResist = -3;
			green.ArmorPoisonResist = 10;

			CraftAttributeInfo white = WhiteScales = new CraftAttributeInfo();

			white.ArmorPhysicalResist = -3;
			white.ArmorColdResist = 10;

			CraftAttributeInfo blue = BlueScales = new CraftAttributeInfo();

			blue.ArmorPoisonResist = -3;
			blue.ArmorEnergyResist = 10;
		}
	}

	public class CraftResourceInfo
	{
		private int m_Hue;
		private int m_Number;
		private string m_Name;
		private CraftAttributeInfo m_AttributeInfo;
		private CraftResource m_Resource;
		private Type[] m_ResourceTypes;

		public int Hue{ get{ return m_Hue; } }
		public int Number{ get{ return m_Number; } }
		public string Name{ get{ return m_Name; } }
		public CraftAttributeInfo AttributeInfo{ get{ return m_AttributeInfo; } }
		public CraftResource Resource{ get{ return m_Resource; } }
		public Type[] ResourceTypes{ get{ return m_ResourceTypes; } }

		public CraftResourceInfo( int hue, int number, string name, CraftAttributeInfo attributeInfo, CraftResource resource, params Type[] resourceTypes )
		{
			m_Hue = hue;
			m_Number = number;
			m_Name = name;
			m_AttributeInfo = attributeInfo;
			m_Resource = resource;
			m_ResourceTypes = resourceTypes;

			for ( int i = 0; i < resourceTypes.Length; ++i )
				CraftResources.RegisterType( resourceTypes[i], resource );
		}
	}

	public class CraftResources
	{
		private static CraftResourceInfo[] m_MetalInfo = new CraftResourceInfo[]
			{
									// hue    number   name             attributeInfo                   resource                        resourceTypes
				new CraftResourceInfo( 0x000, 1053109, "Iron",			CraftAttributeInfo.Blank,		CraftResource.Iron,				typeof( IronIngot ),		typeof( IronOre ),			typeof( Granite ) ),
				new CraftResourceInfo( 0x973, 1053108, "Dull Copper",	CraftAttributeInfo.DullCopper,	CraftResource.DullCopper,		typeof( DullCopperIngot ),	typeof( DullCopperOre ),	typeof( DullCopperGranite ) ),
				new CraftResourceInfo( 0x966, 1053107, "Shadow Iron",	CraftAttributeInfo.ShadowIron,	CraftResource.ShadowIron,		typeof( ShadowIronIngot ),	typeof( ShadowIronOre ),	typeof( ShadowIronGranite ) ),
				new CraftResourceInfo( 0x96D, 1053106, "Copper",		CraftAttributeInfo.Copper,		CraftResource.Copper,			typeof( CopperIngot ),		typeof( CopperOre ),		typeof( CopperGranite ) ),
				new CraftResourceInfo( 0x972, 1053105, "Bronze",		CraftAttributeInfo.Bronze,		CraftResource.Bronze,			typeof( BronzeIngot ),		typeof( BronzeOre ),		typeof( BronzeGranite ) ),
				new CraftResourceInfo( 0x8A5, 1053104, "Gold",			CraftAttributeInfo.Golden,		CraftResource.Gold,				typeof( GoldIngot ),		typeof( GoldOre ),			typeof( GoldGranite ) ),
				new CraftResourceInfo( 0x979, 1053103, "Agapite",		CraftAttributeInfo.Agapite,		CraftResource.Agapite,			typeof( AgapiteIngot ),		typeof( AgapiteOre ),		typeof( AgapiteGranite ) ),
				new CraftResourceInfo( 0x89F, 1053102, "Verite",		CraftAttributeInfo.Verite,		CraftResource.Verite,			typeof( VeriteIngot ),		typeof( VeriteOre ),		typeof( VeriteGranite ) ),
				new CraftResourceInfo( 0x8AB, 1053101, "Valorite",		CraftAttributeInfo.Valorite,	CraftResource.Valorite,			typeof( ValoriteIngot ),	typeof( ValoriteOre ),		typeof( ValoriteGranite ) ),
				new CraftResourceInfo( 639, 		0, "Spike",			CraftAttributeInfo.Spike,		CraftResource.Spike,			typeof( SpikeIngot ),		typeof( SpikeOre ) ),
				new CraftResourceInfo( 1266, 		0, "Ice Rock",		CraftAttributeInfo.IceRock,		CraftResource.IceRock,			typeof( IceRockIngot ),		typeof( IceRockOre ) ),
				new CraftResourceInfo( 1149, 		0, "Gypsum",		CraftAttributeInfo.Gypsum,		CraftResource.Gypsum,			typeof( GypsumIngot ),		typeof( GypsumOre ) ),
				new CraftResourceInfo( 961, 		0, "Platinum",		CraftAttributeInfo.Platinum,	CraftResource.Platinum,			typeof( PlatinumIngot ),	typeof( PlatinumOre ) ),
				new CraftResourceInfo( 1154, 		0, "Silver Rock",	CraftAttributeInfo.SilverRock,	CraftResource.SilverRock,		typeof( SilverRockIngot ),	typeof( SilverRockOre ) ),
				new CraftResourceInfo( 545, 		0, "Dark Pagan",	CraftAttributeInfo.DarkPagan,	CraftResource.DarkPagan,		typeof( DarkPaganIngot ),	typeof( DarkPaganOre ) ),
				new CraftResourceInfo( 1151, 		0, "Mystic",		CraftAttributeInfo.Mystic,		CraftResource.Mystic,			typeof( MysticIngot ),		typeof( MysticOre ) ),
				new CraftResourceInfo( 1284, 		0, "Spectral",		CraftAttributeInfo.Spectral,	CraftResource.Spectral,			typeof( SpectralIngot ),	typeof( SpectralOre ) ),
				new CraftResourceInfo( 843, 		0, "Old Britain",	CraftAttributeInfo.OldBritain,	CraftResource.OldBritain,		typeof( OldBritainIngot ),	typeof( OldBritainOre ) ),
				new CraftResourceInfo( 1175, 		0, "Onyx",			CraftAttributeInfo.Onyx,		CraftResource.Onyx,				typeof( OnyxIngot ),		typeof( OnyxOre ) ),
				new CraftResourceInfo( 337, 		0, "Red Elven",		CraftAttributeInfo.RedElven,	CraftResource.RedElven,			typeof( RedElvenIngot ),	typeof( RedElvenOre ) ),
				new CraftResourceInfo( 666, 		0, "Undead",		CraftAttributeInfo.Undead,		CraftResource.Undead,			typeof( UndeadIngot ),		typeof( UndeadOre ) ),
				new CraftResourceInfo( 2213, 		0, "Pyrite",		CraftAttributeInfo.Pyrite,		CraftResource.Pyrite,			typeof( PyriteIngot ),		typeof( PyriteOre ) ),
				new CraftResourceInfo( 1153, 		0, "Virginity",		CraftAttributeInfo.Virginity,	CraftResource.Virginity,		typeof( VirginityIngot ),	typeof( VirginityOre ) ),
				new CraftResourceInfo( 667, 		0, "Malachite",		CraftAttributeInfo.Malachite,	CraftResource.Malachite,		typeof( MalachiteIngot ),	typeof( MalachiteOre ) ),
				new CraftResourceInfo( 1172, 		0, "Lava Rock",		CraftAttributeInfo.LavaRock,	CraftResource.LavaRock,			typeof( LavaRockIngot ),	typeof( LavaRockOre ) ),
				new CraftResourceInfo( 403, 		0, "Azurite",		CraftAttributeInfo.Azurite,		CraftResource.Azurite,			typeof( AzuriteIngot ),		typeof( AzuriteOre ) ),
				new CraftResourceInfo( 711, 		0, "Dripstone",		CraftAttributeInfo.Dripstone,	CraftResource.Dripstone,		typeof( DripStoneIngot ),	typeof( DripStoneOre ) ),
				new CraftResourceInfo( 988, 		0, "Executor",		CraftAttributeInfo.Executor,	CraftResource.Executor,			typeof( ExecutorIngot ),	typeof( ExecutorOre ) ),
				new CraftResourceInfo( 185, 		0, "Peachblue",		CraftAttributeInfo.Peachblue,	CraftResource.Peachblue,		typeof( PeachblueIngot ),	typeof( PeachblueOre ) ),
				new CraftResourceInfo( 1267, 		0, "Destruction",	CraftAttributeInfo.Destruction,	CraftResource.Destruction,		typeof( DestructionIngot ),	typeof( DestructionOre ) ),
				new CraftResourceInfo( 730, 		0, "Anra",			CraftAttributeInfo.Anra,		CraftResource.Anra,				typeof( AnraIngot ),		typeof( AnraOre ) ),
				new CraftResourceInfo( 91, 			0, "Crystal",		CraftAttributeInfo.Crystal,		CraftResource.Crystal,			typeof( CrystalIngot ),		typeof( CrystalOre ) ),
				new CraftResourceInfo( 60, 			0, "Doom",			CraftAttributeInfo.Doom,		CraftResource.Doom,				typeof( DoomIngot ),		typeof( DoomOre ) ),
				new CraftResourceInfo( 1167, 		0, "Goddess",		CraftAttributeInfo.Goddess,		CraftResource.Goddess,			typeof( GoddessIngot ),		typeof( GoddessOre ) ),
				new CraftResourceInfo( 1169, 		0, "New Carpathia",	CraftAttributeInfo.NewCarpathia,CraftResource.NewCarpathia,		typeof( NewCarpathiaIngot ),typeof( NewCarpathiaOre ) )
		};

		private static CraftResourceInfo[] m_ScaleInfo = new CraftResourceInfo[]
			{
				new CraftResourceInfo( 0x66D, 1053129, "Red Scales",	CraftAttributeInfo.RedScales,		CraftResource.RedScales,		typeof( RedScales ) ),
				new CraftResourceInfo( 0x8A8, 1053130, "Yellow Scales",	CraftAttributeInfo.YellowScales,	CraftResource.YellowScales,		typeof( YellowScales ) ),
				new CraftResourceInfo( 0x455, 1053131, "Black Scales",	CraftAttributeInfo.BlackScales,		CraftResource.BlackScales,		typeof( BlackScales ) ),
				new CraftResourceInfo( 0x851, 1053132, "Green Scales",	CraftAttributeInfo.GreenScales,		CraftResource.GreenScales,		typeof( GreenScales ) ),
				new CraftResourceInfo( 0x8FD, 1053133, "White Scales",	CraftAttributeInfo.WhiteScales,		CraftResource.WhiteScales,		typeof( WhiteScales ) ),
				new CraftResourceInfo( 0x8B0, 1053134, "Blue Scales",	CraftAttributeInfo.BlueScales,		CraftResource.BlueScales,		typeof( BlueScales ) )
			};

		private static CraftResourceInfo[] m_LeatherInfo = new CraftResourceInfo[]
			{
				new CraftResourceInfo( 0x000, 1049353, "Normal",		CraftAttributeInfo.Blank,		CraftResource.RegularLeather,	typeof( Leather ),			typeof( Hides ) ),
				new CraftResourceInfo( 0x283, 1049354, "Spined",		CraftAttributeInfo.Spined,		CraftResource.SpinedLeather,	typeof( SpinedLeather ),	typeof( SpinedHides ) ),
				new CraftResourceInfo( 0x227, 1049355, "Horned",		CraftAttributeInfo.Horned,		CraftResource.HornedLeather,	typeof( HornedLeather ),	typeof( HornedHides ) ),
				new CraftResourceInfo( 0x1C1, 1049356, "Barbed",		CraftAttributeInfo.Barbed,		CraftResource.BarbedLeather,	typeof( BarbedLeather ),	typeof( BarbedHides ) )
		};

		private static CraftResourceInfo[] m_AOSLeatherInfo = new CraftResourceInfo[]
			{
				new CraftResourceInfo( 0x000, 1049353, "Normal",		CraftAttributeInfo.Blank,		CraftResource.RegularLeather,	typeof( Leather ),			typeof( Hides ) ),
				new CraftResourceInfo( 0x8AC, 1049354, "Spined",		CraftAttributeInfo.Spined,		CraftResource.SpinedLeather,	typeof( SpinedLeather ),	typeof( SpinedHides ) ),
				new CraftResourceInfo( 0x845, 1049355, "Horned",		CraftAttributeInfo.Horned,		CraftResource.HornedLeather,	typeof( HornedLeather ),	typeof( HornedHides ) ),
				new CraftResourceInfo( 0x851, 1049356, "Barbed",		CraftAttributeInfo.Barbed,		CraftResource.BarbedLeather,	typeof( BarbedLeather ),	typeof( BarbedHides ) ),
		};

		/// <summary>
		/// Returns true if '<paramref name="resource"/>' is None, Iron, or RegularLeather. False if otherwise.
		/// </summary>
		public static bool IsStandard( CraftResource resource )
		{
			return ( resource == CraftResource.None || resource == CraftResource.Iron || resource == CraftResource.RegularLeather );
		}

		private static Hashtable m_TypeTable;

		/// <summary>
		/// Registers that '<paramref name="resourceType"/>' uses '<paramref name="resource"/>' so that it can later be queried by <see cref="CraftResources.GetFromType"/>
		/// </summary>
		public static void RegisterType( Type resourceType, CraftResource resource )
		{
			if ( m_TypeTable == null )
				m_TypeTable = new Hashtable();

			m_TypeTable[resourceType] = resource;
		}

		/// <summary>
		/// Returns the <see cref="CraftResource"/> value for which '<paramref name="resourceType"/>' uses -or- CraftResource.None if an unregistered type was specified.
		/// </summary>
		public static CraftResource GetFromType( Type resourceType )
		{
			if ( m_TypeTable == null )
				return CraftResource.None;

			object obj = m_TypeTable[resourceType];

			if ( !(obj is CraftResource) )
				return CraftResource.None;

			return (CraftResource)obj;
		}

		/// <summary>
		/// Returns a <see cref="CraftResourceInfo"/> instance describing '<paramref name="resource"/>' -or- null if an invalid resource was specified.
		/// </summary>
		public static CraftResourceInfo GetInfo( CraftResource resource )
		{
			CraftResourceInfo[] list = null;

			switch ( GetType( resource ) )
			{
				case CraftResourceType.Metal: list = m_MetalInfo; break;
				case CraftResourceType.Leather: list = Core.AOS ? m_AOSLeatherInfo : m_LeatherInfo; break;
				case CraftResourceType.Scales: list = m_ScaleInfo; break;
			}

			if ( list != null )
			{
				int index = GetIndex( resource );

				if ( index >= 0 && index < list.Length )
					return list[index];
			}

			return null;
		}

		/// <summary>
		/// Returns a <see cref="CraftResourceType"/> value indiciating the type of '<paramref name="resource"/>'.
		/// </summary>
		public static CraftResourceType GetType( CraftResource resource )
		{
			if ( resource >= CraftResource.Iron && resource <= CraftResource.Valorite )
				return CraftResourceType.Metal;

			if ( resource >= CraftResource.RegularLeather && resource <= CraftResource.BarbedLeather )
				return CraftResourceType.Leather;

			if ( resource >= CraftResource.RedScales && resource <= CraftResource.BlueScales )
				return CraftResourceType.Scales;

			return CraftResourceType.None;
		}

		/// <summary>
		/// Returns the first <see cref="CraftResource"/> in the series of resources for which '<paramref name="resource"/>' belongs.
		/// </summary>
		public static CraftResource GetStart( CraftResource resource )
		{
			switch ( GetType( resource ) )
			{
				case CraftResourceType.Metal: return CraftResource.Iron;
				case CraftResourceType.Leather: return CraftResource.RegularLeather;
				case CraftResourceType.Scales: return CraftResource.RedScales;
			}

			return CraftResource.None;
		}

		/// <summary>
		/// Returns the index of '<paramref name="resource"/>' in the seriest of resources for which it belongs.
		/// </summary>
		public static int GetIndex( CraftResource resource )
		{
			CraftResource start = GetStart( resource );

			if ( start == CraftResource.None )
				return 0;

			return (int)(resource - start);
		}

		/// <summary>
		/// Returns the <see cref="CraftResourceInfo.Number"/> property of '<paramref name="resource"/>' -or- 0 if an invalid resource was specified.
		/// </summary>
		public static int GetLocalizationNumber( CraftResource resource )
		{
			CraftResourceInfo info = GetInfo( resource );

			return ( info == null ? 0 : info.Number );
		}

		/// <summary>
		/// Returns the <see cref="CraftResourceInfo.Hue"/> property of '<paramref name="resource"/>' -or- 0 if an invalid resource was specified.
		/// </summary>
		public static int GetHue( CraftResource resource )
		{
			CraftResourceInfo info = GetInfo( resource );

			return ( info == null ? 0 : info.Hue );
		}

		/// <summary>
		/// Returns the <see cref="CraftResourceInfo.Name"/> property of '<paramref name="resource"/>' -or- an empty string if the resource specified was invalid.
		/// </summary>
		public static string GetName( CraftResource resource )
		{
			CraftResourceInfo info = GetInfo( resource );

			return ( info == null ? String.Empty : info.Name );
		}

		/// <summary>
		/// Returns the <see cref="CraftResource"/> value which represents '<paramref name="info"/>' -or- CraftResource.None if unable to convert.
		/// </summary>
		public static CraftResource GetFromOreInfo( OreInfo info )
		{
			if ( info.Name.IndexOf( "Spined" ) >= 0 )
				return CraftResource.SpinedLeather;
			else if ( info.Name.IndexOf( "Horned" ) >= 0 )
				return CraftResource.HornedLeather;
			else if ( info.Name.IndexOf( "Barbed" ) >= 0 )
				return CraftResource.BarbedLeather;
			else if ( info.Name.IndexOf( "Leather" ) >= 0 )
				return CraftResource.RegularLeather;

			if ( info.Level == 0 )
				return CraftResource.Iron;
			else if ( info.Level == 1 )
				return CraftResource.DullCopper;
			else if ( info.Level == 2 )
				return CraftResource.ShadowIron;
			else if ( info.Level == 3 )
				return CraftResource.Copper;
			else if ( info.Level == 4 )
				return CraftResource.Bronze;
			else if ( info.Level == 5 )
				return CraftResource.Gold;
			else if ( info.Level == 6 )
				return CraftResource.Agapite;
			else if ( info.Level == 7 )
				return CraftResource.Verite;
			else if ( info.Level == 8 )
				return CraftResource.Valorite;
			else if ( info.Level == 9 )
				return CraftResource.Spike;
			else if ( info.Level == 10 )
				return CraftResource.IceRock;
			else if ( info.Level == 11 )
				return CraftResource.Gypsum;
			else if ( info.Level == 12 )
				return CraftResource.Platinum;
			else if ( info.Level == 13 )
				return CraftResource.SilverRock;
			else if ( info.Level == 14 )
				return CraftResource.DarkPagan;
			else if ( info.Level == 15 )
				return CraftResource.Mystic;
			else if ( info.Level == 16 )
				return CraftResource.Spectral;
			else if ( info.Level == 17 )
				return CraftResource.OldBritain;
			else if ( info.Level == 18 )
				return CraftResource.Onyx;
			else if ( info.Level == 19 )
				return CraftResource.RedElven;
			else if ( info.Level == 20 )
				return CraftResource.Undead;
			else if ( info.Level == 21 )
				return CraftResource.Pyrite;
			else if ( info.Level == 22 )
				return CraftResource.Virginity;
			else if ( info.Level == 23 )
				return CraftResource.Malachite;
			else if ( info.Level == 24 )
				return CraftResource.LavaRock;
			else if ( info.Level == 25 )
				return CraftResource.Azurite;
			else if ( info.Level == 26 )
				return CraftResource.Dripstone;
			else if ( info.Level == 27 )
				return CraftResource.Executor;
			else if ( info.Level == 28 )
				return CraftResource.Peachblue;
			else if ( info.Level == 29 )
				return CraftResource.Destruction;
			else if ( info.Level == 30 )
				return CraftResource.Anra;
			else if ( info.Level == 31 )
				return CraftResource.Crystal;
			else if ( info.Level == 32 )
				return CraftResource.Doom;
			else if ( info.Level == 33 )
				return CraftResource.Goddess;
			else if ( info.Level == 34 )
				return CraftResource.NewCarpathia;

			return CraftResource.None;
		}

		/// <summary>
		/// Returns the <see cref="CraftResource"/> value which represents '<paramref name="info"/>', using '<paramref name="material"/>' to help resolve leather OreInfo instances.
		/// </summary>
		public static CraftResource GetFromOreInfo( OreInfo info, ArmorMaterialType material )
		{
			if ( material == ArmorMaterialType.Studded || material == ArmorMaterialType.Leather || material == ArmorMaterialType.Spined ||
				material == ArmorMaterialType.Horned || material == ArmorMaterialType.Barbed )
			{
				if ( info.Level == 0 )
					return CraftResource.RegularLeather;
				else if ( info.Level == 1 )
					return CraftResource.SpinedLeather;
				else if ( info.Level == 2 )
					return CraftResource.HornedLeather;
				else if ( info.Level == 3 )
					return CraftResource.BarbedLeather;

				return CraftResource.None;
			}

			return GetFromOreInfo( info );
		}
	}

	// NOTE: This class is only for compatability with very old RunUO versions.
	// No changes to it should be required for custom resources.
	public class OreInfo
	{
		public static readonly OreInfo Iron			= new OreInfo( 0, 0x000, "Iron" );
		public static readonly OreInfo DullCopper	= new OreInfo( 1, 0x973, "Dull Copper" );
		public static readonly OreInfo ShadowIron	= new OreInfo( 2, 0x966, "Shadow Iron" );
		public static readonly OreInfo Copper		= new OreInfo( 3, 0x96D, "Copper" );
		public static readonly OreInfo Bronze		= new OreInfo( 4, 0x972, "Bronze" );
		public static readonly OreInfo Gold			= new OreInfo( 5, 0x8A5, "Gold" );
		public static readonly OreInfo Agapite		= new OreInfo( 6, 0x979, "Agapite" );
		public static readonly OreInfo Verite		= new OreInfo( 7, 0x89F, "Verite" );
		public static readonly OreInfo Valorite		= new OreInfo( 8, 0x8AB, "Valorite" );
		public static readonly OreInfo Spike		= new OreInfo( 9, 	639, "Spike" );
		public static readonly OreInfo IceRock		= new OreInfo( 10, 1266, "Ice Rock" );
		public static readonly OreInfo Gypsum		= new OreInfo( 11, 1149, "Gypsum" );
		public static readonly OreInfo Platinum		= new OreInfo( 12, 	961, "Platinum" );
		public static readonly OreInfo SilverRock	= new OreInfo( 13, 1154, "Silver Rock" );
		public static readonly OreInfo DarkPagan	= new OreInfo( 14, 	545, "Dark Pagan" );
		public static readonly OreInfo Mystic		= new OreInfo( 15, 1151, "Mystic" );
		public static readonly OreInfo Spectral		= new OreInfo( 16, 1284, "Spectral" );
		public static readonly OreInfo OldBritain	= new OreInfo( 17, 	843, "Old Britain" );
		public static readonly OreInfo Onyx			= new OreInfo( 18, 1175, "Onyx" );
		public static readonly OreInfo RedElven		= new OreInfo( 19, 	337, "Red Elven" );
		public static readonly OreInfo Undead		= new OreInfo( 20, 	666, "Undead" );
		public static readonly OreInfo Pyrite		= new OreInfo( 21, 2213, "Pyrite" );
		public static readonly OreInfo Virginity	= new OreInfo( 22, 1153, "Virginity" );
		public static readonly OreInfo Malachite	= new OreInfo( 23, 	667, "Malachite" );
		public static readonly OreInfo LavaRock		= new OreInfo( 24, 1172, "Lava Rock" );
		public static readonly OreInfo Azurite		= new OreInfo( 25, 	403, "Azurite" );
		public static readonly OreInfo Dripstone	= new OreInfo( 26, 	711, "Dripstone" );
		public static readonly OreInfo Executor		= new OreInfo( 27, 	988, "Executor" );
		public static readonly OreInfo Peachblue	= new OreInfo( 28, 	185, "Peachblue" );
		public static readonly OreInfo Destruction	= new OreInfo( 29, 1267, "Destruction" );
		public static readonly OreInfo Anra			= new OreInfo( 30, 	730, "Anra" );
		public static readonly OreInfo Crystal		= new OreInfo( 31, 	 91, "Crystal" );
		public static readonly OreInfo Doom			= new OreInfo( 32, 	 60, "Doom" );
		public static readonly OreInfo Goddess		= new OreInfo( 33, 1167, "Goddess" );
		public static readonly OreInfo NewCarpathia	= new OreInfo( 34, 1169, "New Carpathia" );

		private int m_Level;
		private int m_Hue;
		private string m_Name;

		public OreInfo( int level, int hue, string name )
		{
			m_Level = level;
			m_Hue = hue;
			m_Name = name;
		}

		public int Level
		{
			get
			{
				return m_Level;
			}
		}

		public int Hue
		{
			get
			{
				return m_Hue;
			}
		}

		public string Name
		{
			get
			{
				return m_Name;
			}
		}
	}
}

EDIT:

Since adding the Name lines in Ingots.cs, Ingots now return the correct name on [get name yet still display ~1_NOTHING~. Crafting now works too without giving the not enough materials message, yet there is nothing on the crafted items signifying the metal they are made from. Hues are also still not coming through (all new metals look like iron). :confused:
 

Joeku

Lord
I don't know what to say. Sorry :/

Check to see if you maybe edited any other files that might affect this.
 

Mr. Friday

Wanderer
Hmm, I have looked through this stuff a lot now and can't seem to come up with what is causing the problem. I remain fairly confident that it is a small thing that needs to be added.
 

Kamron

Knight
It says ~1_Nothing~ because you set the item's name to "" not to Null. You need to use [props to set the name properly.
 

Mr. Friday

Wanderer
Are you trying to say that all ores must be [proped in game in order to have the correct name?

I am aware that the name is somehow not set correctly in OreInfo.cs, but what I can't figure out is where that mistake lies.
 

TMSTKSBK

Lord
string name = null;

or just

string name;

not

string name = "";

//gleans from xxspider's post...
though honestly I don't know what he's talking about...
 

Mr. Friday

Wanderer
Can some one please explain what you mean? I can't find a single place where the code reads name = "";

I will keep looking through it in the morning.
 

daat99

Moderator
Staff member
Did you remembered to set a name to the ore and ingots inside the ore.cs and ingot.cs files?
It sounds to me like you don't have a name so it tries to get a name from a cliloc and either the cliloc is 1~nothing~(bla bla) or it expect different format.
That's just a guess tho.
 

Kamron

Knight
Mr.Friday... this can happen one of a few ways..

You set the name in-game... then wanted to set it to nothing (default) so you did
[set name ""
which produced this
OR
the ore resource has no CLILOC number
OR
the ore resource has no STRING name
OR
the peice of armor/weapon has an invalid LabelNumber.
 

Mr. Friday

Wanderer
Yes, I agree, one of those three is the problem. The problem I am having is where is this happening. I have gone through these three scripts so many times, just looking at them is beginning to make me sick. I'll repost them:

OreInfo.cs

Code:
using System;
using System.Collections;

namespace Server.Items
{
	public enum CraftResource
	{
		None = 0,
		Iron = 1,
		DullCopper,
		ShadowIron,
		Copper,
		Bronze,
		Gold,
		Agapite,
		Verite,
		Valorite,
		Spike,
		IceRock,
		Gypsum,
		Platinum,
		SilverRock,
		DarkPagan,
		Mystic,
		Spectral,
		OldBritain,
		Onyx,
		RedElven,
		Undead,
		Pyrite,
		Virginity,
		Malachite,
		LavaRock,
		Azurite,
		Dripstone,
		Executor,
		Peachblue,
		Destruction,
		Anra,
		Crystal,
		Doom,
		Goddess,
		NewCarpathia,

		RegularLeather = 101,
		SpinedLeather,
		HornedLeather,
		BarbedLeather,

		RedScales = 201,
		YellowScales,
		BlackScales,
		GreenScales,
		WhiteScales,
		BlueScales
	}

	public enum CraftResourceType
	{
		None,
		Metal,
		Leather,
		Scales
	}

	public class CraftAttributeInfo
	{
		private int m_WeaponFireDamage;
		private int m_WeaponColdDamage;
		private int m_WeaponPoisonDamage;
		private int m_WeaponEnergyDamage;
		private int m_WeaponDurability;
		private int m_WeaponLuck;
		private int m_WeaponGoldIncrease;
		private int m_WeaponLowerRequirements;
		private SlayerName m_WeaponSlayer;
		private int m_WeaponSSI;

		private int m_ArmorPhysicalResist;
		private int m_ArmorFireResist;
		private int m_ArmorColdResist;
		private int m_ArmorPoisonResist;
		private int m_ArmorEnergyResist;
		private int m_ArmorDurability;
		private int m_ArmorLuck;
		private int m_ArmorGoldIncrease;
		private int m_ArmorLowerRequirements;

		private int m_RunicMinAttributes;
		private int m_RunicMaxAttributes;
		private int m_RunicMinIntensity;
		private int m_RunicMaxIntensity;

		public int WeaponFireDamage{ get{ return m_WeaponFireDamage; } set{ m_WeaponFireDamage = value; } }
		public int WeaponColdDamage{ get{ return m_WeaponColdDamage; } set{ m_WeaponColdDamage = value; } }
		public int WeaponPoisonDamage{ get{ return m_WeaponPoisonDamage; } set{ m_WeaponPoisonDamage = value; } }
		public int WeaponEnergyDamage{ get{ return m_WeaponEnergyDamage; } set{ m_WeaponEnergyDamage = value; } }
		public int WeaponDurability{ get{ return m_WeaponDurability; } set{ m_WeaponDurability = value; } }
		public int WeaponLuck{ get{ return m_WeaponLuck; } set{ m_WeaponLuck = value; } }
		public int WeaponGoldIncrease{ get{ return m_WeaponGoldIncrease; } set{ m_WeaponGoldIncrease = value; } }
		public int WeaponLowerRequirements{ get{ return m_WeaponLowerRequirements; } set{ m_WeaponLowerRequirements = value; } }
		public SlayerName WeaponSlayer{ get{ return m_WeaponSlayer; } set{ m_WeaponSlayer = value; } }
		public int WeaponSSI{ get{ return m_WeaponSSI; } set{ m_WeaponSSI = value; } }

		public int ArmorPhysicalResist{ get{ return m_ArmorPhysicalResist; } set{ m_ArmorPhysicalResist = value; } }
		public int ArmorFireResist{ get{ return m_ArmorFireResist; } set{ m_ArmorFireResist = value; } }
		public int ArmorColdResist{ get{ return m_ArmorColdResist; } set{ m_ArmorColdResist = value; } }
		public int ArmorPoisonResist{ get{ return m_ArmorPoisonResist; } set{ m_ArmorPoisonResist = value; } }
		public int ArmorEnergyResist{ get{ return m_ArmorEnergyResist; } set{ m_ArmorEnergyResist = value; } }
		public int ArmorDurability{ get{ return m_ArmorDurability; } set{ m_ArmorDurability = value; } }
		public int ArmorLuck{ get{ return m_ArmorLuck; } set{ m_ArmorLuck = value; } }
		public int ArmorGoldIncrease{ get{ return m_ArmorGoldIncrease; } set{ m_ArmorGoldIncrease = value; } }
		public int ArmorLowerRequirements{ get{ return m_ArmorLowerRequirements; } set{ m_ArmorLowerRequirements = value; } }

		public int RunicMinAttributes{ get{ return m_RunicMinAttributes; } set{ m_RunicMinAttributes = value; } }
		public int RunicMaxAttributes{ get{ return m_RunicMaxAttributes; } set{ m_RunicMaxAttributes = value; } }
		public int RunicMinIntensity{ get{ return m_RunicMinIntensity; } set{ m_RunicMinIntensity = value; } }
		public int RunicMaxIntensity{ get{ return m_RunicMaxIntensity; } set{ m_RunicMaxIntensity = value; } }

		public CraftAttributeInfo()
		{
		}

		public static readonly CraftAttributeInfo Blank;
		public static readonly CraftAttributeInfo DullCopper, ShadowIron, Copper, Bronze, Golden, Agapite, Verite, Valorite, Spike, IceRock, Gypsum, Platinum, SilverRock, DarkPagan, Mystic, Spectral, OldBritain, Onyx, RedElven, Undead, Pyrite, Virginity, Malachite, LavaRock, Azurite, Dripstone, Executor, Peachblue, Destruction, Anra, Crystal, Doom, Goddess, NewCarpathia;
		public static readonly CraftAttributeInfo Spined, Horned, Barbed;
		public static readonly CraftAttributeInfo RedScales, YellowScales, BlackScales, GreenScales, WhiteScales, BlueScales;

		static CraftAttributeInfo()
		{
			Blank = new CraftAttributeInfo();

			CraftAttributeInfo dullCopper = DullCopper = new CraftAttributeInfo();

			dullCopper.ArmorPhysicalResist = 6;
			dullCopper.ArmorDurability = 50;
			dullCopper.ArmorLowerRequirements = 20;
			dullCopper.WeaponDurability = 100;
			dullCopper.WeaponLowerRequirements = 50;
			dullCopper.RunicMinAttributes = 1;
			dullCopper.RunicMaxAttributes = 2;
			dullCopper.RunicMinIntensity = 10;
			dullCopper.RunicMaxIntensity = 35;

			CraftAttributeInfo shadowIron = ShadowIron = new CraftAttributeInfo();

			shadowIron.ArmorPhysicalResist = 2;
			shadowIron.ArmorFireResist = 1;
			shadowIron.ArmorEnergyResist = 5;
			shadowIron.ArmorDurability = 100;
			shadowIron.WeaponColdDamage = 20;
			shadowIron.WeaponDurability = 50;
			shadowIron.RunicMinAttributes = 2;
			shadowIron.RunicMaxAttributes = 2;
			shadowIron.RunicMinIntensity = 20;
			shadowIron.RunicMaxIntensity = 45;

			CraftAttributeInfo copper = Copper = new CraftAttributeInfo();

			copper.ArmorPhysicalResist = 1;
			copper.ArmorFireResist = 1;
			copper.ArmorPoisonResist = 5;
			copper.ArmorEnergyResist = 2;
			copper.WeaponPoisonDamage = 10;
			copper.WeaponEnergyDamage = 20;
			copper.RunicMinAttributes = 2;
			copper.RunicMaxAttributes = 3;
			copper.RunicMinIntensity = 25;
			copper.RunicMaxIntensity = 50;

			CraftAttributeInfo bronze = Bronze = new CraftAttributeInfo();

			bronze.ArmorPhysicalResist = 3;
			bronze.ArmorColdResist = 5;
			bronze.ArmorPoisonResist = 1;
			bronze.ArmorEnergyResist = 1;
			bronze.WeaponFireDamage = 40;
			bronze.RunicMinAttributes = 3;
			bronze.RunicMaxAttributes = 3;
			bronze.RunicMinIntensity = 30;
			bronze.RunicMaxIntensity = 65;

			CraftAttributeInfo golden = Golden = new CraftAttributeInfo();

			golden.ArmorPhysicalResist = 1;
			golden.ArmorFireResist = 1;
			golden.ArmorColdResist = 2;
			golden.ArmorEnergyResist = 2;
			golden.ArmorLuck = 40;
			golden.ArmorLowerRequirements = 30;
			golden.WeaponLuck = 40;
			golden.WeaponLowerRequirements = 50;
			golden.RunicMinAttributes = 3;
			golden.RunicMaxAttributes = 4;
			golden.RunicMinIntensity = 35;
			golden.RunicMaxIntensity = 75;

			CraftAttributeInfo agapite = Agapite = new CraftAttributeInfo();

			agapite.ArmorPhysicalResist = 2;
			agapite.ArmorFireResist = 3;
			agapite.ArmorColdResist = 2;
			agapite.ArmorPoisonResist = 2;
			agapite.ArmorEnergyResist = 2;
			agapite.WeaponColdDamage = 30;
			agapite.WeaponEnergyDamage = 20;
			agapite.RunicMinAttributes = 4;
			agapite.RunicMaxAttributes = 4;
			agapite.RunicMinIntensity = 40;
			agapite.RunicMaxIntensity = 80;

			CraftAttributeInfo verite = Verite = new CraftAttributeInfo();

			verite.ArmorPhysicalResist = 3;
			verite.ArmorFireResist = 3;
			verite.ArmorColdResist = 2;
			verite.ArmorPoisonResist = 3;
			verite.ArmorEnergyResist = 1;
			verite.WeaponPoisonDamage = 40;
			verite.WeaponEnergyDamage = 20;
			verite.RunicMinAttributes = 4;
			verite.RunicMaxAttributes = 5;
			verite.RunicMinIntensity = 45;
			verite.RunicMaxIntensity = 90;

			CraftAttributeInfo valorite = Valorite = new CraftAttributeInfo();

			valorite.ArmorPhysicalResist = 4;
			valorite.ArmorColdResist = 3;
			valorite.ArmorPoisonResist = 3;
			valorite.ArmorEnergyResist = 3;
			valorite.ArmorDurability = 50;
			valorite.WeaponFireDamage = 10;
			valorite.WeaponColdDamage = 20;
			valorite.WeaponPoisonDamage = 10;
			valorite.WeaponEnergyDamage = 20;
			valorite.RunicMinAttributes = 5;
			valorite.RunicMaxAttributes = 5;
			valorite.RunicMinIntensity = 50;
			valorite.RunicMaxIntensity = 100;
			
			CraftAttributeInfo spike = Spike = new CraftAttributeInfo();

			spike.ArmorPhysicalResist = 8;
			spike.ArmorFireResist = 1;
			spike.ArmorColdResist = 1;
			spike.ArmorPoisonResist = 1;
			spike.ArmorEnergyResist = 2;
			spike.ArmorDurability = 150;
			spike.ArmorLuck = 0;
			spike.ArmorLowerRequirements = 0;
			spike.WeaponFireDamage = 0;
			spike.WeaponColdDamage = 0;
			spike.WeaponPoisonDamage = 0;
			spike.WeaponEnergyDamage = 0;
			spike.WeaponDurability = 150;
			spike.WeaponLuck = 0;
			spike.WeaponLowerRequirements = 0;
			//spike.RunicMinAttributes = 5;
			//spike.RunicMaxAttributes = 5;
			//spike.RunicMinIntensity = 50;
			//spike.RunicMaxIntensity = 100;
			
			CraftAttributeInfo iceRock = IceRock = new CraftAttributeInfo();

			iceRock.ArmorPhysicalResist = 2;
			iceRock.ArmorFireResist = -10;
			iceRock.ArmorColdResist = 10;
			iceRock.ArmorPoisonResist = 1;
			iceRock.ArmorEnergyResist = 1;
			iceRock.ArmorDurability = 50;
			iceRock.ArmorLuck = 0;
			iceRock.ArmorLowerRequirements = 0;
			iceRock.WeaponFireDamage = 0;
			iceRock.WeaponColdDamage = 100;
			iceRock.WeaponPoisonDamage = 0;
			iceRock.WeaponEnergyDamage = 0;
			iceRock.WeaponDurability = 50;
			iceRock.WeaponLuck = 0;
			iceRock.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo gypsum = Gypsum = new CraftAttributeInfo();

			gypsum.ArmorPhysicalResist = 4;
			gypsum.ArmorFireResist = 4;
			gypsum.ArmorColdResist = 4;
			gypsum.ArmorPoisonResist = 1;
			gypsum.ArmorEnergyResist = 4;
			gypsum.ArmorDurability = 50;
			gypsum.ArmorLuck = 20;
			gypsum.ArmorLowerRequirements = 0;
			gypsum.WeaponFireDamage = 20;
			gypsum.WeaponColdDamage = 20;
			gypsum.WeaponPoisonDamage = 0;
			gypsum.WeaponEnergyDamage = 20;
			gypsum.WeaponDurability = 50;
			gypsum.WeaponLuck = 20;
			gypsum.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo platinum = Platinum = new CraftAttributeInfo();

			platinum.ArmorPhysicalResist = 0;
			platinum.ArmorFireResist = 1;
			platinum.ArmorColdResist = 3;
			platinum.ArmorPoisonResist = 4;
			platinum.ArmorEnergyResist = -10;
			platinum.ArmorDurability = 30;
			platinum.ArmorLuck = 100;
			platinum.ArmorLowerRequirements = 00;
			platinum.WeaponFireDamage = 0;
			platinum.WeaponColdDamage = 0;
			platinum.WeaponPoisonDamage = 0;
			platinum.WeaponEnergyDamage = 0;
			platinum.WeaponDurability = 30;
			platinum.WeaponLuck = 100;
			platinum.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo silverRock = SilverRock = new CraftAttributeInfo();

			silverRock.ArmorPhysicalResist = 3;
			silverRock.ArmorFireResist = 1;
			silverRock.ArmorColdResist = 2;
			silverRock.ArmorPoisonResist = 10;
			silverRock.ArmorEnergyResist = 0;
			silverRock.ArmorDurability = 50;
			silverRock.ArmorLuck = 0;
			silverRock.ArmorLowerRequirements = 0;
			silverRock.WeaponFireDamage = 0;
			silverRock.WeaponColdDamage = 0;
			silverRock.WeaponPoisonDamage = 0;
			silverRock.WeaponEnergyDamage = 0;
			silverRock.WeaponDurability = 50;
			silverRock.WeaponLuck = 0;
			silverRock.WeaponLowerRequirements = 0;
			silverRock.WeaponSlayer = SlayerName.Silver;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo darkPagan = DarkPagan = new CraftAttributeInfo();

			darkPagan.ArmorPhysicalResist = 4;
			darkPagan.ArmorFireResist = 4;
			darkPagan.ArmorColdResist = 4;
			darkPagan.ArmorPoisonResist = 3;
			darkPagan.ArmorEnergyResist = 4;
			darkPagan.ArmorDurability = 100;
			darkPagan.ArmorLuck = 0;
			darkPagan.ArmorLowerRequirements = 0;
			darkPagan.WeaponFireDamage = 10;
			darkPagan.WeaponColdDamage = 10;
			darkPagan.WeaponPoisonDamage = 10;
			darkPagan.WeaponEnergyDamage = 10;
			darkPagan.WeaponDurability = 100;
			darkPagan.WeaponLuck = 0;
			darkPagan.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo mystic = Mystic = new CraftAttributeInfo();

			mystic.ArmorPhysicalResist = 1;
			mystic.ArmorFireResist = 5;
			mystic.ArmorColdResist = 5;
			mystic.ArmorPoisonResist = 5;
			mystic.ArmorEnergyResist = 5;
			mystic.ArmorDurability = 100;
			mystic.ArmorLuck = 0;
			mystic.ArmorLowerRequirements = 0;
			mystic.WeaponFireDamage = 25;
			mystic.WeaponColdDamage = 25;
			mystic.WeaponPoisonDamage = 25;
			mystic.WeaponEnergyDamage = 25;
			mystic.WeaponDurability = 100;
			mystic.WeaponLuck = 0;
			mystic.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo spectral = Spectral = new CraftAttributeInfo();

			spectral.ArmorPhysicalResist = 3;
			spectral.ArmorFireResist = 3;
			spectral.ArmorColdResist = 3;
			spectral.ArmorPoisonResist = 3;
			spectral.ArmorEnergyResist = 3;
			spectral.ArmorDurability = 40;
			spectral.ArmorLuck = 0;
			spectral.ArmorLowerRequirements = 0;
			spectral.WeaponFireDamage = 0;
			spectral.WeaponColdDamage = 0;
			spectral.WeaponPoisonDamage = 0;
			spectral.WeaponEnergyDamage = 0;
			spectral.WeaponDurability = 40;
			spectral.WeaponLuck = 0;
			spectral.WeaponLowerRequirements = 0;
			spectral.WeaponSSI = 10;
	////////////REDUCE DEX PEN BY 3
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo oldBritain = OldBritain = new CraftAttributeInfo();

			oldBritain.ArmorPhysicalResist = 5;
			oldBritain.ArmorFireResist = 5;
			oldBritain.ArmorColdResist = 5;
			oldBritain.ArmorPoisonResist = 5;
			oldBritain.ArmorEnergyResist = 5;
			oldBritain.ArmorDurability = 100;
			oldBritain.ArmorLuck = 0;
			oldBritain.ArmorLowerRequirements = 0;
			oldBritain.WeaponFireDamage = 0;
			oldBritain.WeaponColdDamage = 0;
			oldBritain.WeaponPoisonDamage = 0;
			oldBritain.WeaponEnergyDamage = 0;
			oldBritain.WeaponDurability = 100;
			oldBritain.WeaponLuck = 0;
			oldBritain.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo onyx = Onyx = new CraftAttributeInfo();

			onyx.ArmorPhysicalResist = 5;
			onyx.ArmorFireResist = 4;
			onyx.ArmorColdResist = 4;
			onyx.ArmorPoisonResist = 4;
			onyx.ArmorEnergyResist = 4;
			onyx.ArmorDurability = 100;
			onyx.ArmorLuck = 0;
			onyx.ArmorLowerRequirements = 0;
			onyx.WeaponFireDamage = 0;
			onyx.WeaponColdDamage = 0;
			onyx.WeaponPoisonDamage = 0;
			onyx.WeaponEnergyDamage = 0;
			onyx.WeaponDurability = 100;
			onyx.WeaponLuck = 0;
			onyx.WeaponLowerRequirements = 0;
			onyx.WeaponSSI = 5;
	////////////REDUCE DEX PEN BY 1
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo redElven = RedElven = new CraftAttributeInfo();

			redElven.ArmorPhysicalResist = 3;
			redElven.ArmorFireResist = 6;
			redElven.ArmorColdResist = 6;
			redElven.ArmorPoisonResist = 6;
			redElven.ArmorEnergyResist = 6;
			redElven.ArmorDurability = 150;
			redElven.ArmorLuck = 0;
			redElven.ArmorLowerRequirements = 0;
			redElven.WeaponFireDamage = 10;
			redElven.WeaponColdDamage = 10;
			redElven.WeaponPoisonDamage = 10;
			redElven.WeaponEnergyDamage = 10;
			redElven.WeaponDurability = 150;
			redElven.WeaponLuck = 0;
			redElven.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo undead = Undead = new CraftAttributeInfo();

			undead.ArmorPhysicalResist = 3;
			undead.ArmorFireResist = -5;
			undead.ArmorColdResist = 8;
			undead.ArmorPoisonResist = 10;
			undead.ArmorEnergyResist = 2;
			undead.ArmorDurability = 100;
			undead.ArmorLuck = 0;
			undead.ArmorLowerRequirements = 0;
			undead.WeaponFireDamage = 0;
			undead.WeaponColdDamage = 50;
			undead.WeaponPoisonDamage = 50;
			undead.WeaponEnergyDamage = 0;
			undead.WeaponDurability = 100;
			undead.WeaponLuck = 0;
			undead.WeaponLowerRequirements = 0;
	////////////50% Necro protection
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo pyrite = Pyrite = new CraftAttributeInfo();

			pyrite.ArmorPhysicalResist = 6;
			pyrite.ArmorFireResist = 5;
			pyrite.ArmorColdResist = 3;
			pyrite.ArmorPoisonResist = 3;
			pyrite.ArmorEnergyResist = 5;
			pyrite.ArmorDurability = 100;
			pyrite.ArmorLuck = -25;
			pyrite.ArmorLowerRequirements = 0;
			pyrite.WeaponFireDamage = 0;
			pyrite.WeaponColdDamage = 0;
			pyrite.WeaponPoisonDamage = 0;
			pyrite.WeaponEnergyDamage = 0;
			pyrite.WeaponDurability = 100;
			pyrite.WeaponLuck = -25;
			pyrite.WeaponLowerRequirements = 0;
			pyrite.WeaponSSI = 5;
	////////////REDUCE DEX PEN BY 1
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo virginity = Virginity = new CraftAttributeInfo();

			virginity.ArmorPhysicalResist = 5;
			virginity.ArmorFireResist = 4;
			virginity.ArmorColdResist = 4;
			virginity.ArmorPoisonResist = 4;
			virginity.ArmorEnergyResist = 4;
			virginity.ArmorDurability = 100;
			virginity.ArmorLuck = 0;
			virginity.ArmorLowerRequirements = 00;
			virginity.WeaponFireDamage = 0;
			virginity.WeaponColdDamage = 0;
			virginity.WeaponPoisonDamage = 0;
			virginity.WeaponEnergyDamage = 0;
			virginity.WeaponDurability = 100;
			virginity.WeaponLuck = 0;
			virginity.WeaponLowerRequirements = 0;
			virginity.WeaponSSI = 5;
	////////////50% Necro protection
	////////////REDUCE DEX PEN BY 1
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo malachite = Malachite = new CraftAttributeInfo();

			malachite.ArmorPhysicalResist = 6;
			malachite.ArmorFireResist = 6;
			malachite.ArmorColdResist = 6;
			malachite.ArmorPoisonResist = 6;
			malachite.ArmorEnergyResist = 6;
			malachite.ArmorDurability = 100;
			malachite.ArmorLuck = 0;
			malachite.ArmorLowerRequirements = 0;
			malachite.WeaponFireDamage = 10;
			malachite.WeaponColdDamage = 10;
			malachite.WeaponPoisonDamage = 10;
			malachite.WeaponEnergyDamage = 10;
			malachite.WeaponDurability = 100;
			malachite.WeaponLuck = 0;
			malachite.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo lavaRock = LavaRock = new CraftAttributeInfo();

			lavaRock.ArmorPhysicalResist = 5;
			lavaRock.ArmorFireResist = 10;
			lavaRock.ArmorColdResist = -10;
			lavaRock.ArmorPoisonResist = 0;
			lavaRock.ArmorEnergyResist = 0;
			lavaRock.ArmorDurability = 00;
			lavaRock.ArmorLuck = 00;
			lavaRock.ArmorLowerRequirements = 00;
			lavaRock.WeaponFireDamage = 00;
			lavaRock.WeaponColdDamage = 00;
			lavaRock.WeaponPoisonDamage = 00;
			lavaRock.WeaponEnergyDamage = 00;
			lavaRock.WeaponDurability = 00;
			lavaRock.WeaponLuck = 00;
			lavaRock.WeaponLowerRequirements = 00;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo azurite = Azurite = new CraftAttributeInfo();

			azurite.ArmorPhysicalResist = 6;
			azurite.ArmorFireResist = 6;
			azurite.ArmorColdResist = 6;
			azurite.ArmorPoisonResist = 6;
			azurite.ArmorEnergyResist = 6;
			azurite.ArmorDurability = 100;
			azurite.ArmorLuck = 0;
			azurite.ArmorLowerRequirements = 0;
			azurite.WeaponFireDamage = 10;
			azurite.WeaponColdDamage = 10;
			azurite.WeaponPoisonDamage = 10;
			azurite.WeaponEnergyDamage = 10;
			azurite.WeaponDurability = 100;
			azurite.WeaponLuck = 0;
			azurite.WeaponLowerRequirements = 0;
			azurite.WeaponSSI = 5;
	////////////REDUCE DEX PEN BY 1
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo dripstone = Dripstone = new CraftAttributeInfo();

			dripstone.ArmorPhysicalResist = 4;
			dripstone.ArmorFireResist = 8;
			dripstone.ArmorColdResist = 8;
			dripstone.ArmorPoisonResist = 8;
			dripstone.ArmorEnergyResist = 8;
			dripstone.ArmorDurability = 100;
			dripstone.ArmorLuck = 0;
			dripstone.ArmorLowerRequirements = 0;
			dripstone.WeaponFireDamage = 20;
			dripstone.WeaponColdDamage = 20;
			dripstone.WeaponPoisonDamage = 20;
			dripstone.WeaponEnergyDamage = 20;
			dripstone.WeaponDurability = 100;
			dripstone.WeaponLuck = 0;
			dripstone.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo executor = Executor = new CraftAttributeInfo();

			executor.ArmorPhysicalResist = 5;
			executor.ArmorFireResist = 8;
			executor.ArmorColdResist = 8;
			executor.ArmorPoisonResist = 8;
			executor.ArmorEnergyResist = 8;
			executor.ArmorDurability = 100;
			executor.ArmorLuck = 0;
			executor.ArmorLowerRequirements = 0;
			executor.WeaponFireDamage = 10;
			executor.WeaponColdDamage = 10;
			executor.WeaponPoisonDamage = 10;
			executor.WeaponEnergyDamage = 10;
			executor.WeaponDurability = 100;
			executor.WeaponLuck = 0;
			executor.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo peachblue = Peachblue = new CraftAttributeInfo();

			peachblue.ArmorPhysicalResist = 7;
			peachblue.ArmorFireResist = 7;
			peachblue.ArmorColdResist = 7;
			peachblue.ArmorPoisonResist = 7;
			peachblue.ArmorEnergyResist = 7;
			peachblue.ArmorDurability = 100;
			peachblue.ArmorLuck = 0;
			peachblue.ArmorLowerRequirements = 0;
			peachblue.WeaponFireDamage = 0;
			peachblue.WeaponColdDamage = 0;
			peachblue.WeaponPoisonDamage = 0;
			peachblue.WeaponEnergyDamage = 0;
			peachblue.WeaponDurability = 100;
			peachblue.WeaponLuck = 0;
			peachblue.WeaponLowerRequirements = 0;
			peachblue.WeaponSSI = 10;
	////////////REDUCE DEX PEN BY 2
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo destruction = Destruction = new CraftAttributeInfo();

			destruction.ArmorPhysicalResist = 7;
			destruction.ArmorFireResist = 7;
			destruction.ArmorColdResist = 7;
			destruction.ArmorPoisonResist = 7;
			destruction.ArmorEnergyResist = 9;
			destruction.ArmorDurability = 200;
			destruction.ArmorLuck = 0;
			destruction.ArmorLowerRequirements = 0;
			destruction.WeaponFireDamage = 10;
			destruction.WeaponColdDamage = 10;
			destruction.WeaponPoisonDamage = 10;
			destruction.WeaponEnergyDamage = 10;
			destruction.WeaponDurability = 200;
			destruction.WeaponLuck = 0;
			destruction.WeaponLowerRequirements = 0;
			destruction.WeaponSSI = 5;
	////////////REDUCE DEX PEN BY 1
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo anra = Anra = new CraftAttributeInfo();

			anra.ArmorPhysicalResist = 8;
			anra.ArmorFireResist = 8;
			anra.ArmorColdResist = 8;
			anra.ArmorPoisonResist = 8;
			anra.ArmorEnergyResist = 8;
			anra.ArmorDurability = 100;
			anra.ArmorLuck = 0;
			anra.ArmorLowerRequirements = 0;
			anra.WeaponFireDamage = 10;
			anra.WeaponColdDamage = 10;
			anra.WeaponPoisonDamage = 10;
			anra.WeaponEnergyDamage = 10;
			anra.WeaponDurability = 100;
			anra.WeaponLuck = 0;
			anra.WeaponLowerRequirements = 0;
			anra.WeaponSSI = 10;
	////////////REDUCE DEX PEN BY 2
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo crystal = Crystal = new CraftAttributeInfo();

			crystal.ArmorPhysicalResist = 6;
			crystal.ArmorFireResist = 9;
			crystal.ArmorColdResist = 9;
			crystal.ArmorPoisonResist = 9;
			crystal.ArmorEnergyResist = 9;
			crystal.ArmorDurability = 100;
			crystal.ArmorLuck = 0;
			crystal.ArmorLowerRequirements = 0;
			crystal.WeaponFireDamage = 20;
			crystal.WeaponColdDamage = 20;
			crystal.WeaponPoisonDamage = 20;
			crystal.WeaponEnergyDamage = 20;
			crystal.WeaponDurability = 100;
			crystal.WeaponLuck = 0;
			crystal.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo doom = Doom = new CraftAttributeInfo();

			doom.ArmorPhysicalResist = 9;
			doom.ArmorFireResist = 9;
			doom.ArmorColdResist = 9;
			doom.ArmorPoisonResist = 9;
			doom.ArmorEnergyResist = 9;
			doom.ArmorDurability = 100;
			doom.ArmorLuck = 0;
			doom.ArmorLowerRequirements = 0;
			doom.WeaponFireDamage = 0;
			doom.WeaponColdDamage = 0;
			doom.WeaponPoisonDamage = 0;
			doom.WeaponEnergyDamage = 0;
			doom.WeaponDurability = 100;
			doom.WeaponLuck = 0;
			doom.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo goddess = Goddess = new CraftAttributeInfo();

			goddess.ArmorPhysicalResist = 8;
			goddess.ArmorFireResist = 10;
			goddess.ArmorColdResist = 10;
			goddess.ArmorPoisonResist = 10;
			goddess.ArmorEnergyResist = 10;
			goddess.ArmorDurability = 100;
			goddess.ArmorLuck = 0;
			goddess.ArmorLowerRequirements = 0;
			goddess.WeaponFireDamage = 10;
			goddess.WeaponColdDamage = 10;
			goddess.WeaponPoisonDamage = 0;
			goddess.WeaponEnergyDamage = 10;
			goddess.WeaponDurability = 100;
			goddess.WeaponLuck = 0;
			goddess.WeaponLowerRequirements = 0;
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;
			
			CraftAttributeInfo newCarpathia = NewCarpathia = new CraftAttributeInfo();

			newCarpathia.ArmorPhysicalResist = 10;
			newCarpathia.ArmorFireResist = 10;
			newCarpathia.ArmorColdResist = 10;
			newCarpathia.ArmorPoisonResist = 10;
			newCarpathia.ArmorEnergyResist = 10;
			newCarpathia.ArmorDurability = 100;
			newCarpathia.ArmorLuck = 0;
			newCarpathia.ArmorLowerRequirements = 0;
			newCarpathia.WeaponFireDamage = 20;
			newCarpathia.WeaponColdDamage = 20;
			newCarpathia.WeaponPoisonDamage = 20;
			newCarpathia.WeaponEnergyDamage = 20;
			newCarpathia.WeaponDurability = 100;
			newCarpathia.WeaponLuck = 0;
			newCarpathia.WeaponLowerRequirements = 0;
			newCarpathia.WeaponSSI = 15;
	////////////REDUCE DEX PEN BY 2
			//xxx.RunicMinAttributes = 5;
			//xxx.RunicMaxAttributes = 5;
			//xxx.RunicMinIntensity = 50;
			//xxx.RunicMaxIntensity = 100;

			CraftAttributeInfo spined = Spined = new CraftAttributeInfo();

			spined.ArmorPhysicalResist = 5;
			spined.ArmorLuck = 40;
			spined.RunicMinAttributes = 1;
			spined.RunicMaxAttributes = 3;
			spined.RunicMinIntensity = 20;
			spined.RunicMaxIntensity = 40;

			CraftAttributeInfo horned = Horned = new CraftAttributeInfo();

			horned.ArmorPhysicalResist = 2;
			horned.ArmorFireResist = 3;
			horned.ArmorColdResist = 2;
			horned.ArmorPoisonResist = 2;
			horned.ArmorEnergyResist = 2;
			horned.RunicMinAttributes = 3;
			horned.RunicMaxAttributes = 4;
			horned.RunicMinIntensity = 30;
			horned.RunicMaxIntensity = 70;

			CraftAttributeInfo barbed = Barbed = new CraftAttributeInfo();

			barbed.ArmorPhysicalResist = 2;
			barbed.ArmorFireResist = 1;
			barbed.ArmorColdResist = 2;
			barbed.ArmorPoisonResist = 3;
			barbed.ArmorEnergyResist = 4;
			barbed.RunicMinAttributes = 4;
			barbed.RunicMaxAttributes = 5;
			barbed.RunicMinIntensity = 40;
			barbed.RunicMaxIntensity = 100;

			CraftAttributeInfo red = RedScales = new CraftAttributeInfo();

			red.ArmorFireResist = 10;
			red.ArmorColdResist = -3;

			CraftAttributeInfo yellow = YellowScales = new CraftAttributeInfo();

			yellow.ArmorPhysicalResist = -3;
			yellow.ArmorLuck = 20;

			CraftAttributeInfo black = BlackScales = new CraftAttributeInfo();

			black.ArmorPhysicalResist = 10;
			black.ArmorEnergyResist = -3;

			CraftAttributeInfo green = GreenScales = new CraftAttributeInfo();

			green.ArmorFireResist = -3;
			green.ArmorPoisonResist = 10;

			CraftAttributeInfo white = WhiteScales = new CraftAttributeInfo();

			white.ArmorPhysicalResist = -3;
			white.ArmorColdResist = 10;

			CraftAttributeInfo blue = BlueScales = new CraftAttributeInfo();

			blue.ArmorPoisonResist = -3;
			blue.ArmorEnergyResist = 10;
		}
	}

	public class CraftResourceInfo
	{
		private int m_Hue;
		private int m_Number;
		private string m_Name;
		private CraftAttributeInfo m_AttributeInfo;
		private CraftResource m_Resource;
		private Type[] m_ResourceTypes;

		public int Hue{ get{ return m_Hue; } }
		public int Number{ get{ return m_Number; } }
		public string Name{ get{ return m_Name; } }
		public CraftAttributeInfo AttributeInfo{ get{ return m_AttributeInfo; } }
		public CraftResource Resource{ get{ return m_Resource; } }
		public Type[] ResourceTypes{ get{ return m_ResourceTypes; } }

		public CraftResourceInfo( int hue, int number, string name, CraftAttributeInfo attributeInfo, CraftResource resource, params Type[] resourceTypes )
		{
			m_Hue = hue;
			m_Number = number;
			m_Name = name;
			m_AttributeInfo = attributeInfo;
			m_Resource = resource;
			m_ResourceTypes = resourceTypes;

			for ( int i = 0; i < resourceTypes.Length; ++i )
				CraftResources.RegisterType( resourceTypes[i], resource );
		}
	}

	public class CraftResources
	{
		private static CraftResourceInfo[] m_MetalInfo = new CraftResourceInfo[]
			{
									// hue    number   name             attributeInfo                   resource                        resourceTypes
				new CraftResourceInfo( 0x000, 1053109, "Iron",			CraftAttributeInfo.Blank,		CraftResource.Iron,				typeof( IronIngot ),		typeof( IronOre ),			typeof( Granite ) ),
				new CraftResourceInfo( 0x973, 1053108, "Dull Copper",	CraftAttributeInfo.DullCopper,	CraftResource.DullCopper,		typeof( DullCopperIngot ),	typeof( DullCopperOre ),	typeof( DullCopperGranite ) ),
				new CraftResourceInfo( 0x966, 1053107, "Shadow Iron",	CraftAttributeInfo.ShadowIron,	CraftResource.ShadowIron,		typeof( ShadowIronIngot ),	typeof( ShadowIronOre ),	typeof( ShadowIronGranite ) ),
				new CraftResourceInfo( 0x96D, 1053106, "Copper",		CraftAttributeInfo.Copper,		CraftResource.Copper,			typeof( CopperIngot ),		typeof( CopperOre ),		typeof( CopperGranite ) ),
				new CraftResourceInfo( 0x972, 1053105, "Bronze",		CraftAttributeInfo.Bronze,		CraftResource.Bronze,			typeof( BronzeIngot ),		typeof( BronzeOre ),		typeof( BronzeGranite ) ),
				new CraftResourceInfo( 0x8A5, 1053104, "Gold",			CraftAttributeInfo.Golden,		CraftResource.Gold,				typeof( GoldIngot ),		typeof( GoldOre ),			typeof( GoldGranite ) ),
				new CraftResourceInfo( 0x979, 1053103, "Agapite",		CraftAttributeInfo.Agapite,		CraftResource.Agapite,			typeof( AgapiteIngot ),		typeof( AgapiteOre ),		typeof( AgapiteGranite ) ),
				new CraftResourceInfo( 0x89F, 1053102, "Verite",		CraftAttributeInfo.Verite,		CraftResource.Verite,			typeof( VeriteIngot ),		typeof( VeriteOre ),		typeof( VeriteGranite ) ),
				new CraftResourceInfo( 0x8AB, 1053101, "Valorite",		CraftAttributeInfo.Valorite,	CraftResource.Valorite,			typeof( ValoriteIngot ),	typeof( ValoriteOre ),		typeof( ValoriteGranite ) ),
				new CraftResourceInfo( 639, 		1, "Spike",			CraftAttributeInfo.Spike,		CraftResource.Spike,			typeof( SpikeIngot ),		typeof( SpikeOre ) ),
				new CraftResourceInfo( 1266, 		2, "Ice Rock",		CraftAttributeInfo.IceRock,		CraftResource.IceRock,			typeof( IceRockIngot ),		typeof( IceRockOre ) ),
				new CraftResourceInfo( 1149, 		3, "Gypsum",		CraftAttributeInfo.Gypsum,		CraftResource.Gypsum,			typeof( GypsumIngot ),		typeof( GypsumOre ) ),
				new CraftResourceInfo( 961, 		4, "Platinum",		CraftAttributeInfo.Platinum,	CraftResource.Platinum,			typeof( PlatinumIngot ),	typeof( PlatinumOre ) ),
				new CraftResourceInfo( 1154, 		5, "Silver Rock",	CraftAttributeInfo.SilverRock,	CraftResource.SilverRock,		typeof( SilverRockIngot ),	typeof( SilverRockOre ) ),
				new CraftResourceInfo( 545, 		6, "Dark Pagan",	CraftAttributeInfo.DarkPagan,	CraftResource.DarkPagan,		typeof( DarkPaganIngot ),	typeof( DarkPaganOre ) ),
				new CraftResourceInfo( 1151, 		7, "Mystic",		CraftAttributeInfo.Mystic,		CraftResource.Mystic,			typeof( MysticIngot ),		typeof( MysticOre ) ),
				new CraftResourceInfo( 1284, 		8, "Spectral",		CraftAttributeInfo.Spectral,	CraftResource.Spectral,			typeof( SpectralIngot ),	typeof( SpectralOre ) ),
				new CraftResourceInfo( 843, 		9, "Old Britain",	CraftAttributeInfo.OldBritain,	CraftResource.OldBritain,		typeof( OldBritainIngot ),	typeof( OldBritainOre ) ),
				new CraftResourceInfo( 1175, 	   10, "Onyx",			CraftAttributeInfo.Onyx,		CraftResource.Onyx,				typeof( OnyxIngot ),		typeof( OnyxOre ) ),
				new CraftResourceInfo( 337, 	   11, "Red Elven",		CraftAttributeInfo.RedElven,	CraftResource.RedElven,			typeof( RedElvenIngot ),	typeof( RedElvenOre ) ),
				new CraftResourceInfo( 666, 	   12, "Undead",		CraftAttributeInfo.Undead,		CraftResource.Undead,			typeof( UndeadIngot ),		typeof( UndeadOre ) ),
				new CraftResourceInfo( 2213, 		13, "Pyrite",		CraftAttributeInfo.Pyrite,		CraftResource.Pyrite,			typeof( PyriteIngot ),		typeof( PyriteOre ) ),
				new CraftResourceInfo( 1153, 		14, "Virginity",		CraftAttributeInfo.Virginity,	CraftResource.Virginity,		typeof( VirginityIngot ),	typeof( VirginityOre ) ),
				new CraftResourceInfo( 667, 		15, "Malachite",		CraftAttributeInfo.Malachite,	CraftResource.Malachite,		typeof( MalachiteIngot ),	typeof( MalachiteOre ) ),
				new CraftResourceInfo( 1172, 		16, "Lava Rock",		CraftAttributeInfo.LavaRock,	CraftResource.LavaRock,			typeof( LavaRockIngot ),	typeof( LavaRockOre ) ),
				new CraftResourceInfo( 403, 		17, "Azurite",		CraftAttributeInfo.Azurite,		CraftResource.Azurite,			typeof( AzuriteIngot ),		typeof( AzuriteOre ) ),
				new CraftResourceInfo( 711, 		18, "Dripstone",		CraftAttributeInfo.Dripstone,	CraftResource.Dripstone,		typeof( DripStoneIngot ),	typeof( DripStoneOre ) ),
				new CraftResourceInfo( 988, 		19, "Executor",		CraftAttributeInfo.Executor,	CraftResource.Executor,			typeof( ExecutorIngot ),	typeof( ExecutorOre ) ),
				new CraftResourceInfo( 185, 		20, "Peachblue",		CraftAttributeInfo.Peachblue,	CraftResource.Peachblue,		typeof( PeachblueIngot ),	typeof( PeachblueOre ) ),
				new CraftResourceInfo( 1267, 		21, "Destruction",	CraftAttributeInfo.Destruction,	CraftResource.Destruction,		typeof( DestructionIngot ),	typeof( DestructionOre ) ),
				new CraftResourceInfo( 730, 		22, "Anra",			CraftAttributeInfo.Anra,		CraftResource.Anra,				typeof( AnraIngot ),		typeof( AnraOre ) ),
				new CraftResourceInfo( 91, 			23, "Crystal",		CraftAttributeInfo.Crystal,		CraftResource.Crystal,			typeof( CrystalIngot ),		typeof( CrystalOre ) ),
				new CraftResourceInfo( 60, 			24, "Doom",			CraftAttributeInfo.Doom,		CraftResource.Doom,				typeof( DoomIngot ),		typeof( DoomOre ) ),
				new CraftResourceInfo( 1167, 		25, "Goddess",		CraftAttributeInfo.Goddess,		CraftResource.Goddess,			typeof( GoddessIngot ),		typeof( GoddessOre ) ),
				new CraftResourceInfo( 1169, 		26, "New Carpathia",	CraftAttributeInfo.NewCarpathia,CraftResource.NewCarpathia,		typeof( NewCarpathiaIngot ),typeof( NewCarpathiaOre ) )
		};

		private static CraftResourceInfo[] m_ScaleInfo = new CraftResourceInfo[]
			{
				new CraftResourceInfo( 0x66D, 1053129, "Red Scales",	CraftAttributeInfo.RedScales,		CraftResource.RedScales,		typeof( RedScales ) ),
				new CraftResourceInfo( 0x8A8, 1053130, "Yellow Scales",	CraftAttributeInfo.YellowScales,	CraftResource.YellowScales,		typeof( YellowScales ) ),
				new CraftResourceInfo( 0x455, 1053131, "Black Scales",	CraftAttributeInfo.BlackScales,		CraftResource.BlackScales,		typeof( BlackScales ) ),
				new CraftResourceInfo( 0x851, 1053132, "Green Scales",	CraftAttributeInfo.GreenScales,		CraftResource.GreenScales,		typeof( GreenScales ) ),
				new CraftResourceInfo( 0x8FD, 1053133, "White Scales",	CraftAttributeInfo.WhiteScales,		CraftResource.WhiteScales,		typeof( WhiteScales ) ),
				new CraftResourceInfo( 0x8B0, 1053134, "Blue Scales",	CraftAttributeInfo.BlueScales,		CraftResource.BlueScales,		typeof( BlueScales ) )
			};

		private static CraftResourceInfo[] m_LeatherInfo = new CraftResourceInfo[]
			{
				new CraftResourceInfo( 0x000, 1049353, "Normal",		CraftAttributeInfo.Blank,		CraftResource.RegularLeather,	typeof( Leather ),			typeof( Hides ) ),
				new CraftResourceInfo( 0x283, 1049354, "Spined",		CraftAttributeInfo.Spined,		CraftResource.SpinedLeather,	typeof( SpinedLeather ),	typeof( SpinedHides ) ),
				new CraftResourceInfo( 0x227, 1049355, "Horned",		CraftAttributeInfo.Horned,		CraftResource.HornedLeather,	typeof( HornedLeather ),	typeof( HornedHides ) ),
				new CraftResourceInfo( 0x1C1, 1049356, "Barbed",		CraftAttributeInfo.Barbed,		CraftResource.BarbedLeather,	typeof( BarbedLeather ),	typeof( BarbedHides ) )
		};

		private static CraftResourceInfo[] m_AOSLeatherInfo = new CraftResourceInfo[]
			{
				new CraftResourceInfo( 0x000, 1049353, "Normal",		CraftAttributeInfo.Blank,		CraftResource.RegularLeather,	typeof( Leather ),			typeof( Hides ) ),
				new CraftResourceInfo( 0x8AC, 1049354, "Spined",		CraftAttributeInfo.Spined,		CraftResource.SpinedLeather,	typeof( SpinedLeather ),	typeof( SpinedHides ) ),
				new CraftResourceInfo( 0x845, 1049355, "Horned",		CraftAttributeInfo.Horned,		CraftResource.HornedLeather,	typeof( HornedLeather ),	typeof( HornedHides ) ),
				new CraftResourceInfo( 0x851, 1049356, "Barbed",		CraftAttributeInfo.Barbed,		CraftResource.BarbedLeather,	typeof( BarbedLeather ),	typeof( BarbedHides ) ),
		};

		/// <summary>
		/// Returns true if '<paramref name="resource"/>' is None, Iron, or RegularLeather. False if otherwise.
		/// </summary>
		public static bool IsStandard( CraftResource resource )
		{
			return ( resource == CraftResource.None || resource == CraftResource.Iron || resource == CraftResource.RegularLeather );
		}

		private static Hashtable m_TypeTable;

		/// <summary>
		/// Registers that '<paramref name="resourceType"/>' uses '<paramref name="resource"/>' so that it can later be queried by <see cref="CraftResources.GetFromType"/>
		/// </summary>
		public static void RegisterType( Type resourceType, CraftResource resource )
		{
			if ( m_TypeTable == null )
				m_TypeTable = new Hashtable();

			m_TypeTable[resourceType] = resource;
		}

		/// <summary>
		/// Returns the <see cref="CraftResource"/> value for which '<paramref name="resourceType"/>' uses -or- CraftResource.None if an unregistered type was specified.
		/// </summary>
		public static CraftResource GetFromType( Type resourceType )
		{
			if ( m_TypeTable == null )
				return CraftResource.None;

			object obj = m_TypeTable[resourceType];

			if ( !(obj is CraftResource) )
				return CraftResource.None;

			return (CraftResource)obj;
		}

		/// <summary>
		/// Returns a <see cref="CraftResourceInfo"/> instance describing '<paramref name="resource"/>' -or- null if an invalid resource was specified.
		/// </summary>
		public static CraftResourceInfo GetInfo( CraftResource resource )
		{
			CraftResourceInfo[] list = null;

			switch ( GetType( resource ) )
			{
				case CraftResourceType.Metal: list = m_MetalInfo; break;
				case CraftResourceType.Leather: list = Core.AOS ? m_AOSLeatherInfo : m_LeatherInfo; break;
				case CraftResourceType.Scales: list = m_ScaleInfo; break;
			}

			if ( list != null )
			{
				int index = GetIndex( resource );

				if ( index >= 0 && index < list.Length )
					return list[index];
			}

			return null;
		}

		/// <summary>
		/// Returns a <see cref="CraftResourceType"/> value indiciating the type of '<paramref name="resource"/>'.
		/// </summary>
		public static CraftResourceType GetType( CraftResource resource )
		{
			if ( resource >= CraftResource.Iron && resource <= CraftResource.Valorite )
				return CraftResourceType.Metal;

			if ( resource >= CraftResource.RegularLeather && resource <= CraftResource.BarbedLeather )
				return CraftResourceType.Leather;

			if ( resource >= CraftResource.RedScales && resource <= CraftResource.BlueScales )
				return CraftResourceType.Scales;

			return CraftResourceType.None;
		}

		/// <summary>
		/// Returns the first <see cref="CraftResource"/> in the series of resources for which '<paramref name="resource"/>' belongs.
		/// </summary>
		public static CraftResource GetStart( CraftResource resource )
		{
			switch ( GetType( resource ) )
			{
				case CraftResourceType.Metal: return CraftResource.Iron;
				case CraftResourceType.Leather: return CraftResource.RegularLeather;
				case CraftResourceType.Scales: return CraftResource.RedScales;
			}

			return CraftResource.None;
		}

		/// <summary>
		/// Returns the index of '<paramref name="resource"/>' in the seriest of resources for which it belongs.
		/// </summary>
		public static int GetIndex( CraftResource resource )
		{
			CraftResource start = GetStart( resource );

			if ( start == CraftResource.None )
				return 0;

			return (int)(resource - start);
		}

		/// <summary>
		/// Returns the <see cref="CraftResourceInfo.Number"/> property of '<paramref name="resource"/>' -or- 0 if an invalid resource was specified.
		/// </summary>
		public static int GetLocalizationNumber( CraftResource resource )
		{
			CraftResourceInfo info = GetInfo( resource );

			return ( info == null ? 0 : info.Number );
		}

		/// <summary>
		/// Returns the <see cref="CraftResourceInfo.Hue"/> property of '<paramref name="resource"/>' -or- 0 if an invalid resource was specified.
		/// </summary>
		public static int GetHue( CraftResource resource )
		{
			CraftResourceInfo info = GetInfo( resource );

			return ( info == null ? 0 : info.Hue );
		}

		/// <summary>
		/// Returns the <see cref="CraftResourceInfo.Name"/> property of '<paramref name="resource"/>' -or- an empty string if the resource specified was invalid.
		/// </summary>
		public static string GetName( CraftResource resource )
		{
			CraftResourceInfo info = GetInfo( resource );

			return ( info == null ? String.Empty : info.Name );
		}

		/// <summary>
		/// Returns the <see cref="CraftResource"/> value which represents '<paramref name="info"/>' -or- CraftResource.None if unable to convert.
		/// </summary>
		public static CraftResource GetFromOreInfo( OreInfo info )
		{
			if ( info.Name.IndexOf( "Spined" ) >= 0 )
				return CraftResource.SpinedLeather;
			else if ( info.Name.IndexOf( "Horned" ) >= 0 )
				return CraftResource.HornedLeather;
			else if ( info.Name.IndexOf( "Barbed" ) >= 0 )
				return CraftResource.BarbedLeather;
			else if ( info.Name.IndexOf( "Leather" ) >= 0 )
				return CraftResource.RegularLeather;

			if ( info.Level == 0 )
				return CraftResource.Iron;
			else if ( info.Level == 1 )
				return CraftResource.DullCopper;
			else if ( info.Level == 2 )
				return CraftResource.ShadowIron;
			else if ( info.Level == 3 )
				return CraftResource.Copper;
			else if ( info.Level == 4 )
				return CraftResource.Bronze;
			else if ( info.Level == 5 )
				return CraftResource.Gold;
			else if ( info.Level == 6 )
				return CraftResource.Agapite;
			else if ( info.Level == 7 )
				return CraftResource.Verite;
			else if ( info.Level == 8 )
				return CraftResource.Valorite;
			else if ( info.Level == 9 )
				return CraftResource.Spike;
			else if ( info.Level == 10 )
				return CraftResource.IceRock;
			else if ( info.Level == 11 )
				return CraftResource.Gypsum;
			else if ( info.Level == 12 )
				return CraftResource.Platinum;
			else if ( info.Level == 13 )
				return CraftResource.SilverRock;
			else if ( info.Level == 14 )
				return CraftResource.DarkPagan;
			else if ( info.Level == 15 )
				return CraftResource.Mystic;
			else if ( info.Level == 16 )
				return CraftResource.Spectral;
			else if ( info.Level == 17 )
				return CraftResource.OldBritain;
			else if ( info.Level == 18 )
				return CraftResource.Onyx;
			else if ( info.Level == 19 )
				return CraftResource.RedElven;
			else if ( info.Level == 20 )
				return CraftResource.Undead;
			else if ( info.Level == 21 )
				return CraftResource.Pyrite;
			else if ( info.Level == 22 )
				return CraftResource.Virginity;
			else if ( info.Level == 23 )
				return CraftResource.Malachite;
			else if ( info.Level == 24 )
				return CraftResource.LavaRock;
			else if ( info.Level == 25 )
				return CraftResource.Azurite;
			else if ( info.Level == 26 )
				return CraftResource.Dripstone;
			else if ( info.Level == 27 )
				return CraftResource.Executor;
			else if ( info.Level == 28 )
				return CraftResource.Peachblue;
			else if ( info.Level == 29 )
				return CraftResource.Destruction;
			else if ( info.Level == 30 )
				return CraftResource.Anra;
			else if ( info.Level == 31 )
				return CraftResource.Crystal;
			else if ( info.Level == 32 )
				return CraftResource.Doom;
			else if ( info.Level == 33 )
				return CraftResource.Goddess;
			else if ( info.Level == 34 )
				return CraftResource.NewCarpathia;

			return CraftResource.None;
		}

		/// <summary>
		/// Returns the <see cref="CraftResource"/> value which represents '<paramref name="info"/>', using '<paramref name="material"/>' to help resolve leather OreInfo instances.
		/// </summary>
		public static CraftResource GetFromOreInfo( OreInfo info, ArmorMaterialType material )
		{
			if ( material == ArmorMaterialType.Studded || material == ArmorMaterialType.Leather || material == ArmorMaterialType.Spined ||
				material == ArmorMaterialType.Horned || material == ArmorMaterialType.Barbed )
			{
				if ( info.Level == 0 )
					return CraftResource.RegularLeather;
				else if ( info.Level == 1 )
					return CraftResource.SpinedLeather;
				else if ( info.Level == 2 )
					return CraftResource.HornedLeather;
				else if ( info.Level == 3 )
					return CraftResource.BarbedLeather;

				return CraftResource.None;
			}

			return GetFromOreInfo( info );
		}
	}

	// NOTE: This class is only for compatability with very old RunUO versions.
	// No changes to it should be required for custom resources.
	public class OreInfo
	{
		public static readonly OreInfo Iron			= new OreInfo( 0, 0x000, "Iron" );
		public static readonly OreInfo DullCopper	= new OreInfo( 1, 0x973, "Dull Copper" );
		public static readonly OreInfo ShadowIron	= new OreInfo( 2, 0x966, "Shadow Iron" );
		public static readonly OreInfo Copper		= new OreInfo( 3, 0x96D, "Copper" );
		public static readonly OreInfo Bronze		= new OreInfo( 4, 0x972, "Bronze" );
		public static readonly OreInfo Gold			= new OreInfo( 5, 0x8A5, "Gold" );
		public static readonly OreInfo Agapite		= new OreInfo( 6, 0x979, "Agapite" );
		public static readonly OreInfo Verite		= new OreInfo( 7, 0x89F, "Verite" );
		public static readonly OreInfo Valorite		= new OreInfo( 8, 0x8AB, "Valorite" );
		public static readonly OreInfo Spike		= new OreInfo( 9, 	639, "Spike" );
		public static readonly OreInfo IceRock		= new OreInfo( 10, 1266, "Ice Rock" );
		public static readonly OreInfo Gypsum		= new OreInfo( 11, 1149, "Gypsum" );
		public static readonly OreInfo Platinum		= new OreInfo( 12, 	961, "Platinum" );
		public static readonly OreInfo SilverRock	= new OreInfo( 13, 1154, "Silver Rock" );
		public static readonly OreInfo DarkPagan	= new OreInfo( 14, 	545, "Dark Pagan" );
		public static readonly OreInfo Mystic		= new OreInfo( 15, 1151, "Mystic" );
		public static readonly OreInfo Spectral		= new OreInfo( 16, 1284, "Spectral" );
		public static readonly OreInfo OldBritain	= new OreInfo( 17, 	843, "Old Britain" );
		public static readonly OreInfo Onyx			= new OreInfo( 18, 1175, "Onyx" );
		public static readonly OreInfo RedElven		= new OreInfo( 19, 	337, "Red Elven" );
		public static readonly OreInfo Undead		= new OreInfo( 20, 	666, "Undead" );
		public static readonly OreInfo Pyrite		= new OreInfo( 21, 2213, "Pyrite" );
		public static readonly OreInfo Virginity	= new OreInfo( 22, 1153, "Virginity" );
		public static readonly OreInfo Malachite	= new OreInfo( 23, 	667, "Malachite" );
		public static readonly OreInfo LavaRock		= new OreInfo( 24, 1172, "Lava Rock" );
		public static readonly OreInfo Azurite		= new OreInfo( 25, 	403, "Azurite" );
		public static readonly OreInfo Dripstone	= new OreInfo( 26, 	711, "Dripstone" );
		public static readonly OreInfo Executor		= new OreInfo( 27, 	988, "Executor" );
		public static readonly OreInfo Peachblue	= new OreInfo( 28, 	185, "Peachblue" );
		public static readonly OreInfo Destruction	= new OreInfo( 29, 1267, "Destruction" );
		public static readonly OreInfo Anra			= new OreInfo( 30, 	730, "Anra" );
		public static readonly OreInfo Crystal		= new OreInfo( 31, 	 91, "Crystal" );
		public static readonly OreInfo Doom			= new OreInfo( 32, 	 60, "Doom" );
		public static readonly OreInfo Goddess		= new OreInfo( 33, 1167, "Goddess" );
		public static readonly OreInfo NewCarpathia	= new OreInfo( 34, 1169, "New Carpathia" );

		private int m_Level;
		private int m_Hue;
		private string m_Name;

		public OreInfo( int level, int hue, string name )
		{
			m_Level = level;
			m_Hue = hue;
			m_Name = name;
		}

		public int Level
		{
			get
			{
				return m_Level;
			}
		}

		public int Hue
		{
			get
			{
				return m_Hue;
			}
		}

		public string Name
		{
			get
			{
				return m_Name;
			}
		}
	}
}

Ore.cs

Code:
using System;
using Server.Items;
using Server.Network;
using Server.Targeting;
using Server.Engines.Craft;

namespace Server.Items
{
	public abstract class BaseOre : Item, ICommodity
	{
		private CraftResource m_Resource;

		[CommandProperty( AccessLevel.GameMaster )]
		public CraftResource Resource
		{
			get{ return m_Resource; }
			set{ m_Resource = value; InvalidateProperties(); }
		}

		string ICommodity.Description
		{
			get
			{
				return String.Format( "{0} {1} ore", Amount, CraftResources.GetName( m_Resource ).ToLower() );
			}
		}

		public abstract BaseIngot GetIngot();

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 1 ); // version

			writer.Write( (int) m_Resource );
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();

			switch ( version )
			{
				case 1:
				{
					m_Resource = (CraftResource)reader.ReadInt();
					break;
				}
				case 0:
				{
					OreInfo info;

					switch ( reader.ReadInt() )
					{
						case 0: info = OreInfo.Iron; break;
						case 1: info = OreInfo.DullCopper; break;
						case 2: info = OreInfo.ShadowIron; break;
						case 3: info = OreInfo.Copper; break;
						case 4: info = OreInfo.Bronze; break;
						case 5: info = OreInfo.Gold; break;
						case 6: info = OreInfo.Agapite; break;
						case 7: info = OreInfo.Verite; break;
						case 8: info = OreInfo.Valorite; break;
						case 9: info = OreInfo.Spike; break;
						case 10: info = OreInfo.IceRock; break;
						case 11: info = OreInfo.Gypsum; break;
						case 12: info = OreInfo.Platinum; break;
						case 13: info = OreInfo.SilverRock; break;
						case 14: info = OreInfo.DarkPagan; break;
						case 15: info = OreInfo.Mystic; break;
						case 16: info = OreInfo.Spectral; break;
						case 17: info = OreInfo.OldBritain; break;
						case 18: info = OreInfo.Onyx; break;
						case 19: info = OreInfo.RedElven; break;
						case 20: info = OreInfo.Undead; break;
						case 21: info = OreInfo.Pyrite; break;
						case 22: info = OreInfo.Virginity; break;
						case 23: info = OreInfo.Malachite; break;
						case 24: info = OreInfo.LavaRock; break;
						case 25: info = OreInfo.Azurite; break;
						case 26: info = OreInfo.Dripstone; break;
						case 27: info = OreInfo.Executor; break;
						case 28: info = OreInfo.Peachblue; break;
						case 29: info = OreInfo.Destruction; break;
						case 30: info = OreInfo.Anra; break;
						case 31: info = OreInfo.Crystal; break;
						case 32: info = OreInfo.Doom; break;
						case 33: info = OreInfo.Goddess; break;
						case 34: info = OreInfo.NewCarpathia; break;
						default: info = null; break;
					}

					m_Resource = CraftResources.GetFromOreInfo( info );
					break;
				}
			}
		}

		public BaseOre( CraftResource resource ) : this( resource, 1 )
		{
		}

		public BaseOre( CraftResource resource, int amount ) : base( 0x19B9 )
		{
			Stackable = true;
			Weight = 12.0;
			Amount = amount;
			Hue = CraftResources.GetHue( resource );

			m_Resource = resource;
		}

		public BaseOre( Serial serial ) : base( serial )
		{
		}

		public override void AddNameProperty( ObjectPropertyList list )
		{
			if ( Amount > 1 )
				list.Add( 1050039, "{0}\t#{1}", Amount, 1026583 ); // ~1_NUMBER~ ~2_ITEMNAME~
			else
				list.Add( 1026583 ); // ore
		}

		public override void GetProperties( ObjectPropertyList list )
		{
			base.GetProperties( list );

			if ( !CraftResources.IsStandard( m_Resource ) )
			{
				int num = CraftResources.GetLocalizationNumber( m_Resource );

				if ( num > 0 )
					list.Add( num );
				else
					list.Add( CraftResources.GetName( m_Resource ) );
			}
		}

		public override int LabelNumber
		{
			get
			{
				if ( m_Resource >= CraftResource.DullCopper && m_Resource <= CraftResource.Valorite )
					return 1042845 + (int)(m_Resource - CraftResource.DullCopper);

				return 1042853; // iron ore;
			}
		}

		public override void OnDoubleClick( Mobile from )
		{
			if ( !Movable )
				return;

			if ( from.InRange( this.GetWorldLocation(), 2 ) )
			{
				from.SendLocalizedMessage( 501971 ); // Select the forge on which to smelt the ore, or another pile of ore with which to combine it.
				from.Target = new InternalTarget( this );
			}
			else
			{
				from.SendLocalizedMessage( 501976 ); // The ore is too far away.
			}
		}

		private class InternalTarget : Target
		{
			private BaseOre m_Ore;

			public InternalTarget( BaseOre ore ) :  base ( 2, false, TargetFlags.None )
			{
				m_Ore = ore;
			}

			private bool IsForge( object obj )
			{
				if ( obj.GetType().IsDefined( typeof( ForgeAttribute ), false ) )
					return true;

				int itemID = 0;

				if ( obj is Item )
					itemID = ((Item)obj).ItemID;
				else if ( obj is StaticTarget )
					itemID = ((StaticTarget)obj).ItemID & 0x3FFF;

				return ( itemID == 4017 || (itemID >= 6522 && itemID <= 6569) );
			}

			protected override void OnTarget( Mobile from, object targeted )
			{
				if ( m_Ore.Deleted )
					return;

				if ( !from.InRange( m_Ore.GetWorldLocation(), 2 ) )
				{
					from.SendLocalizedMessage( 501976 ); // The ore is too far away.
					return;
				}

				if ( IsForge( targeted ) )
				{
					double difficulty;

					switch ( m_Ore.Resource )
					{
						default: difficulty = 50.0; break;
						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;
						case CraftResource.Spike: difficulty = 111.0; break;
						case CraftResource.IceRock: difficulty = 114.0; break;
						case CraftResource.Gypsum: difficulty = 117.0; break;
						case CraftResource.Platinum: difficulty = 120.0; break;
						case CraftResource.SilverRock: difficulty = 121.0; break;
						case CraftResource.DarkPagan: difficulty = 122.0; break;
						case CraftResource.Mystic: difficulty = 123.0; break;
						case CraftResource.Spectral: difficulty = 124.0; break;
						case CraftResource.OldBritain: difficulty = 125.0; break;
						case CraftResource.Onyx: difficulty = 126.0; break;
						case CraftResource.RedElven: difficulty = 127.0; break;
						case CraftResource.Undead: difficulty = 128.0; break;
						case CraftResource.Pyrite: difficulty = 129.0; break;
						case CraftResource.Virginity: difficulty = 130.0; break;
						case CraftResource.Malachite: difficulty = 131.0; break;
						case CraftResource.LavaRock: difficulty = 132.0; break;
						case CraftResource.Azurite: difficulty = 133.0; break;
						case CraftResource.Dripstone: difficulty = 134.0; break;
						case CraftResource.Executor: difficulty = 135.0; break;
						case CraftResource.Peachblue: difficulty = 136.0; break;
						case CraftResource.Destruction: difficulty = 137.0; break;
						case CraftResource.Anra: difficulty = 137.5; break;
						case CraftResource.Crystal: difficulty = 138.0; break;
						case CraftResource.Doom: difficulty = 138.5; break;
						case CraftResource.Goddess: difficulty = 139.0; break;
						case CraftResource.NewCarpathia: difficulty = 149.0; break;
					}

					double minSkill = difficulty - 25.0;
					double maxSkill = difficulty + 25.0;
					
					if ( difficulty > 50.0 && difficulty > from.Skills[SkillName.Mining].Value )
					{
						from.SendLocalizedMessage( 501986 ); // You have no idea how to smelt this strange ore!
						return;
					}

					if ( from.CheckTargetSkill( SkillName.Mining, targeted, minSkill, maxSkill ) )
					{
						int toConsume = m_Ore.Amount;

						if ( toConsume <= 0 )
						{
							from.SendLocalizedMessage( 501987 ); // There is not enough metal-bearing ore in this pile to make an ingot.
						}
						else
						{
							if ( toConsume > 30000 )
								toConsume = 30000;

							BaseIngot ingot = m_Ore.GetIngot();
							ingot.Amount = toConsume * 2;

							m_Ore.Consume( toConsume );
							from.AddToBackpack( ingot );
							//from.PlaySound( 0x57 );


							from.SendLocalizedMessage( 501988 ); // You smelt the ore removing the impurities and put the metal in your backpack.
						}
					}
					else if ( m_Ore.Amount < 2 )
					{
						from.SendLocalizedMessage( 501989 ); // You burn away the impurities but are left with no useable metal.
						m_Ore.Delete();
					}
					else
					{
						from.SendLocalizedMessage( 501990 ); // You burn away the impurities but are left with less useable metal.
						m_Ore.Amount /= 2;
					}
				}
			}
		}
	}

	public class IronOre : BaseOre
	{
		[Constructable]
		public IronOre() : this( 1 )
		{
		}

		[Constructable]
		public IronOre( int amount ) : base( CraftResource.Iron, amount )
		{
			Name = "Iron";
		}

		public IronOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new IronOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new IronIngot();
		}
	}

	public class DullCopperOre : BaseOre
	{
		[Constructable]
		public DullCopperOre() : this( 1 )
		{
		}

		[Constructable]
		public DullCopperOre( int amount ) : base( CraftResource.DullCopper, amount )
		{
			Name = "Dull Copper";
		}

		public DullCopperOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DullCopperOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new DullCopperIngot();
		}
	}

	public class ShadowIronOre : BaseOre
	{
		[Constructable]
		public ShadowIronOre() : this( 1 )
		{
		}

		[Constructable]
		public ShadowIronOre( int amount ) : base( CraftResource.ShadowIron, amount )
		{
			Name = "Shadow Iron";
		}

		public ShadowIronOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new ShadowIronOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new ShadowIronIngot();
		}
	}

	public class CopperOre : BaseOre
	{
		[Constructable]
		public CopperOre() : this( 1 )
		{
		}

		[Constructable]
		public CopperOre( int amount ) : base( CraftResource.Copper, amount )
		{
			Name = "Copper";
		}

		public CopperOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new CopperOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new CopperIngot();
		}
	}

	public class BronzeOre : BaseOre
	{
		[Constructable]
		public BronzeOre() : this( 1 )
		{
		}

		[Constructable]
		public BronzeOre( int amount ) : base( CraftResource.Bronze, amount )
		{
			Name = "Bronze";
		}

		public BronzeOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new BronzeOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new BronzeIngot();
		}
	}

	public class GoldOre : BaseOre
	{
		[Constructable]
		public GoldOre() : this( 1 )
		{
		}

		[Constructable]
		public GoldOre( int amount ) : base( CraftResource.Gold, amount )
		{
			Name = "Gold";
		}

		public GoldOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new GoldOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new GoldIngot();
		}
	}

	public class AgapiteOre : BaseOre
	{
		[Constructable]
		public AgapiteOre() : this( 1 )
		{
		}

		[Constructable]
		public AgapiteOre( int amount ) : base( CraftResource.Agapite, amount )
		{
			Name = "Agapite";
		}

		public AgapiteOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new AgapiteOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new AgapiteIngot();
		}
	}

	public class VeriteOre : BaseOre
	{
		[Constructable]
		public VeriteOre() : this( 1 )
		{
		}

		[Constructable]
		public VeriteOre( int amount ) : base( CraftResource.Verite, amount )
		{
			Name = "Verite";
		}

		public VeriteOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new VeriteOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new VeriteIngot();
		}
	}

	public class ValoriteOre : BaseOre
	{
		[Constructable]
		public ValoriteOre() : this( 1 )
		{
		}

		[Constructable]
		public ValoriteOre( int amount ) : base( CraftResource.Valorite, amount )
		{
			Name = "Valorite";
		}

		public ValoriteOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new ValoriteOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new ValoriteIngot();
		}
	}
	
	public class SpikeOre : BaseOre
	{
		[Constructable]
		public SpikeOre() : this( 1 )
		{
		}

		[Constructable]
		public SpikeOre( int amount ) : base( CraftResource.Spike, amount )
		{
			Name = "Spike";
		}

		public SpikeOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new SpikeOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new SpikeIngot();
		}
	}
	 
	 public class IceRockOre : BaseOre
	{
		[Constructable]
		public IceRockOre() : this( 1 )
		{
		}

		[Constructable]
		public IceRockOre( int amount ) : base( CraftResource.IceRock, amount )
		{
			Name = "Ice Rock";
		}

		public IceRockOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new IceRockOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new IceRockIngot();
		}
	}
	 
	 public class GypsumOre : BaseOre
	{
		[Constructable]
		public GypsumOre() : this( 1 )
		{
		}

		[Constructable]
		public GypsumOre( int amount ) : base( CraftResource.Gypsum, amount )
		{
			Name = "Gypsum";
		}

		public GypsumOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new GypsumOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new GypsumIngot();
		}
	}
	 
	 public class PlatinumOre : BaseOre
	{
		[Constructable]
		public PlatinumOre() : this( 1 )
		{
		}

		[Constructable]
		public PlatinumOre( int amount ) : base( CraftResource.Platinum, amount )
		{
			Name = "Platinum";
		}

		public PlatinumOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new PlatinumOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new PlatinumIngot();
		}
	}
	 
	 public class SilverRockOre : BaseOre
	{
		[Constructable]
		public SilverRockOre() : this( 1 )
		{
		}

		[Constructable]
		public SilverRockOre( int amount ) : base( CraftResource.SilverRock, amount )
		{
			Name = "Silver Rock";
		}

		public SilverRockOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new SilverRockOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new SilverRockIngot();
		}
	}
	 
	 public class DarkPaganOre : BaseOre
	{
		[Constructable]
		public DarkPaganOre() : this( 1 )
		{
		}

		[Constructable]
		public DarkPaganOre( int amount ) : base( CraftResource.DarkPagan, amount )
		{
			Name = "Dark Pagan";
		}

		public DarkPaganOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DarkPaganOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new DarkPaganIngot();
		}
	}
	 
	 public class MysticOre : BaseOre
	{
		[Constructable]
		public MysticOre() : this( 1 )
		{
		}

		[Constructable]
		public MysticOre( int amount ) : base( CraftResource.Mystic, amount )
		{
			Name = "Mystic";
		}

		public MysticOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new MysticOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new MysticIngot();
		}
	}
	 
	 public class SpectralOre : BaseOre
	{
		[Constructable]
		public SpectralOre() : this( 1 )
		{
		}

		[Constructable]
		public SpectralOre( int amount ) : base( CraftResource.Spectral, amount )
		{
			Name = "Spectral";
		}

		public SpectralOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new SpectralOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new SpectralIngot();
		}
	}
	 
	 public class OldBritainOre : BaseOre
	{
		[Constructable]
		public OldBritainOre() : this( 1 )
		{
		}

		[Constructable]
		public OldBritainOre( int amount ) : base( CraftResource.OldBritain, amount )
		{
			Name = "Old Britain";
		}

		public OldBritainOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new OldBritainOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new OldBritainIngot();
		}
	}
	
	 public class OnyxOre : BaseOre
	{
		[Constructable]
		public OnyxOre() : this( 1 )
		{
		}

		[Constructable]
		public OnyxOre( int amount ) : base( CraftResource.Onyx, amount )
		{
			Name = "Onyx";
		}

		public OnyxOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new OnyxOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new OnyxIngot();
		}
	}
	 
	 public class RedElvenOre : BaseOre
	{
		[Constructable]
		public RedElvenOre() : this( 1 )
		{
		}

		[Constructable]
		public RedElvenOre( int amount ) : base( CraftResource.RedElven, amount )
		{
			Name = "Red Elven";
		}

		public RedElvenOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new RedElvenOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new RedElvenIngot();
		}
	}
	 
	 public class UndeadOre : BaseOre
	{
		[Constructable]
		public UndeadOre() : this( 1 )
		{
		}

		[Constructable]
		public UndeadOre( int amount ) : base( CraftResource.Undead, amount )
		{
			Name = "Undead";
		}

		public UndeadOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new UndeadOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new UndeadIngot();
		}
	}
	 
	 public class PyriteOre : BaseOre
	{
		[Constructable]
		public PyriteOre() : this( 1 )
		{
		}

		[Constructable]
		public PyriteOre( int amount ) : base( CraftResource.Pyrite, amount )
		{
			Name = "Pyrite";
		}

		public PyriteOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new PyriteOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new PyriteIngot();
		}
	}
	 
	 public class VirginityOre : BaseOre
	{
		[Constructable]
		public VirginityOre() : this( 1 )
		{
		}

		[Constructable]
		public VirginityOre( int amount ) : base( CraftResource.Virginity, amount )
		{
			Name = "Virginity";
		}

		public VirginityOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new VirginityOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new VirginityIngot();
		}
	}
	 
	 public class MalachiteOre : BaseOre
	{
		[Constructable]
		public MalachiteOre() : this( 1 )
		{
		}

		[Constructable]
		public MalachiteOre( int amount ) : base( CraftResource.Malachite, amount )
		{
			Name = "Malachite";
		}

		public MalachiteOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new MalachiteOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new MalachiteIngot();
		}
	}
	 
	 public class LavaRockOre : BaseOre
	{
		[Constructable]
		public LavaRockOre() : this( 1 )
		{
		}

		[Constructable]
		public LavaRockOre( int amount ) : base( CraftResource.LavaRock, amount )
		{
			Name = "Lava Rock";
		}

		public LavaRockOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new LavaRockOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new LavaRockIngot();
		}
	}
	 
	 public class AzuriteOre : BaseOre
	{
		[Constructable]
		public AzuriteOre() : this( 1 )
		{
		}

		[Constructable]
		public AzuriteOre( int amount ) : base( CraftResource.Azurite, amount )
		{
			Name = "Azurite";
		}

		public AzuriteOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new AzuriteOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new AzuriteIngot();
		}
	}
	 
	 public class DripStoneOre : BaseOre
	{
		[Constructable]
		public DripStoneOre() : this( 1 )
		{
		}

		[Constructable]
		public DripStoneOre( int amount ) : base( CraftResource.Dripstone, amount )
		{
			Name = "Dripstone";
		}

		public DripStoneOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DripStoneOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new DripStoneIngot();
		}
	}
	 
	 public class ExecutorOre : BaseOre
	{
		[Constructable]
		public ExecutorOre() : this( 1 )
		{
		}

		[Constructable]
		public ExecutorOre( int amount ) : base( CraftResource.Executor, amount )
		{
			Name = "Executor";
		}

		public ExecutorOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new ExecutorOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new ExecutorIngot();
		}
	}
	 
	 public class PeachblueOre : BaseOre
	{
		[Constructable]
		public PeachblueOre() : this( 1 )
		{
		}

		[Constructable]
		public PeachblueOre( int amount ) : base( CraftResource.Peachblue, amount )
		{
			Name = "Peachblue";
		}

		public PeachblueOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new PeachblueOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new PeachblueIngot();
		}
	}
	 
	 public class DestructionOre : BaseOre
	{
		[Constructable]
		public DestructionOre() : this( 1 )
		{
		}

		[Constructable]
		public DestructionOre( int amount ) : base( CraftResource.Destruction, amount )
		{
			Name = "Destruction";
		}

		public DestructionOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DestructionOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new DestructionIngot();
		}
	}
	 
	 public class AnraOre : BaseOre
	{
		[Constructable]
		public AnraOre() : this( 1 )
		{
		}

		[Constructable]
		public AnraOre( int amount ) : base( CraftResource.Anra, amount )
		{
			Name = "Anra";
		}

		public AnraOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new AnraOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new AnraIngot();
		}
	}
	 
	 public class CrystalOre : BaseOre
	{
		[Constructable]
		public CrystalOre() : this( 1 )
		{
		}

		[Constructable]
		public CrystalOre( int amount ) : base( CraftResource.Crystal, amount )
		{
			Name = "Crystal";
		}

		public CrystalOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new CrystalOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new CrystalIngot();
		}
	}
	 
	 public class DoomOre : BaseOre
	{
		[Constructable]
		public DoomOre() : this( 1 )
		{
		}

		[Constructable]
		public DoomOre( int amount ) : base( CraftResource.Doom, amount )
		{
			Name = "Doom";
		}

		public DoomOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DoomOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new DoomIngot();
		}
	}
	 
	 public class GoddessOre : BaseOre
	{
		[Constructable]
		public GoddessOre() : this( 1 )
		{
		}

		[Constructable]
		public GoddessOre( int amount ) : base( CraftResource.Goddess, amount )
		{
			Name = "Goddess";
		}

		public GoddessOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new GoddessOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new GoddessIngot();
		}
	}
	 
	 public class NewCarpathiaOre : BaseOre
	{
		[Constructable]
		public NewCarpathiaOre() : this( 1 )
		{
		}

		[Constructable]
		public NewCarpathiaOre( int amount ) : base( CraftResource.NewCarpathia, amount )
		{
			Name = "New Carpathia";
		}

		public NewCarpathiaOre( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new NewCarpathiaOre( amount ), amount );
		}

		public override BaseIngot GetIngot()
		{
			return new NewCarpathiaIngot();
		}
	}
}

Ingots.cs

Code:
using System;
using Server.Items;
using Server.Network;

namespace Server.Items
{
	public abstract class BaseIngot : Item, ICommodity
	{
		private CraftResource m_Resource;

		[CommandProperty( AccessLevel.GameMaster )]
		public CraftResource Resource
		{
			get{ return m_Resource; }
			set{ m_Resource = value; InvalidateProperties(); }
		}
		
		string ICommodity.Description
		{
			get
			{
				return String.Format( Amount == 1 ? "{0} {1} ingot" : "{0} {1} ingots", Amount, CraftResources.GetName( m_Resource ).ToLower() );
			}
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 1 ); // version

			writer.Write( (int) m_Resource );
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();

			switch ( version )
			{
				case 1:
				{
					m_Resource = (CraftResource)reader.ReadInt();
					break;
				}
				case 0:
				{
					OreInfo info;

					switch ( reader.ReadInt() )
					{
						case 0: info = OreInfo.Iron; break;
						case 1: info = OreInfo.DullCopper; break;
						case 2: info = OreInfo.ShadowIron; break;
						case 3: info = OreInfo.Copper; break;
						case 4: info = OreInfo.Bronze; break;
						case 5: info = OreInfo.Gold; break;
						case 6: info = OreInfo.Agapite; break;
						case 7: info = OreInfo.Verite; break;
						case 8: info = OreInfo.Valorite; break;
						case 9: info = OreInfo.Spike; break;
						case 10: info = OreInfo.IceRock; break;
						case 11: info = OreInfo.Gypsum; break;
						case 12: info = OreInfo.Platinum; break;
						case 13: info = OreInfo.SilverRock; break;
						case 14: info = OreInfo.DarkPagan; break;
						case 15: info = OreInfo.Mystic; break;
						case 16: info = OreInfo.Spectral; break;
						case 17: info = OreInfo.OldBritain; break;
						case 18: info = OreInfo.Onyx; break;
						case 19: info = OreInfo.RedElven; break;
						case 20: info = OreInfo.Undead; break;
						case 21: info = OreInfo.Pyrite; break;
						case 22: info = OreInfo.Virginity; break;
						case 23: info = OreInfo.Malachite; break;
						case 24: info = OreInfo.LavaRock; break;
						case 25: info = OreInfo.Azurite; break;
						case 26: info = OreInfo.Dripstone; break;
						case 27: info = OreInfo.Executor; break;
						case 28: info = OreInfo.Peachblue; break;
						case 29: info = OreInfo.Destruction; break;
						case 30: info = OreInfo.Anra; break;
						case 31: info = OreInfo.Crystal; break;
						case 32: info = OreInfo.Doom; break;
						case 33: info = OreInfo.Goddess; break;
						case 34: info = OreInfo.NewCarpathia; break;
						default: info = null; break;
					}

					m_Resource = CraftResources.GetFromOreInfo( info );
					break;
				}
			}
		}

		public BaseIngot( CraftResource resource ) : this( resource, 1 )
		{
		}

		public BaseIngot( CraftResource resource, int amount ) : base( 0x1BF2 )
		{
			Stackable = true;
			Weight = 0.1;
			Amount = amount;
			Hue = CraftResources.GetHue( resource );

			m_Resource = resource;
		}

		public BaseIngot( Serial serial ) : base( serial )
		{
		}

		public override void AddNameProperty( ObjectPropertyList list )
		{
			if ( Amount > 1 )
				list.Add( 1050039, "{0}\t#{1}", Amount, 1027154 ); // ~1_NUMBER~ ~2_ITEMNAME~
			else
				list.Add( 1027154 ); // ingots
		}

		public override void GetProperties( ObjectPropertyList list )
		{
			base.GetProperties( list );

			if ( !CraftResources.IsStandard( m_Resource ) )
			{
				int num = CraftResources.GetLocalizationNumber( m_Resource );

				if ( num > 0 )
					list.Add( num );
				else
					list.Add( CraftResources.GetName( m_Resource ) );
			}
		}

		public override int LabelNumber
		{
			get
			{
				if ( m_Resource >= CraftResource.DullCopper && m_Resource <= CraftResource.Valorite )
					return 1042684 + (int)(m_Resource - CraftResource.DullCopper);

				return 1042692;
			}
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class IronIngot : BaseIngot
	{
		[Constructable]
		public IronIngot() : this( 1 )
		{
		}

		[Constructable]
		public IronIngot( int amount ) : base( CraftResource.Iron, amount )
		{
			Name = "Iron";
		}

		public IronIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new IronIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class DullCopperIngot : BaseIngot
	{
		[Constructable]
		public DullCopperIngot() : this( 1 )
		{
		}

		[Constructable]
		public DullCopperIngot( int amount ) : base( CraftResource.DullCopper, amount )
		{
		}

		public DullCopperIngot( Serial serial ) : base( serial )
		{
			Name = "Dull Copper";
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DullCopperIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class ShadowIronIngot : BaseIngot
	{
		[Constructable]
		public ShadowIronIngot() : this( 1 )
		{
		}

		[Constructable]
		public ShadowIronIngot( int amount ) : base( CraftResource.ShadowIron, amount )
		{
			Name = "Shadow Iron";
		}

		public ShadowIronIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new ShadowIronIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class CopperIngot : BaseIngot
	{
		[Constructable]
		public CopperIngot() : this( 1 )
		{
		}

		[Constructable]
		public CopperIngot( int amount ) : base( CraftResource.Copper, amount )
		{
			Name = "Copper";
		}

		public CopperIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new CopperIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class BronzeIngot : BaseIngot
	{
		[Constructable]
		public BronzeIngot() : this( 1 )
		{
		}

		[Constructable]
		public BronzeIngot( int amount ) : base( CraftResource.Bronze, amount )
		{
			Name = "Bronze";
		}

		public BronzeIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new BronzeIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class GoldIngot : BaseIngot
	{
		[Constructable]
		public GoldIngot() : this( 1 )
		{
		}

		[Constructable]
		public GoldIngot( int amount ) : base( CraftResource.Gold, amount )
		{
			Name = "Gold";
		}

		public GoldIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new GoldIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class AgapiteIngot : BaseIngot
	{
		[Constructable]
		public AgapiteIngot() : this( 1 )
		{
		}

		[Constructable]
		public AgapiteIngot( int amount ) : base( CraftResource.Agapite, amount )
		{
			Name = "Agapite";
		}

		public AgapiteIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new AgapiteIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class VeriteIngot : BaseIngot
	{
		[Constructable]
		public VeriteIngot() : this( 1 )
		{
		}

		[Constructable]
		public VeriteIngot( int amount ) : base( CraftResource.Verite, amount )
		{
			Name = "Verite";
		}

		public VeriteIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new VeriteIngot( amount ), amount );
		}
	}

	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class ValoriteIngot : BaseIngot
	{
		[Constructable]
		public ValoriteIngot() : this( 1 )
		{
		}

		[Constructable]
		public ValoriteIngot( int amount ) : base( CraftResource.Valorite, amount )
		{
			Name = "Valorite";
		}

		public ValoriteIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new ValoriteIngot( amount ), amount );
		}
	}
	
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class SpikeIngot : BaseIngot
	{
		[Constructable]
		public SpikeIngot() : this( 1 )
		{
		}

		[Constructable]
		public SpikeIngot( int amount ) : base( CraftResource.Spike, amount )
		{
			Name = "Spike";
		}

		public SpikeIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new SpikeIngot( amount ), amount );
		}
	}
	
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class IceRockIngot : BaseIngot
	{
		[Constructable]
		public IceRockIngot() : this( 1 )
		{
		}

		[Constructable]
		public IceRockIngot( int amount ) : base( CraftResource.IceRock, amount )
		{
			Name = "Ice Rock";
		}

		public IceRockIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new IceRockIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class GypsumIngot : BaseIngot
	{
		[Constructable]
		public GypsumIngot() : this( 1 )
		{
		}

		[Constructable]
		public GypsumIngot( int amount ) : base( CraftResource.Gypsum, amount )
		{
			Name = "Gypsum";
		}

		public GypsumIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new GypsumIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class PlatinumIngot : BaseIngot
	{
		[Constructable]
		public PlatinumIngot() : this( 1 )
		{
		}

		[Constructable]
		public PlatinumIngot( int amount ) : base( CraftResource.Platinum, amount )
		{
			Name = "Platinum";
		}

		public PlatinumIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new PlatinumIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class SilverRockIngot : BaseIngot
	{
		[Constructable]
		public SilverRockIngot() : this( 1 )
		{
		}

		[Constructable]
		public SilverRockIngot( int amount ) : base( CraftResource.SilverRock, amount )
		{
			Name = "Silver Rock";
		}

		public SilverRockIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new SilverRockIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class DarkPaganIngot : BaseIngot
	{
		[Constructable]
		public DarkPaganIngot() : this( 1 )
		{
		}

		[Constructable]
		public DarkPaganIngot( int amount ) : base( CraftResource.DarkPagan, amount )
		{
			Name = "Dark Pagan";
		}

		public DarkPaganIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DarkPaganIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class MysticIngot : BaseIngot
	{
		[Constructable]
		public MysticIngot() : this( 1 )
		{
		}

		[Constructable]
		public MysticIngot( int amount ) : base( CraftResource.Mystic, amount )
		{
			Name = "Mystic";
		}

		public MysticIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new MysticIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class SpectralIngot : BaseIngot
	{
		[Constructable]
		public SpectralIngot() : this( 1 )
		{
		}

		[Constructable]
		public SpectralIngot( int amount ) : base( CraftResource.Spectral, amount )
		{
			Name = "Spectral";
		}

		public SpectralIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new SpectralIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class OldBritainIngot : BaseIngot
	{
		[Constructable]
		public OldBritainIngot() : this( 1 )
		{
		}

		[Constructable]
		public OldBritainIngot( int amount ) : base( CraftResource.OldBritain, amount )
		{
			Name = "Old Britain";
		}

		public OldBritainIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new OldBritainIngot( amount ), amount );
		}
	}
	
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class OnyxIngot : BaseIngot
	{
		[Constructable]
		public OnyxIngot() : this( 1 )
		{
		}

		[Constructable]
		public OnyxIngot( int amount ) : base( CraftResource.Onyx, amount )
		{
			Name = "Onyx";
		}

		public OnyxIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new OnyxIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class RedElvenIngot : BaseIngot
	{
		[Constructable]
		public RedElvenIngot() : this( 1 )
		{
		}

		[Constructable]
		public RedElvenIngot( int amount ) : base( CraftResource.RedElven, amount )
		{
			Name = "Red Elven";
		}

		public RedElvenIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new RedElvenIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class UndeadIngot : BaseIngot
	{
		[Constructable]
		public UndeadIngot() : this( 1 )
		{
		}

		[Constructable]
		public UndeadIngot( int amount ) : base( CraftResource.Undead, amount )
		{
			Name = "Undead";
		}

		public UndeadIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new UndeadIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class PyriteIngot : BaseIngot
	{
		[Constructable]
		public PyriteIngot() : this( 1 )
		{
		}

		[Constructable]
		public PyriteIngot( int amount ) : base( CraftResource.Pyrite, amount )
		{
			Name = "Pyrite";
		}

		public PyriteIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new PyriteIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class VirginityIngot : BaseIngot
	{
		[Constructable]
		public VirginityIngot() : this( 1 )
		{
		}

		[Constructable]
		public VirginityIngot( int amount ) : base( CraftResource.Virginity, amount )
		{
			Name = "Virginity";
		}

		public VirginityIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new VirginityIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class MalachiteIngot : BaseIngot
	{
		[Constructable]
		public MalachiteIngot() : this( 1 )
		{
		}

		[Constructable]
		public MalachiteIngot( int amount ) : base( CraftResource.Malachite, amount )
		{
			Name = "Malachite";
		}

		public MalachiteIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new MalachiteIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class LavaRockIngot : BaseIngot
	{
		[Constructable]
		public LavaRockIngot() : this( 1 )
		{
		}

		[Constructable]
		public LavaRockIngot( int amount ) : base( CraftResource.LavaRock, amount )
		{
			Name = "Lava Rock";
		}

		public LavaRockIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new LavaRockIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class AzuriteIngot : BaseIngot
	{
		[Constructable]
		public AzuriteIngot() : this( 1 )
		{
		}

		[Constructable]
		public AzuriteIngot( int amount ) : base( CraftResource.Azurite, amount )
		{
			Name = "Azurite";
		}

		public AzuriteIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new AzuriteIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class DripStoneIngot : BaseIngot
	{
		[Constructable]
		public DripStoneIngot() : this( 1 )
		{
		}

		[Constructable]
		public DripStoneIngot( int amount ) : base( CraftResource.Dripstone, amount )
		{
			Name = "Dripstone";
		}

		public DripStoneIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DripStoneIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class ExecutorIngot : BaseIngot
	{
		[Constructable]
		public ExecutorIngot() : this( 1 )
		{
		}

		[Constructable]
		public ExecutorIngot( int amount ) : base( CraftResource.Executor, amount )
		{
			Name = "Executor";
		}

		public ExecutorIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new ExecutorIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class PeachblueIngot : BaseIngot
	{
		[Constructable]
		public PeachblueIngot() : this( 1 )
		{
		}

		[Constructable]
		public PeachblueIngot( int amount ) : base( CraftResource.Peachblue, amount )
		{
			Name = "Peachblue";
		}

		public PeachblueIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new PeachblueIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class DestructionIngot : BaseIngot
	{
		[Constructable]
		public DestructionIngot() : this( 1 )
		{
		}

		[Constructable]
		public DestructionIngot( int amount ) : base( CraftResource.Destruction, amount )
		{
			Name = "Destruction";
		}

		public DestructionIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DestructionIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class AnraIngot : BaseIngot
	{
		[Constructable]
		public AnraIngot() : this( 1 )
		{
		}

		[Constructable]
		public AnraIngot( int amount ) : base( CraftResource.Anra, amount )
		{
			Name = "Anra";
		}

		public AnraIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new AnraIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class CrystalIngot : BaseIngot
	{
		[Constructable]
		public CrystalIngot() : this( 1 )
		{
		}

		[Constructable]
		public CrystalIngot( int amount ) : base( CraftResource.Crystal, amount )
		{
			Name = "Crystal";
		}

		public CrystalIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new CrystalIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class DoomIngot : BaseIngot
	{
		[Constructable]
		public DoomIngot() : this( 1 )
		{
		}

		[Constructable]
		public DoomIngot( int amount ) : base( CraftResource.Doom, amount )
		{
			Name = "Doom";
		}

		public DoomIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new DoomIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class GoddessIngot : BaseIngot
	{
		[Constructable]
		public GoddessIngot() : this( 1 )
		{
		}

		[Constructable]
		public GoddessIngot( int amount ) : base( CraftResource.Goddess, amount )
		{
			Name = "Goddess";
		}

		public GoddessIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new GoddessIngot( amount ), amount );
		}
	}
	 
	[FlipableAttribute( 0x1BF2, 0x1BEF )]
	public class NewCarpathiaIngot : BaseIngot
	{
		[Constructable]
		public NewCarpathiaIngot() : this( 1 )
		{
		}

		[Constructable]
		public NewCarpathiaIngot( int amount ) : base( CraftResource.NewCarpathia, amount )
		{
			Name = "New Carpathia";
		}

		public NewCarpathiaIngot( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override Item Dupe( int amount )
		{
			return base.Dupe( new NewCarpathiaIngot( amount ), amount );
		}
	}
}

Sorry to be such a pain in the ass. There must be something about these scripts that I do not yet understand.
 
Top