632 lines
13 KiB
C#
632 lines
13 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|