using System; using Server.Items; using Server.Network; using Server.Targeting; using Server.Engines.Craft; using Server.Mobiles; namespace Server.Items { public abstract class BaseOre : Item { private CraftResource m_Resource; [CommandProperty( AccessLevel.GameMaster )] public CraftResource Resource { get{ return m_Resource; } set{ m_Resource = value; InvalidateProperties(); } } public abstract BaseIngot GetIngot(); public virtual int IngotsPerOre { get{ return 2; } } public override void Serialize( GenericWriter writer ) { base.Serialize( writer ); writer.Write( (int) 1 ); 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; default: info = null; break; } m_Resource = CraftResources.GetFromOreInfo( info ); break; } } } private static int RandomSize() { return 0x19B9; } public BaseOre( CraftResource resource ) : this( resource, 1 ) { } public BaseOre( CraftResource resource, int amount ) : base( RandomSize() ) { Stackable = true; Amount = amount; Hue = CraftResources.GetHue( resource ); Weight = 1.0; 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 ); else list.Add( 1026583 ); } 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; } } public override void OnDoubleClick( Mobile from ) { if ( !Movable ) return; if ( RootParent is BaseCreature ) { from.SendLocalizedMessage( 500447 ); } else if ( from.InRange( this.GetWorldLocation(), 2 ) ) { from.SendLocalizedMessage( 501971 ); if ( Utility.RandomDouble() < 0.1 ) from.SendMessage("Target yourself to automatically choose a nearby target"); from.Target = new InternalTarget( this, from ); } else { from.SendLocalizedMessage( 501976 ); } } public bool SmeltAll(Mobile from, object targeted) { if ( Deleted ) return false; double difficulty; switch ( m_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; } double minSkill = difficulty - 25.0; double maxSkill = difficulty + 25.0; if (Resource == CraftResource.Iron) { minSkill = 0.0; maxSkill = 75.0; } if (Resource == CraftResource.Iron) maxSkill = 65.0 + 10.0; if ( difficulty > 50.0 && difficulty > from.Skills[SkillName.Mining].Value || from.Skills[SkillName.Mining].Value < minSkill) { from.SendLocalizedMessage( 501986 ); return false; } int lost = 0; int remaining = Amount; while(0 < remaining) { if (maxSkill < from.Skills[SkillName.Mining].Value) break; if (!from.CheckTargetSkill(SkillName.Mining, targeted, minSkill, maxSkill)) lost++; remaining--; } from.PlaySound( 0x2B ); int ingots = Amount - lost; if (0 < lost) { from.SendLocalizedMessage( 501990 ); // You burn away the impurities but are left with less useable metal. } else { from.SendLocalizedMessage( 501988 ); // You smelt the ore removing the impurities and put the metal in your backpack. } if (0 < ingots) { BaseIngot ingot = GetIngot(); Delete(); ingot.Amount = ingots * IngotsPerOre; from.AddToBackpack(ingot); } else { Delete(); } return true; } private class InternalTarget : Target { private readonly BaseOre m_Ore; private readonly Mobile m_From; public InternalTarget( BaseOre ore, Mobile from ) : base ( 2, false, TargetFlags.None ) { m_Ore = ore; m_From = from; } private bool IsForge( object obj ) { if ( Core.ML && obj is Mobile && ((Mobile)obj).IsDeadBondedPet ) return false; 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; return ( itemID == 4017 || (itemID >= 6522 && itemID <= 6569) ); } private bool UseNearbyForge(Mobile from, int range) { if (from.Map == null) return false; IPooledEnumerable eable = from.Map.GetItemsInRange(from.Location, range); foreach (Item item in eable) { if (IsForge(item)) { eable.Free(); return true; } } eable.Free(); for (int x = -range; x <= range; ++x) { for (int y = -range; y <= range; ++y) { Server.StaticTile[] tiles = from.Map.Tiles.GetStaticTiles(from.X + x, from.Y + y, true); for (int i = 0; i < tiles.Length; ++i) { int id = tiles[i].ID & 0x3FFF; if (id == 4017 || (id >= 6522 && id <= 6569)) return true; } } } return false; } protected override void OnTarget( Mobile from, object targeted ) { if ( !from.InRange( m_Ore.GetWorldLocation(), 2 ) ) { from.SendLocalizedMessage( 501976 ); // The ore is too far away. return; } if ( !IsForge( targeted ) && false == ( targeted == m_From && UseNearbyForge( from, Range ) ) ) { from.SendMessage("That is not a forge."); return; } m_Ore.SmeltAll(from, targeted); } } } public class IronOre : BaseOre { [Constructable] public IronOre() : this( 1 ) { } [Constructable] public IronOre( int amount ) : base( CraftResource.Iron, amount ) { } public IronOre( bool fixedSize ) : this( 1 ) { if ( fixedSize ) ItemID = 0x19B8; } 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 BaseIngot GetIngot() { return new IronIngot(); } } public class DullCopperOre : BaseOre { [Constructable] public DullCopperOre() : this( 1 ) { } [Constructable] public DullCopperOre( int amount ) : base( CraftResource.DullCopper, amount ) { } 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 BaseIngot GetIngot() { return new DullCopperIngot(); } } public class ShadowIronOre : BaseOre { [Constructable] public ShadowIronOre() : this( 1 ) { } [Constructable] public ShadowIronOre( int amount ) : base( CraftResource.ShadowIron, amount ) { } 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 BaseIngot GetIngot() { return new ShadowIronIngot(); } } public class CopperOre : BaseOre { [Constructable] public CopperOre() : this( 1 ) { } [Constructable] public CopperOre( int amount ) : base( CraftResource.Copper, amount ) { } 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 BaseIngot GetIngot() { return new CopperIngot(); } } public class BronzeOre : BaseOre { [Constructable] public BronzeOre() : this( 1 ) { } [Constructable] public BronzeOre( int amount ) : base( CraftResource.Bronze, amount ) { } 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 BaseIngot GetIngot() { return new BronzeIngot(); } } public class GoldOre : BaseOre { [Constructable] public GoldOre() : this( 1 ) { } [Constructable] public GoldOre( int amount ) : base( CraftResource.Gold, amount ) { } 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 BaseIngot GetIngot() { return new GoldIngot(); } } public class AgapiteOre : BaseOre { [Constructable] public AgapiteOre() : this( 1 ) { } [Constructable] public AgapiteOre( int amount ) : base( CraftResource.Agapite, amount ) { } 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 BaseIngot GetIngot() { return new AgapiteIngot(); } } public class VeriteOre : BaseOre { [Constructable] public VeriteOre() : this( 1 ) { } [Constructable] public VeriteOre( int amount ) : base( CraftResource.Verite, amount ) { } 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 BaseIngot GetIngot() { return new VeriteIngot(); } } public class ValoriteOre : BaseOre { [Constructable] public ValoriteOre() : this( 1 ) { } [Constructable] public ValoriteOre( int amount ) : base( CraftResource.Valorite, amount ) { } 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 BaseIngot GetIngot() { return new ValoriteIngot(); } } }