mitty;727420 said:I was typing.... LOL
Not a Problem hopefully he got it working now.mitty;727420 said:I was typing.... LOL
RunUO - [www.runuo.com] Version 2.0, Build 2891.37328
Core: Running on .NET Framework Version 2.0.50727
Scripts: Compiling C# scripts...failed (5 errors, 2 warnings)
Warnings:
+ Items/Containers/LockableContainer.cs:
CS0108: Line 122: 'Server.Items.LockableContainer.Resource' hides inherited
member 'Server.Items.BaseContainer.Resource'. Use the new keyword if hiding was
intended.
+ Customs/Karma/MarbleCrafting/DefMarbleCrafting.cs:
CS0219: Line 95: The variable 'index' is assigned but its value is never use
d
Errors:
+ Items/Armor/BaseArmor.cs:
CS0029: Line 1588: Cannot implicitly convert type 'int' to 'string'
CS0019: Line 1593: Operator '!=' cannot be applied to operands of type 'stri
ng' and 'int'
CS0019: Line 1600: Operator '!=' cannot be applied to operands of type 'stri
ng' and 'int'
+ Items/Weapons/BaseWeapon.cs:
CS0029: Line 3139: Cannot implicitly convert type 'int' to 'string'
CS0019: Line 3142: Operator '!=' cannot be applied to operands of type 'stri
ng' and 'int'
+ Engines/Craft/Core/CraftItem.cs:
CS0103: Line 104: The name 'm_ItemIDs' does not exist in the current context
CS0103: Line 111: The name 'itemId' does not exist in the current context
CS0103: Line 113: The name 'itemId' does not exist in the current context
CS0103: Line 115: The name 'itemId' does not exist in the current context
CS0103: Line 117: The name 'itemId' does not exist in the current context
CS0103: Line 119: The name 'itemId' does not exist in the current context
CS0103: Line 122: The name 'itemId' does not exist in the current context
CS0103: Line 127: The name 'itemId' does not exist in the current context
CS0103: Line 131: The name 'itemId' does not exist in the current context
CS0103: Line 137: The name 'itemId' does not exist in the current context
CS0103: Line 142: The name 'itemId' does not exist in the current context
CS0103: Line 145: The name 'itemId' does not exist in the current context
+ Items/Skill Items/Carpenter Items/Board.cs:
CS1002: Line 232: ; expected
+ Misc/ResourceInfo.cs:
CS0128: Line 611: A local variable named 'red' is already defined in this sc
ope
CS0128: Line 616: A local variable named 'yellow' is already defined in this
scope
CS0128: Line 621: A local variable named 'black' is already defined in this
scope
CS0128: Line 626: A local variable named 'green' is already defined in this
scope
CS0128: Line 631: A local variable named 'white' is already defined in this
scope
CS0128: Line 636: A local variable named 'blue' is already defined in this s
cope
Scripts: One or more scripts failed to compile or no script files were found.
- Press return to exit, or R to try again.
Warnings:
+ Items/Containers/LockableContainer.cs:
CS0108: Line 122: 'Server.Items.LockableContainer.Resource' hides inherited
member 'Server.Items.BaseContainer.Resource'. Use the new keyword if hiding was
intended.
+ Customs/Karma/MarbleCrafting/DefMarbleCrafting.cs:
CS0219: Line 95: The variable 'index' is assigned but its value is never use
d
Errors:
+ Items/Armor/BaseArmor.cs:
CS0029: Line 1593: Cannot implicitly convert type 'int' to 'string'
CS0029: Line 1593: Cannot implicitly convert type 'string' to 'bool'
CS0029: Line 1600: Cannot implicitly convert type 'int' to 'string'
CS0029: Line 1600: Cannot implicitly convert type 'string' to 'bool'
+ Engines/Craft/Core/CraftItem.cs:
CS0103: Line 106: The name 'm_ItemIDs' does not exist in the current context
CS0103: Line 147: The name 'm_ItemIDs' does not exist in the current context
+ Items/Skill Items/Carpenter Items/Board.cs:
CS1002: Line 232: ; expected
Scripts: One or more scripts failed to compile or no script files were found.
- Press return to exit, or R to try again.
using System;
using System.Collections;
using System.Collections.Generic;
using Server.Network;
using Server.Engines.Craft;
using Server.Factions;
using AMA = Server.Items.ArmorMeditationAllowance;
using AMT = Server.Items.ArmorMaterialType;
using ABT = Server.Items.ArmorBodyType;
namespace Server.Items
{
public abstract class BaseArmor : Item, IScissorable, IFactionItem, ICraftable, IWearableDurability, ISetItem
{
#region Factions
private FactionItem m_FactionState;
public FactionItem FactionItemState
{
get{ return m_FactionState; }
set
{
m_FactionState = value;
if ( m_FactionState == null )
Hue = CraftResources.GetHue( Resource );
LootType = ( m_FactionState == null ? LootType.Regular : LootType.Blessed );
}
}
#endregion
/* Armor internals work differently now (Jun 19 2003)
*
* The attributes defined below default to -1.
* If the value is -1, the corresponding virtual 'Aos/Old' property is used.
* If not, the attribute value itself is used. Here's the list:
* - ArmorBase
* - StrBonus
* - DexBonus
* - IntBonus
* - StrReq
* - DexReq
* - IntReq
* - MeditationAllowance
*/
// Instance values. These values must are unique to each armor piece.
private int m_MaxHitPoints;
private int m_HitPoints;
private Mobile m_Crafter;
private ArmorQuality m_Quality;
private ArmorDurabilityLevel m_Durability;
private ArmorProtectionLevel m_Protection;
private CraftResource m_Resource;
private bool m_Identified, m_PlayerConstructed;
private int m_PhysicalBonus, m_FireBonus, m_ColdBonus, m_PoisonBonus, m_EnergyBonus;
private AosAttributes m_AosAttributes;
private AosArmorAttributes m_AosArmorAttributes;
private AosSkillBonuses m_AosSkillBonuses;
// Overridable values. These values are provided to override the defaults which get defined in the individual armor scripts.
private int m_ArmorBase = -1;
private int m_StrBonus = -1, m_DexBonus = -1, m_IntBonus = -1;
private int m_StrReq = -1, m_DexReq = -1, m_IntReq = -1;
private AMA m_Meditate = (AMA)(-1);
public virtual bool AllowMaleWearer{ get{ return true; } }
public virtual bool AllowFemaleWearer{ get{ return true; } }
public abstract AMT MaterialType{ get; }
public virtual int RevertArmorBase{ get{ return ArmorBase; } }
public virtual int ArmorBase{ get{ return 0; } }
public virtual AMA DefMedAllowance{ get{ return AMA.None; } }
public virtual AMA AosMedAllowance{ get{ return DefMedAllowance; } }
public virtual AMA OldMedAllowance{ get{ return DefMedAllowance; } }
public virtual int AosStrBonus{ get{ return 0; } }
public virtual int AosDexBonus{ get{ return 0; } }
public virtual int AosIntBonus{ get{ return 0; } }
public virtual int AosStrReq{ get{ return 0; } }
public virtual int AosDexReq{ get{ return 0; } }
public virtual int AosIntReq{ get{ return 0; } }
public virtual int OldStrBonus{ get{ return 0; } }
public virtual int OldDexBonus{ get{ return 0; } }
public virtual int OldIntBonus{ get{ return 0; } }
public virtual int OldStrReq{ get{ return 0; } }
public virtual int OldDexReq{ get{ return 0; } }
public virtual int OldIntReq{ get{ return 0; } }
[CommandProperty( AccessLevel.GameMaster )]
public AMA MeditationAllowance
{
get{ return ( m_Meditate == (AMA)(-1) ? Core.AOS ? AosMedAllowance : OldMedAllowance : m_Meditate ); }
set{ m_Meditate = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public int BaseArmorRating
{
get
{
if ( m_ArmorBase == -1 )
return ArmorBase;
else
return m_ArmorBase;
}
set
{
m_ArmorBase = value; Invalidate();
}
}
public double BaseArmorRatingScaled
{
get
{
return ( BaseArmorRating * ArmorScalar );
}
}
public virtual double ArmorRating
{
get
{
int ar = BaseArmorRating;
if ( m_Protection != ArmorProtectionLevel.Regular )
ar += 10 + (5 * (int)m_Protection);
switch ( m_Resource )
{
case CraftResource.DullCopper: ar += 2; break;
case CraftResource.ShadowIron: ar += 4; break;
case CraftResource.Copper: ar += 6; break;
case CraftResource.Bronze: ar += 8; break;
case CraftResource.Gold: ar += 10; break;
case CraftResource.Agapite: ar += 12; break;
case CraftResource.Verite: ar += 14; break;
case CraftResource.Valorite: ar += 16; break;
case CraftResource.Silver: ar += 18; break;
case CraftResource.Platinum: ar += 20; break;
case CraftResource.Mythril: ar += 22; break;
case CraftResource.Obsidian: ar += 24; break;
case CraftResource.Jade: ar += 26; break;
case CraftResource.Moonstone: ar += 28; break;
case CraftResource.Sunstone: ar += 30; break;
case CraftResource.Bloodstone: ar += 32; break;
case CraftResource.SpinedLeather: ar += 10; break;
case CraftResource.HornedLeather: ar += 13; break;
case CraftResource.BarbedLeather: ar += 16; break;
case CraftResource.DragonLeather: ar += 18; break;
case CraftResource.DaemonLeather: ar += 20; break;
}
ar += -8 + (8 * (int)m_Quality);
return ScaleArmorByDurability( ar );
}
}
public double ArmorRatingScaled
{
get
{
return ( ArmorRating * ArmorScalar );
}
}
[CommandProperty( AccessLevel.GameMaster )]
public int StrBonus
{
get{ return ( m_StrBonus == -1 ? Core.AOS ? AosStrBonus : OldStrBonus : m_StrBonus ); }
set{ m_StrBonus = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public int DexBonus
{
get{ return ( m_DexBonus == -1 ? Core.AOS ? AosDexBonus : OldDexBonus : m_DexBonus ); }
set{ m_DexBonus = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public int IntBonus
{
get{ return ( m_IntBonus == -1 ? Core.AOS ? AosIntBonus : OldIntBonus : m_IntBonus ); }
set{ m_IntBonus = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public int StrRequirement
{
get{ return ( m_StrReq == -1 ? Core.AOS ? AosStrReq : OldStrReq : m_StrReq ); }
set{ m_StrReq = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public int DexRequirement
{
get{ return ( m_DexReq == -1 ? Core.AOS ? AosDexReq : OldDexReq : m_DexReq ); }
set{ m_DexReq = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public int IntRequirement
{
get{ return ( m_IntReq == -1 ? Core.AOS ? AosIntReq : OldIntReq : m_IntReq ); }
set{ m_IntReq = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public bool Identified
{
get{ return m_Identified; }
set{ m_Identified = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public bool PlayerConstructed
{
get{ return m_PlayerConstructed; }
set{ m_PlayerConstructed = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public CraftResource Resource
{
get
{
return m_Resource;
}
set
{
if ( m_Resource != value )
{
UnscaleDurability();
m_Resource = value;
Hue = CraftResources.GetHue( m_Resource );
Invalidate();
InvalidateProperties();
if ( Parent is Mobile )
((Mobile)Parent).UpdateResistances();
ScaleDurability();
}
}
}
public virtual double ArmorScalar
{
get
{
int pos = (int)BodyPosition;
if ( pos >= 0 && pos < m_ArmorScalars.Length )
return m_ArmorScalars[pos];
return 1.0;
}
}
[CommandProperty( AccessLevel.GameMaster )]
public int MaxHitPoints
{
get{ return m_MaxHitPoints; }
set{ m_MaxHitPoints = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public int HitPoints
{
get
{
return m_HitPoints;
}
set
{
if ( value != m_HitPoints && MaxHitPoints > 0 )
{
m_HitPoints = value;
if ( m_HitPoints < 0 )
Delete();
else if ( m_HitPoints > MaxHitPoints )
m_HitPoints = MaxHitPoints;
InvalidateProperties();
}
}
}
[CommandProperty( AccessLevel.GameMaster )]
public Mobile Crafter
{
get{ return m_Crafter; }
set{ m_Crafter = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public ArmorQuality Quality
{
get{ return m_Quality; }
set{ UnscaleDurability(); m_Quality = value; Invalidate(); InvalidateProperties(); ScaleDurability(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public ArmorDurabilityLevel Durability
{
get{ return m_Durability; }
set{ UnscaleDurability(); m_Durability = value; ScaleDurability(); InvalidateProperties(); }
}
public virtual int ArtifactRarity
{
get{ return 0; }
}
[CommandProperty( AccessLevel.GameMaster )]
public ArmorProtectionLevel ProtectionLevel
{
get
{
return m_Protection;
}
set
{
if ( m_Protection != value )
{
m_Protection = value;
Invalidate();
InvalidateProperties();
if ( Parent is Mobile )
((Mobile)Parent).UpdateResistances();
}
}
}
[CommandProperty( AccessLevel.GameMaster )]
public AosAttributes Attributes
{
get{ return m_AosAttributes; }
set{}
}
[CommandProperty( AccessLevel.GameMaster )]
public AosArmorAttributes ArmorAttributes
{
get{ return m_AosArmorAttributes; }
set{}
}
[CommandProperty( AccessLevel.GameMaster )]
public AosSkillBonuses SkillBonuses
{
get{ return m_AosSkillBonuses; }
set{}
}
public int ComputeStatReq( StatType type )
{
int v;
if ( type == StatType.Str )
v = StrRequirement;
else if ( type == StatType.Dex )
v = DexRequirement;
else
v = IntRequirement;
return AOS.Scale( v, 100 - GetLowerStatReq() );
}
public int ComputeStatBonus( StatType type )
{
if ( type == StatType.Str )
return StrBonus + Attributes.BonusStr;
else if ( type == StatType.Dex )
return DexBonus + Attributes.BonusDex;
else
return IntBonus + Attributes.BonusInt;
}
[CommandProperty( AccessLevel.GameMaster )]
public int PhysicalBonus{ get{ return m_PhysicalBonus; } set{ m_PhysicalBonus = value; InvalidateProperties(); } }
[CommandProperty( AccessLevel.GameMaster )]
public int FireBonus{ get{ return m_FireBonus; } set{ m_FireBonus = value; InvalidateProperties(); } }
[CommandProperty( AccessLevel.GameMaster )]
public int ColdBonus{ get{ return m_ColdBonus; } set{ m_ColdBonus = value; InvalidateProperties(); } }
[CommandProperty( AccessLevel.GameMaster )]
public int PoisonBonus{ get{ return m_PoisonBonus; } set{ m_PoisonBonus = value; InvalidateProperties(); } }
[CommandProperty( AccessLevel.GameMaster )]
public int EnergyBonus{ get{ return m_EnergyBonus; } set{ m_EnergyBonus = value; InvalidateProperties(); } }
public virtual int BasePhysicalResistance{ get{ return 0; } }
public virtual int BaseFireResistance{ get{ return 0; } }
public virtual int BaseColdResistance{ get{ return 0; } }
public virtual int BasePoisonResistance{ get{ return 0; } }
public virtual int BaseEnergyResistance{ get{ return 0; } }
// Mondain's Legacy Mod
public override int PhysicalResistance{ get{ return BasePhysicalResistance + GetProtOffset() + GetResourceAttrs().ArmorPhysicalResist + m_PhysicalBonus + (SetEquipped ? m_SetPhysicalBonus : 0 ); } }
public override int FireResistance{ get{ return BaseFireResistance + GetProtOffset() + GetResourceAttrs().ArmorFireResist + m_FireBonus + (SetEquipped ? m_SetFireBonus : 0 ); } }
public override int ColdResistance{ get{ return BaseColdResistance + GetProtOffset() + GetResourceAttrs().ArmorColdResist + m_ColdBonus + (SetEquipped ? m_SetColdBonus : 0 ); } }
public override int PoisonResistance{ get{ return BasePoisonResistance + GetProtOffset() + GetResourceAttrs().ArmorPoisonResist + m_PoisonBonus + (SetEquipped ? m_SetPoisonBonus : 0 ); } }
public override int EnergyResistance{ get{ return BaseEnergyResistance + GetProtOffset() + GetResourceAttrs().ArmorEnergyResist + m_EnergyBonus + (SetEquipped ? m_SetEnergyBonus : 0 ); } }
public virtual int InitMinHits{ get{ return 0; } }
public virtual int InitMaxHits{ get{ return 0; } }
[CommandProperty( AccessLevel.GameMaster )]
public ArmorBodyType BodyPosition
{
get
{
switch ( this.Layer )
{
default:
case Layer.Neck: return ArmorBodyType.Gorget;
case Layer.TwoHanded: return ArmorBodyType.Shield;
case Layer.Gloves: return ArmorBodyType.Gloves;
case Layer.Helm: return ArmorBodyType.Helmet;
case Layer.Arms: return ArmorBodyType.Arms;
case Layer.InnerLegs:
case Layer.OuterLegs:
case Layer.Pants: return ArmorBodyType.Legs;
case Layer.InnerTorso:
case Layer.OuterTorso:
case Layer.Shirt: return ArmorBodyType.Chest;
}
}
}
public void DistributeBonuses( int amount )
{
for ( int i = 0; i < amount; ++i )
{
switch ( Utility.Random( 5 ) )
{
case 0: ++m_PhysicalBonus; break;
case 1: ++m_FireBonus; break;
case 2: ++m_ColdBonus; break;
case 3: ++m_PoisonBonus; break;
case 4: ++m_EnergyBonus; break;
}
}
InvalidateProperties();
}
public CraftAttributeInfo GetResourceAttrs()
{
CraftResourceInfo info = CraftResources.GetInfo( m_Resource );
if ( info == null )
return CraftAttributeInfo.Blank;
return info.AttributeInfo;
}
public int GetProtOffset()
{
switch ( m_Protection )
{
case ArmorProtectionLevel.Guarding: return 1;
case ArmorProtectionLevel.Hardening: return 2;
case ArmorProtectionLevel.Fortification: return 3;
case ArmorProtectionLevel.Invulnerability: return 4;
}
return 0;
}
public void UnscaleDurability()
{
int scale = 100 + GetDurabilityBonus();
m_HitPoints = ((m_HitPoints * 100) + (scale - 1)) / scale;
m_MaxHitPoints = ((m_MaxHitPoints * 100) + (scale - 1)) / scale;
InvalidateProperties();
}
public void ScaleDurability()
{
int scale = 100 + GetDurabilityBonus();
m_HitPoints = ((m_HitPoints * scale) + 99) / 100;
m_MaxHitPoints = ((m_MaxHitPoints * scale) + 99) / 100;
InvalidateProperties();
}
public int GetDurabilityBonus()
{
int bonus = 0;
if ( m_Quality == ArmorQuality.Exceptional )
bonus += 20;
switch ( m_Durability )
{
case ArmorDurabilityLevel.Durable: bonus += 20; break;
case ArmorDurabilityLevel.Substantial: bonus += 50; break;
case ArmorDurabilityLevel.Massive: bonus += 70; break;
case ArmorDurabilityLevel.Fortified: bonus += 100; break;
case ArmorDurabilityLevel.Indestructible: bonus += 120; break;
}
if ( Core.AOS )
{
bonus += m_AosArmorAttributes.DurabilityBonus;
#region Mondain's Legacy
if ( m_Resource == CraftResource.Heartwood )
return bonus;
#endregion
CraftResourceInfo resInfo = CraftResources.GetInfo( m_Resource );
CraftAttributeInfo attrInfo = null;
if ( resInfo != null )
attrInfo = resInfo.AttributeInfo;
if ( attrInfo != null )
bonus += attrInfo.ArmorDurability;
}
return bonus;
}
public bool Scissor( Mobile from, Scissors scissors )
{
if ( !IsChildOf( from.Backpack ) )
{
from.SendLocalizedMessage( 502437 ); // Items you wish to cut must be in your backpack.
return false;
}
if ( Ethics.Ethic.IsImbued( this ) )
{
from.SendLocalizedMessage( 502440 ); // Scissors can not be used on that to produce anything.
return false;
}
CraftSystem system = DefTailoring.CraftSystem;
CraftItem item = system.CraftItems.SearchFor( GetType() );
if ( item != null && item.Ressources.Count == 1 && item.Ressources.GetAt( 0 ).Amount >= 2 )
{
try
{
Item res = (Item)Activator.CreateInstance( CraftResources.GetInfo( m_Resource ).ResourceTypes[0] );
ScissorHelper( from, res, m_PlayerConstructed ? (item.Ressources.GetAt( 0 ).Amount / 2) : 1 );
return true;
}
catch
{
}
}
from.SendLocalizedMessage( 502440 ); // Scissors can not be used on that to produce anything.
return false;
}
private static double[] m_ArmorScalars = { 0.07, 0.07, 0.14, 0.15, 0.22, 0.35 };
public static double[] ArmorScalars
{
get
{
return m_ArmorScalars;
}
set
{
m_ArmorScalars = value;
}
}
public static void ValidateMobile( Mobile m )
{
for ( int i = m.Items.Count - 1; i >= 0; --i )
{
if ( i >= m.Items.Count )
continue;
Item item = m.Items[i];
if ( item is BaseArmor )
{
BaseArmor armor = (BaseArmor)item;
if( armor.RequiredRace != null && m.Race != armor.RequiredRace )
{
if( armor.RequiredRace == Race.Elf )
m.SendLocalizedMessage( 1072203 ); // Only Elves may use this.
else
m.SendMessage( "Only {0} may use this.", armor.RequiredRace.PluralName );
m.AddToBackpack( armor );
}
else if ( !armor.AllowMaleWearer && !m.Female && m.AccessLevel < AccessLevel.GameMaster )
{
if ( armor.AllowFemaleWearer )
m.SendLocalizedMessage( 1010388 ); // Only females can wear this.
else
m.SendMessage( "You may not wear this." );
m.AddToBackpack( armor );
}
else if ( !armor.AllowFemaleWearer && m.Female && m.AccessLevel < AccessLevel.GameMaster )
{
if ( armor.AllowMaleWearer )
m.SendLocalizedMessage( 1063343 ); // Only males can wear this.
else
m.SendMessage( "You may not wear this." );
m.AddToBackpack( armor );
}
}
}
}
public int GetLowerStatReq()
{
if ( !Core.AOS )
return 0;
int v = m_AosArmorAttributes.LowerStatReq;
#region Mondain's Legacy
if ( m_Resource == CraftResource.Heartwood )
return v;
#endregion
CraftResourceInfo info = CraftResources.GetInfo( m_Resource );
if ( info != null )
{
CraftAttributeInfo attrInfo = info.AttributeInfo;
if ( attrInfo != null )
v += attrInfo.ArmorLowerRequirements;
}
if ( v > 100 )
v = 100;
return v;
}
public override void OnAdded( object parent )
{
if ( parent is Mobile )
{
Mobile from = (Mobile)parent;
if ( Core.AOS )
m_AosSkillBonuses.AddTo( from );
#region Mondain's Legacy
if ( IsSetItem )
m_SetEquipped = SetHelper.FullSetPresent( from, SetID, Pieces );
if ( m_SetEquipped )
{
m_LastEquipped = true;
SetHelper.AddSetBonus( from, SetID );
}
#endregion
from.Delta( MobileDelta.Armor ); // Tell them armor rating has changed
}
}
public virtual double ScaleArmorByDurability( double armor )
{
int scale = 100;
if ( m_MaxHitPoints > 0 && m_HitPoints < m_MaxHitPoints )
scale = 50 + ((50 * m_HitPoints) / m_MaxHitPoints);
return ( armor * scale ) / 100;
}
protected void Invalidate()
{
if ( Parent is Mobile )
((Mobile)Parent).Delta( MobileDelta.Armor ); // Tell them armor rating has changed
}
public BaseArmor( Serial serial ) : base( serial )
{
}
private static void SetSaveFlag( ref SaveFlag flags, SaveFlag toSet, bool setIf )
{
if ( setIf )
flags |= toSet;
}
private static bool GetSaveFlag( SaveFlag flags, SaveFlag toGet )
{
return ( (flags & toGet) != 0 );
}
[Flags]
private enum SaveFlag
{
None = 0x00000000,
Attributes = 0x00000001,
ArmorAttributes = 0x00000002,
PhysicalBonus = 0x00000004,
FireBonus = 0x00000008,
ColdBonus = 0x00000010,
PoisonBonus = 0x00000020,
EnergyBonus = 0x00000040,
Identified = 0x00000080,
MaxHitPoints = 0x00000100,
HitPoints = 0x00000200,
Crafter = 0x00000400,
Quality = 0x00000800,
Durability = 0x00001000,
Protection = 0x00002000,
Resource = 0x00004000,
BaseArmor = 0x00008000,
StrBonus = 0x00010000,
DexBonus = 0x00020000,
IntBonus = 0x00040000,
StrReq = 0x00080000,
DexReq = 0x00100000,
IntReq = 0x00200000,
MedAllowance = 0x00400000,
SkillBonuses = 0x00800000,
PlayerConstructed = 0x01000000
}
#region Mondain's Legacy
private static void SetSaveFlag( ref SetFlag flags, SetFlag toSet, bool setIf )
{
if ( setIf )
flags |= toSet;
}
private static bool GetSaveFlag( SetFlag flags, SetFlag toGet )
{
return ( (flags & toGet) != 0 );
}
[Flags]
private enum SetFlag
{
None = 0x00000000,
Attributes = 0x00000001,
ArmorAttributes = 0x00000002,
SkillBonuses = 0x00000004,
PhysicalBonus = 0x00000008,
FireBonus = 0x00000010,
ColdBonus = 0x00000020,
PoisonBonus = 0x00000040,
EnergyBonus = 0x00000080,
SetHue = 0x00000100,
LastEquipped = 0x00000200,
SetEquipped = 0x00000400,
}
#endregion
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 8 ); // version
#region Mondain's Legacy version 8
SetFlag sflags = SetFlag.None;
SetSaveFlag( ref sflags, SetFlag.Attributes, !m_SetAttributes.IsEmpty );
SetSaveFlag( ref sflags, SetFlag.ArmorAttributes, !m_SetArmorAttributes.IsEmpty );
SetSaveFlag( ref sflags, SetFlag.SkillBonuses, !m_SetSkillBonuses.IsEmpty );
SetSaveFlag( ref sflags, SetFlag.PhysicalBonus, m_SetPhysicalBonus != 0 );
SetSaveFlag( ref sflags, SetFlag.FireBonus, m_SetFireBonus != 0 );
SetSaveFlag( ref sflags, SetFlag.ColdBonus, m_SetColdBonus != 0 );
SetSaveFlag( ref sflags, SetFlag.PoisonBonus, m_SetPoisonBonus != 0 );
SetSaveFlag( ref sflags, SetFlag.EnergyBonus, m_SetEnergyBonus != 0 );
SetSaveFlag( ref sflags, SetFlag.SetHue, m_SetHue != 0 );
SetSaveFlag( ref sflags, SetFlag.LastEquipped, true );
SetSaveFlag( ref sflags, SetFlag.SetEquipped, true );
writer.WriteEncodedInt( (int) sflags );
if ( GetSaveFlag( sflags, SetFlag.Attributes ) )
m_SetAttributes.Serialize( writer );
if ( GetSaveFlag( sflags, SetFlag.ArmorAttributes ) )
m_SetArmorAttributes.Serialize( writer );
if ( GetSaveFlag( sflags, SetFlag.SkillBonuses ) )
m_SetSkillBonuses.Serialize( writer );
if ( GetSaveFlag( sflags, SetFlag.PhysicalBonus ) )
writer.WriteEncodedInt( (int) m_SetPhysicalBonus );
if ( GetSaveFlag( sflags, SetFlag.FireBonus ) )
writer.WriteEncodedInt( (int) m_SetFireBonus );
if ( GetSaveFlag( sflags, SetFlag.ColdBonus ) )
writer.WriteEncodedInt( (int) m_SetColdBonus );
if ( GetSaveFlag( sflags, SetFlag.PoisonBonus ) )
writer.WriteEncodedInt( (int) m_SetPoisonBonus );
if ( GetSaveFlag( sflags, SetFlag.EnergyBonus ) )
writer.WriteEncodedInt( (int) m_SetEnergyBonus );
if ( GetSaveFlag( sflags, SetFlag.SetHue ) )
writer.WriteEncodedInt( (int) m_SetHue );
if ( GetSaveFlag( sflags, SetFlag.LastEquipped ) )
writer.Write( (bool) m_LastEquipped );
if ( GetSaveFlag( sflags, SetFlag.SetEquipped ) )
writer.Write( (bool) m_SetEquipped );
#endregion
SaveFlag flags = SaveFlag.None;
SetSaveFlag( ref flags, SaveFlag.Attributes, !m_AosAttributes.IsEmpty );
SetSaveFlag( ref flags, SaveFlag.ArmorAttributes, !m_AosArmorAttributes.IsEmpty );
SetSaveFlag( ref flags, SaveFlag.PhysicalBonus, m_PhysicalBonus != 0 );
SetSaveFlag( ref flags, SaveFlag.FireBonus, m_FireBonus != 0 );
SetSaveFlag( ref flags, SaveFlag.ColdBonus, m_ColdBonus != 0 );
SetSaveFlag( ref flags, SaveFlag.PoisonBonus, m_PoisonBonus != 0 );
SetSaveFlag( ref flags, SaveFlag.EnergyBonus, m_EnergyBonus != 0 );
SetSaveFlag( ref flags, SaveFlag.Identified, m_Identified != false );
SetSaveFlag( ref flags, SaveFlag.MaxHitPoints, m_MaxHitPoints != 0 );
SetSaveFlag( ref flags, SaveFlag.HitPoints, m_HitPoints != 0 );
SetSaveFlag( ref flags, SaveFlag.Crafter, m_Crafter != null );
SetSaveFlag( ref flags, SaveFlag.Quality, m_Quality != ArmorQuality.Regular );
SetSaveFlag( ref flags, SaveFlag.Durability, m_Durability != ArmorDurabilityLevel.Regular );
SetSaveFlag( ref flags, SaveFlag.Protection, m_Protection != ArmorProtectionLevel.Regular );
SetSaveFlag( ref flags, SaveFlag.Resource, m_Resource != DefaultResource );
SetSaveFlag( ref flags, SaveFlag.BaseArmor, m_ArmorBase != -1 );
SetSaveFlag( ref flags, SaveFlag.StrBonus, m_StrBonus != -1 );
SetSaveFlag( ref flags, SaveFlag.DexBonus, m_DexBonus != -1 );
SetSaveFlag( ref flags, SaveFlag.IntBonus, m_IntBonus != -1 );
SetSaveFlag( ref flags, SaveFlag.StrReq, m_StrReq != -1 );
SetSaveFlag( ref flags, SaveFlag.DexReq, m_DexReq != -1 );
SetSaveFlag( ref flags, SaveFlag.IntReq, m_IntReq != -1 );
SetSaveFlag( ref flags, SaveFlag.MedAllowance, m_Meditate != (AMA)(-1) );
SetSaveFlag( ref flags, SaveFlag.SkillBonuses, !m_AosSkillBonuses.IsEmpty );
SetSaveFlag( ref flags, SaveFlag.PlayerConstructed, m_PlayerConstructed != false );
writer.WriteEncodedInt( (int) flags );
if ( GetSaveFlag( flags, SaveFlag.Attributes ) )
m_AosAttributes.Serialize( writer );
if ( GetSaveFlag( flags, SaveFlag.ArmorAttributes ) )
m_AosArmorAttributes.Serialize( writer );
if ( GetSaveFlag( flags, SaveFlag.PhysicalBonus ) )
writer.WriteEncodedInt( (int) m_PhysicalBonus );
if ( GetSaveFlag( flags, SaveFlag.FireBonus ) )
writer.WriteEncodedInt( (int) m_FireBonus );
if ( GetSaveFlag( flags, SaveFlag.ColdBonus ) )
writer.WriteEncodedInt( (int) m_ColdBonus );
if ( GetSaveFlag( flags, SaveFlag.PoisonBonus ) )
writer.WriteEncodedInt( (int) m_PoisonBonus );
if ( GetSaveFlag( flags, SaveFlag.EnergyBonus ) )
writer.WriteEncodedInt( (int) m_EnergyBonus );
if ( GetSaveFlag( flags, SaveFlag.MaxHitPoints ) )
writer.WriteEncodedInt( (int) m_MaxHitPoints );
if ( GetSaveFlag( flags, SaveFlag.HitPoints ) )
writer.WriteEncodedInt( (int) m_HitPoints );
if ( GetSaveFlag( flags, SaveFlag.Crafter ) )
writer.Write( (Mobile) m_Crafter );
if ( GetSaveFlag( flags, SaveFlag.Quality ) )
writer.WriteEncodedInt( (int) m_Quality );
if ( GetSaveFlag( flags, SaveFlag.Durability ) )
writer.WriteEncodedInt( (int) m_Durability );
if ( GetSaveFlag( flags, SaveFlag.Protection ) )
writer.WriteEncodedInt( (int) m_Protection );
if ( GetSaveFlag( flags, SaveFlag.Resource ) )
writer.WriteEncodedInt( (int) m_Resource );
if ( GetSaveFlag( flags, SaveFlag.BaseArmor ) )
writer.WriteEncodedInt( (int) m_ArmorBase );
if ( GetSaveFlag( flags, SaveFlag.StrBonus ) )
writer.WriteEncodedInt( (int) m_StrBonus );
if ( GetSaveFlag( flags, SaveFlag.DexBonus ) )
writer.WriteEncodedInt( (int) m_DexBonus );
if ( GetSaveFlag( flags, SaveFlag.IntBonus ) )
writer.WriteEncodedInt( (int) m_IntBonus );
if ( GetSaveFlag( flags, SaveFlag.StrReq ) )
writer.WriteEncodedInt( (int) m_StrReq );
if ( GetSaveFlag( flags, SaveFlag.DexReq ) )
writer.WriteEncodedInt( (int) m_DexReq );
if ( GetSaveFlag( flags, SaveFlag.IntReq ) )
writer.WriteEncodedInt( (int) m_IntReq );
if ( GetSaveFlag( flags, SaveFlag.MedAllowance ) )
writer.WriteEncodedInt( (int) m_Meditate );
if ( GetSaveFlag( flags, SaveFlag.SkillBonuses ) )
m_AosSkillBonuses.Serialize( writer );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch ( version )
{
#region Mondain's Legacy
case 8:
SetFlag sflags = (SetFlag) reader.ReadEncodedInt();
if ( GetSaveFlag( sflags, SetFlag.Attributes ) )
m_SetAttributes = new AosAttributes( this, reader );
else
m_SetAttributes = new AosAttributes( this );
if ( GetSaveFlag( sflags, SetFlag.ArmorAttributes ) )
m_SetArmorAttributes = new AosArmorAttributes( this, reader );
else
m_SetArmorAttributes = new AosArmorAttributes( this );
if ( GetSaveFlag( sflags, SetFlag.SkillBonuses ) )
m_SetSkillBonuses = new AosSkillBonuses( this, reader );
else
m_SetSkillBonuses = new AosSkillBonuses( this );
if ( GetSaveFlag( sflags, SetFlag.PhysicalBonus ) )
m_SetPhysicalBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( sflags, SetFlag.FireBonus ) )
m_SetFireBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( sflags, SetFlag.ColdBonus ) )
m_SetColdBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( sflags, SetFlag.PoisonBonus ) )
m_SetPoisonBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( sflags, SetFlag.EnergyBonus ) )
m_SetEnergyBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( sflags, SetFlag.SetHue ) )
m_SetHue = reader.ReadEncodedInt();
if ( GetSaveFlag( sflags, SetFlag.LastEquipped ) )
m_LastEquipped = reader.ReadBool();
if ( GetSaveFlag( sflags, SetFlag.SetEquipped ) )
m_SetEquipped = reader.ReadBool();
goto case 7;
#endregion
case 7:
case 6:
case 5:
{
SaveFlag flags = (SaveFlag)reader.ReadEncodedInt();
if ( GetSaveFlag( flags, SaveFlag.Attributes ) )
m_AosAttributes = new AosAttributes( this, reader );
else
m_AosAttributes = new AosAttributes( this );
if ( GetSaveFlag( flags, SaveFlag.ArmorAttributes ) )
m_AosArmorAttributes = new AosArmorAttributes( this, reader );
else
m_AosArmorAttributes = new AosArmorAttributes( this );
if ( GetSaveFlag( flags, SaveFlag.PhysicalBonus ) )
m_PhysicalBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( flags, SaveFlag.FireBonus ) )
m_FireBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( flags, SaveFlag.ColdBonus ) )
m_ColdBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( flags, SaveFlag.PoisonBonus ) )
m_PoisonBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( flags, SaveFlag.EnergyBonus ) )
m_EnergyBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( flags, SaveFlag.Identified ) )
m_Identified = ( version >= 7 || reader.ReadBool() );
if ( GetSaveFlag( flags, SaveFlag.MaxHitPoints ) )
m_MaxHitPoints = reader.ReadEncodedInt();
if ( GetSaveFlag( flags, SaveFlag.HitPoints ) )
m_HitPoints = reader.ReadEncodedInt();
if ( GetSaveFlag( flags, SaveFlag.Crafter ) )
m_Crafter = reader.ReadMobile();
if ( GetSaveFlag( flags, SaveFlag.Quality ) )
m_Quality = (ArmorQuality)reader.ReadEncodedInt();
else
m_Quality = ArmorQuality.Regular;
if ( version == 5 && m_Quality == ArmorQuality.Low )
m_Quality = ArmorQuality.Regular;
if ( GetSaveFlag( flags, SaveFlag.Durability ) )
{
m_Durability = (ArmorDurabilityLevel)reader.ReadEncodedInt();
if ( m_Durability > ArmorDurabilityLevel.Indestructible )
m_Durability = ArmorDurabilityLevel.Durable;
}
if ( GetSaveFlag( flags, SaveFlag.Protection ) )
{
m_Protection = (ArmorProtectionLevel)reader.ReadEncodedInt();
if ( m_Protection > ArmorProtectionLevel.Invulnerability )
m_Protection = ArmorProtectionLevel.Defense;
}
if ( GetSaveFlag( flags, SaveFlag.Resource ) )
m_Resource = (CraftResource)reader.ReadEncodedInt();
else
m_Resource = DefaultResource;
if ( m_Resource == CraftResource.None )
m_Resource = DefaultResource;
if ( GetSaveFlag( flags, SaveFlag.BaseArmor ) )
m_ArmorBase = reader.ReadEncodedInt();
else
m_ArmorBase = -1;
if ( GetSaveFlag( flags, SaveFlag.StrBonus ) )
m_StrBonus = reader.ReadEncodedInt();
else
m_StrBonus = -1;
if ( GetSaveFlag( flags, SaveFlag.DexBonus ) )
m_DexBonus = reader.ReadEncodedInt();
else
m_DexBonus = -1;
if ( GetSaveFlag( flags, SaveFlag.IntBonus ) )
m_IntBonus = reader.ReadEncodedInt();
else
m_IntBonus = -1;
if ( GetSaveFlag( flags, SaveFlag.StrReq ) )
m_StrReq = reader.ReadEncodedInt();
else
m_StrReq = -1;
if ( GetSaveFlag( flags, SaveFlag.DexReq ) )
m_DexReq = reader.ReadEncodedInt();
else
m_DexReq = -1;
if ( GetSaveFlag( flags, SaveFlag.IntReq ) )
m_IntReq = reader.ReadEncodedInt();
else
m_IntReq = -1;
if ( GetSaveFlag( flags, SaveFlag.MedAllowance ) )
m_Meditate = (AMA)reader.ReadEncodedInt();
else
m_Meditate = (AMA)(-1);
if ( GetSaveFlag( flags, SaveFlag.SkillBonuses ) )
m_AosSkillBonuses = new AosSkillBonuses( this, reader );
if ( GetSaveFlag( flags, SaveFlag.PlayerConstructed ) )
m_PlayerConstructed = true;
break;
}
case 4:
{
m_AosAttributes = new AosAttributes( this, reader );
m_AosArmorAttributes = new AosArmorAttributes( this, reader );
goto case 3;
}
case 3:
{
m_PhysicalBonus = reader.ReadInt();
m_FireBonus = reader.ReadInt();
m_ColdBonus = reader.ReadInt();
m_PoisonBonus = reader.ReadInt();
m_EnergyBonus = reader.ReadInt();
goto case 2;
}
case 2:
case 1:
{
m_Identified = reader.ReadBool();
goto case 0;
}
case 0:
{
m_ArmorBase = reader.ReadInt();
m_MaxHitPoints = reader.ReadInt();
m_HitPoints = reader.ReadInt();
m_Crafter = reader.ReadMobile();
m_Quality = (ArmorQuality)reader.ReadInt();
m_Durability = (ArmorDurabilityLevel)reader.ReadInt();
m_Protection = (ArmorProtectionLevel)reader.ReadInt();
AMT mat = (AMT)reader.ReadInt();
if ( m_ArmorBase == RevertArmorBase )
m_ArmorBase = -1;
/*m_BodyPos = (ArmorBodyType)*/reader.ReadInt();
if ( version < 4 )
{
m_AosAttributes = new AosAttributes( this );
m_AosArmorAttributes = new AosArmorAttributes( this );
}
if ( version < 3 && m_Quality == ArmorQuality.Exceptional )
DistributeBonuses( 6 );
if ( version >= 2 )
{
m_Resource = (CraftResource)reader.ReadInt();
}
else
{
OreInfo info;
switch ( reader.ReadInt() )
{
default:
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.Silver; break;
case 10: info = OreInfo.Platinum; break;
case 11: info = OreInfo.Mythril; break;
case 12: info = OreInfo.Obsidian; break;
case 13: info = OreInfo.Jade; break;
case 14: info = OreInfo.Moonstone; break;
case 15: info = OreInfo.Sunstone; break;
case 16: info = OreInfo.Bloodstone; break;
}
m_Resource = CraftResources.GetFromOreInfo( info, mat );
}
m_StrBonus = reader.ReadInt();
m_DexBonus = reader.ReadInt();
m_IntBonus = reader.ReadInt();
m_StrReq = reader.ReadInt();
m_DexReq = reader.ReadInt();
m_IntReq = reader.ReadInt();
if ( m_StrBonus == OldStrBonus )
m_StrBonus = -1;
if ( m_DexBonus == OldDexBonus )
m_DexBonus = -1;
if ( m_IntBonus == OldIntBonus )
m_IntBonus = -1;
if ( m_StrReq == OldStrReq )
m_StrReq = -1;
if ( m_DexReq == OldDexReq )
m_DexReq = -1;
if ( m_IntReq == OldIntReq )
m_IntReq = -1;
m_Meditate = (AMA)reader.ReadInt();
if ( m_Meditate == OldMedAllowance )
m_Meditate = (AMA)(-1);
if ( m_Resource == CraftResource.None )
{
if ( mat == ArmorMaterialType.Studded || mat == ArmorMaterialType.Leather )
m_Resource = CraftResource.RegularLeather;
else if ( mat == ArmorMaterialType.Spined )
m_Resource = CraftResource.SpinedLeather;
else if ( mat == ArmorMaterialType.Horned )
m_Resource = CraftResource.HornedLeather;
else if ( mat == ArmorMaterialType.Barbed )
m_Resource = CraftResource.BarbedLeather;
else if ( mat == ArmorMaterialType.DragonL )
m_Resource = CraftResource.DragonLeather;
else if ( mat == ArmorMaterialType.Daemon )
m_Resource = CraftResource.DaemonLeather;
else
m_Resource = CraftResource.Iron;
}
if ( m_MaxHitPoints == 0 && m_HitPoints == 0 )
m_HitPoints = m_MaxHitPoints = Utility.RandomMinMax( InitMinHits, InitMaxHits );
break;
}
}
#region Mondain's Legacy
if ( m_SetAttributes == null )
m_SetAttributes = new AosAttributes( this );
if ( m_SetArmorAttributes == null )
m_SetArmorAttributes = new AosArmorAttributes( this );
if ( m_SetSkillBonuses == null )
m_SetSkillBonuses = new AosSkillBonuses( this );
#endregion
if ( m_AosSkillBonuses == null )
m_AosSkillBonuses = new AosSkillBonuses( this );
if ( Core.AOS && Parent is Mobile )
m_AosSkillBonuses.AddTo( (Mobile)Parent );
int strBonus = ComputeStatBonus( StatType.Str );
int dexBonus = ComputeStatBonus( StatType.Dex );
int intBonus = ComputeStatBonus( StatType.Int );
if ( Parent is Mobile && (strBonus != 0 || dexBonus != 0 || intBonus != 0) )
{
Mobile m = (Mobile)Parent;
string modName = Serial.ToString();
if ( strBonus != 0 )
m.AddStatMod( new StatMod( StatType.Str, modName + "Str", strBonus, TimeSpan.Zero ) );
if ( dexBonus != 0 )
m.AddStatMod( new StatMod( StatType.Dex, modName + "Dex", dexBonus, TimeSpan.Zero ) );
if ( intBonus != 0 )
m.AddStatMod( new StatMod( StatType.Int, modName + "Int", intBonus, TimeSpan.Zero ) );
}
if ( Parent is Mobile )
((Mobile)Parent).CheckStatTimers();
if ( version < 7 )
m_PlayerConstructed = true; // we don't know, so, assume it's crafted
}
public virtual CraftResource DefaultResource{ get{ return CraftResource.Iron; } }
public BaseArmor( int itemID ) : base( itemID )
{
m_Quality = ArmorQuality.Regular;
m_Durability = ArmorDurabilityLevel.Regular;
m_Crafter = null;
m_Resource = DefaultResource;
Hue = CraftResources.GetHue( m_Resource );
m_HitPoints = m_MaxHitPoints = Utility.RandomMinMax( InitMinHits, InitMaxHits );
this.Layer = (Layer)ItemData.Quality;
m_AosAttributes = new AosAttributes( this );
m_AosArmorAttributes = new AosArmorAttributes( this );
m_AosSkillBonuses = new AosSkillBonuses( this );
#region Mondain's Legacy
m_SetAttributes = new AosAttributes( this );
m_SetArmorAttributes = new AosArmorAttributes( this );
m_SetSkillBonuses = new AosSkillBonuses( this );
m_LastEquipped = false;
#endregion
}
public override bool AllowSecureTrade( Mobile from, Mobile to, Mobile newOwner, bool accepted )
{
if ( !Ethics.Ethic.CheckTrade( from, to, newOwner, this ) )
return false;
return base.AllowSecureTrade( from, to, newOwner, accepted );
}
public virtual Race RequiredRace { get { return null; } }
public override bool CanEquip( Mobile from )
{
if( !Ethics.Ethic.CheckEquip( from, this ) )
return false;
if( from.AccessLevel < AccessLevel.GameMaster )
{
if( RequiredRace != null && from.Race != RequiredRace )
{
if( RequiredRace == Race.Elf )
from.SendLocalizedMessage( 1072203 ); // Only Elves may use this.
else
from.SendMessage( "Only {0} may use this.", RequiredRace.PluralName );
return false;
}
else if( !AllowMaleWearer && !from.Female )
{
if( AllowFemaleWearer )
from.SendLocalizedMessage( 1010388 ); // Only females can wear this.
else
from.SendMessage( "You may not wear this." );
return false;
}
else if( !AllowFemaleWearer && from.Female )
{
if( AllowMaleWearer )
from.SendLocalizedMessage( 1063343 ); // Only males can wear this.
else
from.SendMessage( "You may not wear this." );
return false;
}
else
{
int strBonus = ComputeStatBonus( StatType.Str ), strReq = ComputeStatReq( StatType.Str );
int dexBonus = ComputeStatBonus( StatType.Dex ), dexReq = ComputeStatReq( StatType.Dex );
int intBonus = ComputeStatBonus( StatType.Int ), intReq = ComputeStatReq( StatType.Int );
if( from.Dex < dexReq || (from.Dex + dexBonus) < 1 )
{
from.SendLocalizedMessage( 502077 ); // You do not have enough dexterity to equip this item.
return false;
}
else if( from.Str < strReq || (from.Str + strBonus) < 1 )
{
from.SendLocalizedMessage( 500213 ); // You are not strong enough to equip that.
return false;
}
else if( from.Int < intReq || (from.Int + intBonus) < 1 )
{
from.SendMessage( "You are not smart enough to equip that." );
return false;
}
}
}
return base.CanEquip( from );
}
public override bool CheckPropertyConfliction( Mobile m )
{
if ( base.CheckPropertyConfliction( m ) )
return true;
if ( Layer == Layer.Pants )
return ( m.FindItemOnLayer( Layer.InnerLegs ) != null );
if ( Layer == Layer.Shirt )
return ( m.FindItemOnLayer( Layer.InnerTorso ) != null );
return false;
}
public override bool OnEquip( Mobile from )
{
from.CheckStatTimers();
int strBonus = ComputeStatBonus( StatType.Str );
int dexBonus = ComputeStatBonus( StatType.Dex );
int intBonus = ComputeStatBonus( StatType.Int );
if ( strBonus != 0 || dexBonus != 0 || intBonus != 0 )
{
string modName = this.Serial.ToString();
if ( strBonus != 0 )
from.AddStatMod( new StatMod( StatType.Str, modName + "Str", strBonus, TimeSpan.Zero ) );
if ( dexBonus != 0 )
from.AddStatMod( new StatMod( StatType.Dex, modName + "Dex", dexBonus, TimeSpan.Zero ) );
if ( intBonus != 0 )
from.AddStatMod( new StatMod( StatType.Int, modName + "Int", intBonus, TimeSpan.Zero ) );
}
return base.OnEquip( from );
}
public override void OnRemoved( object parent )
{
if ( parent is Mobile )
{
Mobile m = (Mobile)parent;
string modName = this.Serial.ToString();
m.RemoveStatMod( modName + "Str" );
m.RemoveStatMod( modName + "Dex" );
m.RemoveStatMod( modName + "Int" );
if ( Core.AOS )
m_AosSkillBonuses.Remove();
((Mobile)parent).Delta( MobileDelta.Armor ); // Tell them armor rating has changed
m.CheckStatTimers();
#region Set Armor
if ( IsSetItem ? m_SetEquipped : false )
SetHelper.RemoveSetBonus( m, SetID, this );
#endregion
}
base.OnRemoved( parent );
InvalidateProperties();
}
public virtual int OnHit( BaseWeapon weapon, int damageTaken )
{
double HalfAr = ArmorRating / 2.0;
int Absorbed = (int)(HalfAr + HalfAr*Utility.RandomDouble());
damageTaken -= Absorbed;
if ( damageTaken < 0 )
damageTaken = 0;
if ( Absorbed < 2 )
Absorbed = 2;
if ( 25 > Utility.Random( 100 ) ) // 25% chance to lower durability
{
if ( Core.AOS && m_AosArmorAttributes.SelfRepair > Utility.Random( 10 ) )
{
HitPoints += 2;
}
else
{
int wear;
if ( weapon.Type == WeaponType.Bashing )
wear = Absorbed / 2;
else
wear = Utility.Random( 2 );
if ( wear > 0 && m_MaxHitPoints > 0 )
{
if ( m_HitPoints >= wear )
{
HitPoints -= wear;
wear = 0;
}
else
{
wear -= HitPoints;
HitPoints = 0;
}
if ( wear > 0 )
{
if ( m_MaxHitPoints > wear )
{
MaxHitPoints -= wear;
if ( Parent is Mobile )
((Mobile)Parent).LocalOverheadMessage( MessageType.Regular, 0x3B2, 1061121 ); // Your equipment is severely damaged.
}
else
{
Delete();
}
}
}
}
}
return damageTaken;
}
private string GetNameString()
{
string name = this.Name;
if ( name == null )
name = String.Format( "#{0}", LabelNumber );
return name;
}
[Hue, CommandProperty( AccessLevel.GameMaster )]
public override int Hue
{
get{ return base.Hue; }
set{ base.Hue = value; InvalidateProperties(); }
}
public override void AddNameProperty( ObjectPropertyList list )
{
string oreType;
switch ( m_Resource )
{
case CraftResource.DullCopper: oreType = "dull copper"; break; // dull copper
case CraftResource.ShadowIron: oreType = "shadow iron"; break; // shadow iron
case CraftResource.Copper: oreType = "copper"; break; // copper
case CraftResource.Bronze: oreType = "bronze"; break; // bronze
case CraftResource.Gold: oreType = "gold"; break; // golden
case CraftResource.Agapite: oreType = "agapite"; break; // agapite
case CraftResource.Verite: oreType = "verite"; break; // verite
case CraftResource.Valorite: oreType = "valorite"; break; // valorite
case CraftResource.Silver: oreType = "silver"; break; // silver
case CraftResource.Platinum: oreType = "platinum"; break; // platinum
case CraftResource.Mythril: oreType = "mythril"; break; // mythril
case CraftResource.Obsidian: oreType = "obsidian"; break; // obsidian
case CraftResource.Jade: oreType = "jade"; break; // jade
case CraftResource.Moonstone: oreType = "moonstone"; break; // moonstone
case CraftResource.Sunstone: oreType = "sunstone"; break; // sunstone
case CraftResource.Bloodstone: oreType = "bloodstone"; break; // bloodstone
case CraftResource.SpinedLeather: oreType = "spined"; break; // spined
case CraftResource.HornedLeather: oreType = "horned"; break; // horned
case CraftResource.BarbedLeather: oreType = "barbed"; break; // barbed
case CraftResource.DragonLeather: oreType = "dragon"; break; // dragon
case CraftResource.DaemonLeather: oreType = "daemon"; break; // daemon
case CraftResource.RedScales: oreType = "red"; break; // red
case CraftResource.YellowScales: oreType = "yellow"; break; // yellow
case CraftResource.BlackScales: oreType = "black"; break; // black
case CraftResource.GreenScales: oreType = "green"; break; // green
case CraftResource.WhiteScales: oreType = "white"; break; // white
case CraftResource.BlueScales: oreType = "blue"; break; // blue
#region Mondain's Legacy
case CraftResource.Oak: oreType = "oak"; break; // oak
case CraftResource.Ash: oreType = "ash"; break; // ash
case CraftResource.Yew: oreType = "yew"; break; // yew
case CraftResource.Heartwood: oreType = "heartwood"; break; // heartwood
case CraftResource.Bloodwood: oreType = "bloodwood"; break; // bloodwood
case CraftResource.Frostwood: oreType = "frostwood"; break; // frostwood
#endregion
default: oreType = "0"; break;
}
if ( m_Quality == ArmorQuality.Exceptional )
{
if ( oreType = 0 )
list.Add( 1053100, "#{0}t{1}", oreType, GetNameString() ); // exceptional ~1_oretype~ ~2_armortype~
else
list.Add( 1050040, GetNameString() ); // exceptional ~1_ITEMNAME~
}
else
{
if ( oreType = 0 )
list.Add( 1053099, "#{0}t{1}", oreType, GetNameString() ); // ~1_oretype~ ~2_armortype~
else if ( Name == null )
list.Add( LabelNumber );
else
list.Add( Name );
}
}
public override bool AllowEquipedCast( Mobile from )
{
if ( base.AllowEquipedCast( from ) )
return true;
return ( m_AosAttributes.SpellChanneling != 0 );
}
public virtual int GetLuckBonus()
{
#region Mondain's Legacy
if ( m_Resource == CraftResource.Heartwood )
return 0;
#endregion
CraftResourceInfo resInfo = CraftResources.GetInfo( m_Resource );
if ( resInfo == null )
return 0;
CraftAttributeInfo attrInfo = resInfo.AttributeInfo;
if ( attrInfo == null )
return 0;
return attrInfo.ArmorLuck;
}
public override void GetProperties( ObjectPropertyList list )
{
base.GetProperties( list );
if ( m_Crafter != null )
list.Add( 1050043, m_Crafter.Name ); // crafted by ~1_NAME~
#region Factions
if ( m_FactionState != null )
list.Add( 1041350 ); // faction item
#endregion
#region Mondain's Legacy
if ( IsSetItem )
{
if ( MixedSet )
list.Add( 1073491, Pieces.ToString() ); // Part of a Weapon/Armor Set (~1_val~ pieces)
else
list.Add( 1072376, Pieces.ToString() ); // Part of an Armor Set (~1_val~ pieces)
if ( m_SetEquipped )
{
if ( MixedSet )
list.Add( 1073492 ); // Full Weapon/Armor Set Present
else
list.Add( 1072377 ); // Full Armor Set Present
GetSetProperties( list );
}
}
#endregion
if( RequiredRace == Race.Elf )
list.Add( 1075086 ); // Elves Only
m_AosSkillBonuses.GetProperties( list );
int prop;
if ( (prop = ArtifactRarity) > 0 )
list.Add( 1061078, prop.ToString() ); // artifact rarity ~1_val~
if ( (prop = m_AosAttributes.WeaponDamage) != 0 )
list.Add( 1060401, prop.ToString() ); // damage increase ~1_val~%
if ( (prop = m_AosAttributes.DefendChance) != 0 )
list.Add( 1060408, prop.ToString() ); // defense chance increase ~1_val~%
if ( (prop = m_AosAttributes.BonusDex) != 0 )
list.Add( 1060409, prop.ToString() ); // dexterity bonus ~1_val~
if ( (prop = m_AosAttributes.EnhancePotions) != 0 )
list.Add( 1060411, prop.ToString() ); // enhance potions ~1_val~%
if ( (prop = m_AosAttributes.CastRecovery) != 0 )
list.Add( 1060412, prop.ToString() ); // faster cast recovery ~1_val~
if ( (prop = m_AosAttributes.CastSpeed) != 0 )
list.Add( 1060413, prop.ToString() ); // faster casting ~1_val~
if ( (prop = m_AosAttributes.AttackChance) != 0 )
list.Add( 1060415, prop.ToString() ); // hit chance increase ~1_val~%
if ( (prop = m_AosAttributes.BonusHits) != 0 )
list.Add( 1060431, prop.ToString() ); // hit point increase ~1_val~
if ( (prop = m_AosAttributes.BonusInt) != 0 )
list.Add( 1060432, prop.ToString() ); // intelligence bonus ~1_val~
if ( (prop = m_AosAttributes.LowerManaCost) != 0 )
list.Add( 1060433, prop.ToString() ); // lower mana cost ~1_val~%
if ( (prop = m_AosAttributes.LowerRegCost) != 0 )
list.Add( 1060434, prop.ToString() ); // lower reagent cost ~1_val~%
if ( (prop = GetLowerStatReq()) != 0 )
list.Add( 1060435, prop.ToString() ); // lower requirements ~1_val~%
if ( (prop = (GetLuckBonus() + m_AosAttributes.Luck)) != 0 )
list.Add( 1060436, prop.ToString() ); // luck ~1_val~
if ( (prop = m_AosArmorAttributes.MageArmor) != 0 )
list.Add( 1060437 ); // mage armor
if ( (prop = m_AosAttributes.BonusMana) != 0 )
list.Add( 1060439, prop.ToString() ); // mana increase ~1_val~
if ( (prop = m_AosAttributes.RegenMana) != 0 )
list.Add( 1060440, prop.ToString() ); // mana regeneration ~1_val~
if ( (prop = m_AosAttributes.NightSight) != 0 )
list.Add( 1060441 ); // night sight
if ( (prop = m_AosAttributes.ReflectPhysical) != 0 )
list.Add( 1060442, prop.ToString() ); // reflect physical damage ~1_val~%
if ( (prop = m_AosAttributes.RegenStam) != 0 )
list.Add( 1060443, prop.ToString() ); // stamina regeneration ~1_val~
if ( (prop = m_AosAttributes.RegenHits) != 0 )
list.Add( 1060444, prop.ToString() ); // hit point regeneration ~1_val~
if ( (prop = m_AosArmorAttributes.SelfRepair) != 0 )
list.Add( 1060450, prop.ToString() ); // self repair ~1_val~
if ( (prop = m_AosAttributes.SpellChanneling) != 0 )
list.Add( 1060482 ); // spell channeling
if ( (prop = m_AosAttributes.SpellDamage) != 0 )
list.Add( 1060483, prop.ToString() ); // spell damage increase ~1_val~%
if ( (prop = m_AosAttributes.BonusStam) != 0 )
list.Add( 1060484, prop.ToString() ); // stamina increase ~1_val~
if ( (prop = m_AosAttributes.BonusStr) != 0 )
list.Add( 1060485, prop.ToString() ); // strength bonus ~1_val~
if ( (prop = m_AosAttributes.WeaponSpeed) != 0 )
list.Add( 1060486, prop.ToString() ); // swing speed increase ~1_val~%
base.AddResistanceProperties( list );
if ( (prop = GetDurabilityBonus()) > 0 )
list.Add( 1060410, prop.ToString() ); // durability ~1_val~%
if ( (prop = ComputeStatReq( StatType.Str )) > 0 )
list.Add( 1061170, prop.ToString() ); // strength requirement ~1_val~
if ( m_HitPoints >= 0 && m_MaxHitPoints > 0 )
list.Add( 1060639, "{0}t{1}", m_HitPoints, m_MaxHitPoints ); // durability ~1_val~ / ~2_val~
#region Mondain's Legacy
if ( IsSetItem && !m_SetEquipped )
{
list.Add( 1072378 ); // <br>Only when full set is present:
GetSetProperties( list );
}
#endregion
}
public override void OnSingleClick( Mobile from )
{
List<EquipInfoAttribute> attrs = new List<EquipInfoAttribute>();
if ( DisplayLootType )
{
if ( LootType == LootType.Blessed )
attrs.Add( new EquipInfoAttribute( 1038021 ) ); // blessed
else if ( LootType == LootType.Cursed )
attrs.Add( new EquipInfoAttribute( 1049643 ) ); // cursed
}
#region Factions
if ( m_FactionState != null )
attrs.Add( new EquipInfoAttribute( 1041350 ) ); // faction item
#endregion
if ( m_Quality == ArmorQuality.Exceptional )
attrs.Add( new EquipInfoAttribute( 1018305 - (int)m_Quality ) );
if ( m_Identified || from.AccessLevel >= AccessLevel.GameMaster)
{
if ( m_Durability != ArmorDurabilityLevel.Regular )
attrs.Add( new EquipInfoAttribute( 1038000 + (int)m_Durability ) );
if ( m_Protection > ArmorProtectionLevel.Regular && m_Protection <= ArmorProtectionLevel.Invulnerability )
attrs.Add( new EquipInfoAttribute( 1038005 + (int)m_Protection ) );
}
else if ( m_Durability != ArmorDurabilityLevel.Regular || (m_Protection > ArmorProtectionLevel.Regular && m_Protection <= ArmorProtectionLevel.Invulnerability) )
attrs.Add( new EquipInfoAttribute( 1038000 ) ); // Unidentified
int number;
if ( Name == null )
{
number = LabelNumber;
}
else
{
this.LabelTo( from, Name );
number = 1041000;
}
if ( attrs.Count == 0 && Crafter == null && Name != null )
return;
EquipmentInfo eqInfo = new EquipmentInfo( number, m_Crafter, false, attrs.ToArray() );
from.Send( new DisplayEquipmentInfo( this, eqInfo ) );
}
#region ICraftable Members
public virtual int OnCraft( int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CraftItem craftItem, int resHue )
{
Quality = (ArmorQuality)quality;
if ( makersMark )
Crafter = from;
Type resourceType = typeRes;
if ( resourceType == null )
resourceType = craftItem.Ressources.GetAt( 0 ).ItemType;
Resource = CraftResources.GetFromType( resourceType );
PlayerConstructed = true;
CraftContext context = craftSystem.GetContext( from );
if ( context != null && context.DoNotColor )
Hue = 0;
if( Quality == ArmorQuality.Exceptional )
{
DistributeBonuses( (tool is BaseRunicTool ? 6 : Core.SE ? 15 : 14) ); // Not sure since when, but right now 15 points are added, not 14.
if( Core.ML && !(this is BaseShield) )
{
int bonus = (int)(from.Skills.ArmsLore.Value / 20);
for( int i = 0; i < bonus; i++ )
{
switch( Utility.Random( 5 ) )
{
case 0: m_PhysicalBonus++; break;
case 1: m_FireBonus++; break;
case 2: m_ColdBonus++; break;
case 3: m_EnergyBonus++; break;
case 4: m_PoisonBonus++; break;
}
}
from.CheckSkill( SkillName.ArmsLore, 0, 100 );
}
}
if ( Core.AOS && tool is BaseRunicTool )
((BaseRunicTool)tool).ApplyAttributesTo( this );
#region Mondain's Legacy
if ( craftItem != null && !craftItem.ForceNonExceptional )
{
CraftResourceInfo resInfo = CraftResources.GetInfo( m_Resource );
if ( resInfo == null )
return quality;
CraftAttributeInfo attrInfo = resInfo.AttributeInfo;
if ( attrInfo == null )
return quality;
if ( m_Resource != CraftResource.Heartwood )
{
m_AosAttributes.WeaponDamage += attrInfo.ArmorDamage;
m_AosAttributes.AttackChance += attrInfo.ArmorHitChance;
m_AosAttributes.RegenHits += attrInfo.ArmorRegenHits;
m_AosArmorAttributes.MageArmor += attrInfo.ArmorMage;
}
else
{
switch ( Utility.Random( 5 ) )
{
case 0: m_AosAttributes.WeaponDamage += attrInfo.ArmorDamage; break;
case 1: m_AosAttributes.AttackChance += attrInfo.ArmorHitChance; break;
case 2: m_AosArmorAttributes.MageArmor += attrInfo.ArmorMage; break;
case 3: m_AosAttributes.Luck += attrInfo.ArmorLuck; break;
case 4: m_AosArmorAttributes.LowerStatReq += attrInfo.ArmorLowerRequirements; break;
}
}
}
#endregion
return quality;
}
#endregion
#region Mondain's Legacy Set Armor
public override bool OnDragLift( Mobile from )
{
if ( Parent is Mobile && from == Parent )
{
Mobile m = (Mobile) Parent;
if ( IsSetItem ? m_SetEquipped : false )
SetHelper.RemoveSetBonus( from, SetID, this );
}
return base.OnDragLift( from );
}
public virtual SetItem SetID{ get{ return SetItem.None; } }
public virtual int Pieces{ get{ return 0; } }
public virtual bool MixedSet{ get{ return false; } }
public bool IsSetItem{ get{ return SetID == SetItem.None ? false : true; } }
private int m_SetHue;
private bool m_SetEquipped;
private bool m_LastEquipped;
[CommandProperty( AccessLevel.GameMaster )]
public int SetHue
{
get{ return m_SetHue; }
set{ m_SetHue = value; InvalidateProperties(); }
}
public bool SetEquipped
{
get{ return m_SetEquipped; }
set{ m_SetEquipped = value; }
}
public bool LastEquipped
{
get{ return m_LastEquipped; }
set{ m_LastEquipped = value; }
}
private AosAttributes m_SetAttributes;
private AosArmorAttributes m_SetArmorAttributes;
private AosSkillBonuses m_SetSkillBonuses;
[CommandProperty( AccessLevel.GameMaster )]
public AosAttributes SetAttributes
{
get{ return m_SetAttributes; }
set{}
}
[CommandProperty( AccessLevel.GameMaster )]
public AosArmorAttributes SetArmorAttributes
{
get{ return m_SetArmorAttributes; }
set{}
}
[CommandProperty( AccessLevel.GameMaster )]
public AosSkillBonuses SetSkillBonuses
{
get{ return m_SetSkillBonuses; }
set{}
}
private int m_SetPhysicalBonus, m_SetFireBonus, m_SetColdBonus, m_SetPoisonBonus, m_SetEnergyBonus;
[CommandProperty( AccessLevel.GameMaster )]
public int SetPhysicalBonus{ get{ return m_SetPhysicalBonus; } set{ m_SetPhysicalBonus = value; InvalidateProperties(); } }
[CommandProperty( AccessLevel.GameMaster )]
public int SetFireBonus{ get{ return m_SetFireBonus; } set{ m_SetFireBonus = value; InvalidateProperties(); } }
[CommandProperty( AccessLevel.GameMaster )]
public int SetColdBonus{ get{ return m_SetColdBonus; } set{ m_SetColdBonus = value; InvalidateProperties(); } }
[CommandProperty( AccessLevel.GameMaster )]
public int SetPoisonBonus{ get{ return m_SetPoisonBonus; } set{ m_SetPoisonBonus = value; InvalidateProperties(); } }
[CommandProperty( AccessLevel.GameMaster )]
public int SetEnergyBonus{ get{ return m_SetEnergyBonus; } set{ m_SetEnergyBonus = value; InvalidateProperties(); } }
public virtual void GetSetProperties( ObjectPropertyList list )
{
int prop;
if ( !m_SetEquipped )
{
if ( m_SetPhysicalBonus != 0 )
list.Add( 1072382, m_SetPhysicalBonus.ToString() ); // physical resist +~1_val~%
if ( m_SetFireBonus != 0 )
list.Add( 1072383, m_SetFireBonus.ToString() ); // fire resist +~1_val~%
if ( m_SetColdBonus != 0 )
list.Add( 1072384, m_SetColdBonus.ToString() ); // cold resist +~1_val~%
if ( m_SetPoisonBonus != 0 )
list.Add( 1072385, m_SetPoisonBonus.ToString() ); // poison resist +~1_val~%
if ( m_SetEnergyBonus != 0 )
list.Add( 1072386, m_SetEnergyBonus.ToString() ); // energy resist +~1_val~%
}
if ( (prop = m_SetArmorAttributes.DurabilityBonus) != 0 && GetDurabilityBonus() == 0 )
list.Add( 1060410, prop.ToString() ); // durability ~1_val~%
if ( (prop = m_SetArmorAttributes.LowerStatReq) != 0 && GetLowerStatReq() == 0 )
list.Add( 1060435, prop.ToString() ); // lower requirements ~1_val~%
if ( (prop = m_SetArmorAttributes.MageArmor) != 0 && ArmorAttributes.MageArmor == 0 )
list.Add( 1060437 ); // mage armor
if ( (prop = m_SetArmorAttributes.SelfRepair) != 0 && ArmorAttributes.SelfRepair == 0 )
list.Add( 1060450, prop.ToString() ); // self repair ~1_val~
if ( m_AosSkillBonuses.Skill_1_Value != 0 )
list.Add( 1072502, "{0}t{1}", "#" + ( 1044060 + (int) m_SetSkillBonuses.Skill_1_Name ), m_SetSkillBonuses.Skill_1_Value ); // ~1_skill~ ~2_val~ (total)
SetHelper.GetSetProperties( list, Attributes, m_SetAttributes, m_SetEquipped );
}
#endregion
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using Server;
using Server.Items;
using Server.Factions;
using Server.Mobiles;
using Server.Commands;
namespace Server.Engines.Craft
{
public enum ConsumeType
{
All, Half, None
}
public interface ICraftable
{
int OnCraft( int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CraftItem craftItem, int resHue );
}
public class CraftItem
{
#region Mondain's Legacy
public static void Initialize()
{
CraftSystem sys;
sys = DefAlchemy.CraftSystem;
sys = DefBlacksmithy.CraftSystem;
sys = DefBowFletching.CraftSystem;
sys = DefCarpentry.CraftSystem;
sys = DefCartography.CraftSystem;
sys = DefCooking.CraftSystem;
sys = DefGlassblowing.CraftSystem;
sys = DefInscription.CraftSystem;
sys = DefMasonry.CraftSystem;
sys = DefTailoring.CraftSystem;
sys = DefTinkering.CraftSystem;
}
#endregion
private CraftResCol m_arCraftRes;
private CraftSkillCol m_arCraftSkill;
private Type m_Type;
private string m_GroupNameString;
private int m_GroupNameNumber;
private string m_NameString;
private int m_NameNumber;
private int m_Mana;
private int m_Hits;
private int m_Stam;
private bool m_UseAllRes;
private bool m_NeedHeat;
private bool m_NeedOven;
private bool m_NeedMill;
private bool m_UseSubRes2;
private bool m_ForceNonExceptional;
public bool ForceNonExceptional
{
get { return m_ForceNonExceptional; }
set { m_ForceNonExceptional = value; }
}
private Expansion m_RequiredExpansion;
public Expansion RequiredExpansion
{
get { return m_RequiredExpansion; }
set { m_RequiredExpansion = value; }
}
private Recipe m_Recipe;
public Recipe Recipe
{
get { return m_Recipe; }
}
public void AddRecipe( int id, CraftSystem system )
{
if( m_Recipe != null )
{
Console.WriteLine( "Warning: Attempted add of recipe #{0} to the crafting of {1} in CraftSystem {2}.", id, this.m_Type.Name, system );
return;
}
m_Recipe = new Recipe( id, system, this );
}
private static Dictionary<Type, int> m_itemIDs = new Dictionary<Type, int>();
public static int ItemIDOf( Type type )
{
object obj = m_ItemID[type];
if ( obj != null )
return (int)obj;
int itemID = 0;
if ( type == typeof( FactionExplosionTrap ) )
itemID = 14034;
else if ( type == typeof( FactionGasTrap ) )
itemID = 4523;
else if ( type == typeof( FactionSawTrap ) )
itemID = 4359;
else if ( type == typeof( FactionSpikeTrap ) )
itemID = 4517;
if ( itemID == 0 )
{
object[] attrs = type.GetCustomAttributes( typeof( CraftItemIDAttribute ), false );
if ( attrs.Length > 0 )
{
CraftItemIDAttribute craftItemID = (CraftItemIDAttribute) attrs[0];
itemID = craftItemID.ItemID;
}
}
if ( itemID == 0 )
{
Item item = null;
try{ item = Activator.CreateInstance( type ) as Item; }
catch{}
if ( item != null )
{
itemID = item.ItemID;
item.Delete();
}
}
m_ItemID[type] = itemID;
return itemID;
}
public CraftItem( Type type, TextDefinition groupName, TextDefinition name )
{
m_arCraftRes = new CraftResCol();
m_arCraftSkill = new CraftSkillCol();
m_Type = type;
m_GroupNameString = groupName;
m_NameString = name;
m_GroupNameNumber = groupName;
m_NameNumber = name;
}
public void AddRes( Type type, TextDefinition name, int amount )
{
AddRes( type, name, amount, "" );
}
public void AddRes( Type type, TextDefinition name, int amount, TextDefinition message )
{
CraftRes craftRes = new CraftRes( type, name, amount, message );
m_arCraftRes.Add( craftRes );
}
public void AddSkill( SkillName skillToMake, double minSkill, double maxSkill )
{
CraftSkill craftSkill = new CraftSkill( skillToMake, minSkill, maxSkill );
m_arCraftSkill.Add( craftSkill );
}
public int Mana
{
get { return m_Mana; }
set { m_Mana = value; }
}
public int Hits
{
get { return m_Hits; }
set { m_Hits = value; }
}
public int Stam
{
get { return m_Stam; }
set { m_Stam = value; }
}
public bool UseSubRes2
{
get { return m_UseSubRes2; }
set { m_UseSubRes2 = value; }
}
public bool UseAllRes
{
get { return m_UseAllRes; }
set { m_UseAllRes = value; }
}
public bool NeedHeat
{
get { return m_NeedHeat; }
set { m_NeedHeat = value; }
}
public bool NeedOven
{
get { return m_NeedOven; }
set { m_NeedOven = value; }
}
public bool NeedMill
{
get { return m_NeedMill; }
set { m_NeedMill = value; }
}
public Type ItemType
{
get { return m_Type; }
}
public string GroupNameString
{
get { return m_GroupNameString; }
}
public int GroupNameNumber
{
get { return m_GroupNameNumber; }
}
public string NameString
{
get { return m_NameString; }
}
public int NameNumber
{
get { return m_NameNumber; }
}
public CraftResCol Ressources
{
get { return m_arCraftRes; }
}
public CraftSkillCol Skills
{
get { return m_arCraftSkill; }
}
public bool ConsumeAttributes( Mobile from, ref object message, bool consume )
{
bool consumMana = false;
bool consumHits = false;
bool consumStam = false;
if ( Hits > 0 && from.Hits < Hits )
{
message = "You lack the required hit points to make that.";
return false;
}
else
{
consumHits = consume;
}
if ( Mana > 0 && from.Mana < Mana )
{
message = "You lack the required mana to make that.";
return false;
}
else
{
consumMana = consume;
}
if ( Stam > 0 && from.Stam < Stam )
{
message = "You lack the required stamina to make that.";
return false;
}
else
{
consumStam = consume;
}
if ( consumMana )
from.Mana -= Mana;
if ( consumHits )
from.Hits -= Hits;
if ( consumStam )
from.Stam -= Stam;
return true;
}
#region Tables
private static int[] m_HeatSources = new int[]
{
0x461, 0x48E, // Sandstone oven/fireplace
0x92B, 0x96C, // Stone oven/fireplace
0xDE3, 0xDE9, // Campfire
0xFAC, 0xFAC, // Firepit
0x184A, 0x184C, // Heating stand (left)
0x184E, 0x1850, // Heating stand (right)
0x398C, 0x399F, // Fire field
0x2DDB, 0x2DDC //Elven stove
};
private static int[] m_Ovens = new int[]
{
0x461, 0x46F, // Sandstone oven
0x92B, 0x93F, // Stone oven
0x2DDB, 0x2DDC //Elven stove
};
private static int[] m_Mills = new int[]
{
0x1920, 0x1921, 0x1922, 0x1923, 0x1924, 0x1295, 0x1926, 0x1928,
0x192C, 0x192D, 0x192E, 0x129F, 0x1930, 0x1931, 0x1932, 0x1934
};
private static Type[][] m_TypesTable = new Type[][]
{
new Type[]{ typeof( Log ), typeof( Board ) },
#region Mondain's Legacy
new Type[]{ typeof( PineLog ), typeof( PineBoard ) },
new Type[]{ typeof( CedarLog ), typeof( CedarBoard ) },
new Type[]{ typeof( CherryLog ), typeof( CherryBoard ) },
new Type[]{ typeof( MahoganyLog ), typeof( MahoganyBoard ) },
new Type[]{ typeof( OakLog ), typeof( OakBoard ) },
new Type[]{ typeof( AshLog ), typeof( AshBoard ) },
new Type[]{ typeof( YewLog ), typeof( YewBoard ) },
new Type[]{ typeof( HeartwoodLog ), typeof( HeartwoodBoard ) },
new Type[]{ typeof( BloodwoodLog ), typeof( BloodwoodBoard ) },
new Type[]{ typeof( FrostwoodLog ), typeof( FrostwoodBoard ) },
#endregion
new Type[]{ typeof( Leather ), typeof( Hides ) },
new Type[]{ typeof( SpinedLeather ), typeof( SpinedHides ) },
new Type[]{ typeof( HornedLeather ), typeof( HornedHides ) },
new Type[]{ typeof( BarbedLeather ), typeof( BarbedHides ) },
new Type[]{ typeof( DragonLeather ), typeof( DragonHides ) },
new Type[]{ typeof( DaemonLeather ), typeof( DaemonHides ) },
new Type[]{ typeof( BlankMap ), typeof( BlankScroll ) },
new Type[]{ typeof( Cloth ), typeof( UncutCloth ) },
new Type[]{ typeof( CheeseWheel ), typeof( CheeseWedge ) },
new Type[]{ typeof( Pumpkin ), typeof( SmallPumpkin ) },
new Type[]{ typeof( WoodenBowlOfPeas ), typeof( PewterBowlOfPeas ) }
};
private static Type[] m_ColoredItemTable = new Type[]
{
#region Mondain's Legacy
typeof( BaseContainer ),
#endregion
typeof( BaseWeapon ), typeof( BaseArmor ), typeof( BaseClothing ),
typeof( BaseJewel ), typeof( DragonBardingDeed ), typeof( WoodenBench ),
typeof( BambooChair ), typeof( WoodenChair ), typeof( WoodenChairCushion ),
typeof( Stool ), typeof( FootStool ), typeof( FancyWoodenChairCushion ),
typeof( Throne ), typeof( WoodenThrone ), typeof( ElegantLowTable ),
typeof( PlainLowTable ), typeof( LargeTable ), typeof( Nightstand ),
typeof( YewWoodTable ), typeof( WritingTable ), typeof( TallMusicStand ),
typeof( ShortMusicStand ), typeof( Easle ), typeof( BaseContainer )
};
private static Type[] m_ColoredResourceTable = new Type[]
{
#region Mondain's Legacy
typeof( BaseBoard ), typeof( BaseLog ),
#endregion
typeof( BaseIngot ), typeof( BaseOre ),
typeof( BaseLeather ), typeof( BaseHides ),
typeof( UncutCloth ), typeof( Cloth ),
typeof( BaseGranite ), typeof( BaseScales )
};
private static Type[] m_MarkableTable = new Type[]
{
#region Mondain's Legacy
typeof( BlueDiamondRing ), typeof( BrilliantAmberBracelet ),
typeof( DarkSapphireBracelet ), typeof( EcruCitrineRing ),
typeof( FireRubyBracelet ), typeof( PerfectEmeraldRing ),
typeof( TurqouiseRing ), typeof( WhitePearlBracelet ),
typeof( BaseContainer ),
#endregion
typeof( BaseArmor ),
typeof( BaseWeapon ),
typeof( BaseClothing ),
typeof( BaseInstrument ),
typeof( BaseFurniture ),
typeof( BaseContainer ),
typeof( DragonBardingDeed ),
typeof( BaseTool ),
typeof( BaseHarvestTool ),
typeof( FukiyaDarts ), typeof( Shuriken ),
typeof( Spellbook ), typeof( Runebook )
};
#endregion
public bool IsMarkable( Type type )
{
if( m_ForceNonExceptional ) //Don't even display the stuff for marking if it can't ever be exceptional.
return false;
for ( int i = 0; i < m_MarkableTable.Length; ++i )
{
if ( type == m_MarkableTable[i] || type.IsSubclassOf( m_MarkableTable[i] ) )
return true;
}
return false;
}
public bool RetainsColorFrom( CraftSystem system, Type type )
{
if ( system.RetainsColorFrom( this, type ) )
return true;
bool inItemTable = false, inResourceTable = false;
for ( int i = 0; !inItemTable && i < m_ColoredItemTable.Length; ++i )
inItemTable = ( m_Type == m_ColoredItemTable[i] || m_Type.IsSubclassOf( m_ColoredItemTable[i] ) );
for ( int i = 0; inItemTable && !inResourceTable && i < m_ColoredResourceTable.Length; ++i )
inResourceTable = ( type == m_ColoredResourceTable[i] || type.IsSubclassOf( m_ColoredResourceTable[i] ) );
return ( inItemTable && inResourceTable );
}
public bool Find( Mobile from, int[] itemIDs )
{
Map map = from.Map;
if ( map == null )
return false;
IPooledEnumerable eable = map.GetItemsInRange( from.Location, 2 );
foreach ( Item item in eable )
{
if ( (item.Z + 16) > from.Z && (from.Z + 16) > item.Z && Find( item.ItemID, itemIDs ) )
{
eable.Free();
return true;
}
}
eable.Free();
for ( int x = -2; x <= 2; ++x )
{
for ( int y = -2; y <= 2; ++y )
{
int vx = from.X + x;
int vy = from.Y + y;
Tile[] tiles = map.Tiles.GetStaticTiles( vx, vy, true );
for ( int i = 0; i < tiles.Length; ++i )
{
int z = tiles[i].Z;
int id = tiles[i].ID & 0x3FFF;
if ( (z + 16) > from.Z && (from.Z + 16) > z && Find( id, itemIDs ) )
return true;
}
}
}
return false;
}
public bool Find( int itemID, int[] itemIDs )
{
bool contains = false;
for ( int i = 0; !contains && i < itemIDs.Length; i += 2 )
contains = ( itemID >= itemIDs[i] && itemID <= itemIDs[i + 1] );
return contains;
}
public bool IsQuantityType( Type[][] types )
{
for ( int i = 0; i < types.Length; ++i )
{
Type[] check = types[i];
for ( int j = 0; j < check.Length; ++j )
{
if ( typeof( IHasQuantity ).IsAssignableFrom( check[j] ) )
return true;
}
}
return false;
}
public int ConsumeQuantity( Container cont, Type[][] types, int[] amounts )
{
if ( types.Length != amounts.Length )
throw new ArgumentException();
Item[][] items = new Item[types.Length][];
int[] totals = new int[types.Length];
for ( int i = 0; i < types.Length; ++i )
{
items[i] = cont.FindItemsByType( types[i], true );
for ( int j = 0; j < items[i].Length; ++j )
{
IHasQuantity hq = items[i][j] as IHasQuantity;
if ( hq == null )
{
totals[i] += items[i][j].Amount;
}
else
{
if ( hq is BaseBeverage && ((BaseBeverage)hq).Content != BeverageType.Water )
continue;
totals[i] += hq.Quantity;
}
}
if ( totals[i] < amounts[i] )
return i;
}
for ( int i = 0; i < types.Length; ++i )
{
int need = amounts[i];
for ( int j = 0; j < items[i].Length; ++j )
{
Item item = items[i][j];
IHasQuantity hq = item as IHasQuantity;
if ( hq == null )
{
int theirAmount = item.Amount;
if ( theirAmount < need )
{
item.Delete();
need -= theirAmount;
}
else
{
item.Consume( need );
break;
}
}
else
{
if ( hq is BaseBeverage && ((BaseBeverage)hq).Content != BeverageType.Water )
continue;
int theirAmount = hq.Quantity;
if ( theirAmount < need )
{
hq.Quantity -= theirAmount;
need -= theirAmount;
}
else
{
hq.Quantity -= need;
break;
}
}
}
}
return -1;
}
public int GetQuantity( Container cont, Type[] types )
{
Item[] items = cont.FindItemsByType( types, true );
int amount = 0;
for ( int i = 0; i < items.Length; ++i )
{
IHasQuantity hq = items[i] as IHasQuantity;
if ( hq == null )
{
amount += items[i].Amount;
}
else
{
if ( hq is BaseBeverage && ((BaseBeverage)hq).Content != BeverageType.Water )
continue;
amount += hq.Quantity;
}
}
return amount;
}
public bool ConsumeRes( Mobile from, Type typeRes, CraftSystem craftSystem, ref int resHue, ref int maxAmount, ConsumeType consumeType, ref object message )
{
return ConsumeRes( from, typeRes, craftSystem, ref resHue, ref maxAmount, consumeType, ref message, false );
}
public bool ConsumeRes( Mobile from, Type typeRes, CraftSystem craftSystem, ref int resHue, ref int maxAmount, ConsumeType consumeType, ref object message, bool isFailure )
{
Container ourPack = from.Backpack;
if ( ourPack == null )
return false;
if ( m_NeedHeat && !Find( from, m_HeatSources ) )
{
message = 1044487; // You must be near a fire source to cook.
return false;
}
if ( m_NeedOven && !Find( from, m_Ovens ) )
{
message = 1044493; // You must be near an oven to bake that.
return false;
}
if ( m_NeedMill && !Find( from, m_Mills ) )
{
message = 1044491; // You must be near a flour mill to do that.
return false;
}
Type[][] types = new Type[m_arCraftRes.Count][];
int[] amounts = new int[m_arCraftRes.Count];
maxAmount = int.MaxValue;
CraftSubResCol resCol = ( m_UseSubRes2 ? craftSystem.CraftSubRes2 : craftSystem.CraftSubRes );
for ( int i = 0; i < types.Length; ++i )
{
CraftRes craftRes = m_arCraftRes.GetAt( i );
Type baseType = craftRes.ItemType;
// Resource Mutation
if ( (baseType == resCol.ResType) && ( typeRes != null ) )
{
baseType = typeRes;
CraftSubRes subResource = resCol.SearchFor( baseType );
if ( subResource != null && from.Skills[craftSystem.MainSkill].Base < subResource.RequiredSkill )
{
message = subResource.Message;
return false;
}
}
// ******************
for ( int j = 0; types[i] == null && j < m_TypesTable.Length; ++j )
{
if ( m_TypesTable[j][0] == baseType )
types[i] = m_TypesTable[j];
}
if ( types[i] == null )
types[i] = new Type[]{ baseType };
/*if ( !retainedColor && RetainsColorFrom( craftSystem, baseType ) )
{
retainedColor = true;
Item resItem = ourPack.FindItemByType( types[i] );
if ( resItem != null )
resHue = resItem.Hue;
}*/
amounts[i] = craftRes.Amount;
// For stackable items that can ben crafted more than one at a time
if ( UseAllRes )
{
int tempAmount = ourPack.GetAmount( types[i] );
tempAmount /= amounts[i];
if ( tempAmount < maxAmount )
{
maxAmount = tempAmount;
if ( maxAmount == 0 )
{
CraftRes res = m_arCraftRes.GetAt( i );
if ( res.MessageNumber > 0 )
message = res.MessageNumber;
else if ( res.MessageString != null && res.MessageString != String.Empty )
message = res.MessageString;
else
message = 502925; // You don't have the resources required to make that item.
return false;
}
}
}
// ****************************
if ( isFailure && !craftSystem.ConsumeOnFailure( from, types[i][0], this ) )
amounts[i] = 0;
}
// We adjust the amount of each resource to consume the max posible
if ( UseAllRes )
{
for ( int i = 0; i < amounts.Length; ++i )
amounts[i] *= maxAmount;
}
else
maxAmount = -1;
Item consumeExtra = null;
if ( m_NameNumber == 1041267 )
{
// Runebooks are a special case, they need a blank recall rune
Item[] runes = ourPack.FindItemsByType( typeof( RecallRune ) );
for ( int i = 0; i < runes.Length; ++i )
{
RecallRune rune = runes[i] as RecallRune;
if ( rune != null && !rune.Marked )
{
consumeExtra = rune;
break;
}
}
if ( consumeExtra == null )
{
message = 1044253; // You don't have the components needed to make that.
return false;
}
}
int index = 0;
// Consume ALL
if ( consumeType == ConsumeType.All )
{
m_ResHue = 0; m_ResAmount = 0; m_System = craftSystem;
if ( IsQuantityType( types ) )
index = ConsumeQuantity( ourPack, types, amounts );
else
index = ourPack.ConsumeTotalGrouped( types, amounts, true, new OnItemConsumed( OnResourceConsumed ), new CheckItemGroup( CheckHueGrouping ) );
resHue = m_ResHue;
}
// Consume Half ( for use all resource craft type )
else if ( consumeType == ConsumeType.Half )
{
for ( int i = 0; i < amounts.Length; i++ )
{
amounts[i] /= 2;
if ( amounts[i] < 1 )
amounts[i] = 1;
}
m_ResHue = 0; m_ResAmount = 0; m_System = craftSystem;
if ( IsQuantityType( types ) )
index = ConsumeQuantity( ourPack, types, amounts );
else
index = ourPack.ConsumeTotalGrouped( types, amounts, true, new OnItemConsumed( OnResourceConsumed ), new CheckItemGroup( CheckHueGrouping ) );
resHue = m_ResHue;
}
else // ConstumeType.None ( it's basicaly used to know if the crafter has enough resource before starting the process )
{
index = -1;
if ( IsQuantityType( types ) )
{
for ( int i = 0; i < types.Length; i++ )
{
if ( GetQuantity( ourPack, types[i] ) < amounts[i] )
{
index = i;
break;
}
}
}
else
{
for ( int i = 0; i < types.Length; i++ )
{
if ( ourPack.GetBestGroupAmount( types[i], true, new CheckItemGroup( CheckHueGrouping ) ) < amounts[i] )
{
index = i;
break;
}
}
}
}
if ( index == -1 )
{
if ( consumeType != ConsumeType.None )
if ( consumeExtra != null )
consumeExtra.Delete();
return true;
}
else
{
CraftRes res = m_arCraftRes.GetAt( index );
if ( res.MessageNumber > 0 )
message = res.MessageNumber;
else if ( res.MessageString != null && res.MessageString != String.Empty )
message = res.MessageString;
else
message = 502925; // You don't have the resources required to make that item.
return false;
}
}
private int m_ResHue;
private int m_ResAmount;
private CraftSystem m_System;
private void OnResourceConsumed( Item item, int amount )
{
if ( !RetainsColorFrom( m_System, item.GetType() ) )
return;
if ( amount >= m_ResAmount )
{
m_ResHue = item.Hue;
m_ResAmount = amount;
}
}
private int CheckHueGrouping( Item a, Item b )
{
return b.Hue.CompareTo( a.Hue );
}
public double GetExceptionalChance( CraftSystem system, double chance, Mobile from )
{
if( m_ForceNonExceptional )
return 0.0;
#region Mondain's Legacy
if ( from.Talisman is BaseTalisman )
{
BaseTalisman talisman = (BaseTalisman) from.Talisman;
if ( talisman.Skill == system.MainSkill )
chance += ( talisman.ExceptionalBonus - talisman.SuccessBonus ) / (double) 100;
}
#endregion
switch ( system.ECA )
{
default:
case CraftECA.ChanceMinusSixty: return chance - 0.6;
case CraftECA.FiftyPercentChanceMinusTenPercent: return (chance * 0.5) - 0.1;
case CraftECA.ChanceMinusSixtyToFourtyFive:
{
double offset = 0.60 - ((from.Skills[system.MainSkill].Value - 95.0) * 0.03);
if ( offset < 0.45 )
offset = 0.45;
else if ( offset > 0.60 )
offset = 0.60;
return chance - offset;
}
}
}
public bool CheckSkills( Mobile from, Type typeRes, CraftSystem craftSystem, ref int quality, ref bool allRequiredSkills )
{
return CheckSkills( from, typeRes, craftSystem, ref quality, ref allRequiredSkills, true );
}
public bool CheckSkills( Mobile from, Type typeRes, CraftSystem craftSystem, ref int quality, ref bool allRequiredSkills, bool gainSkills )
{
double chance = GetSuccessChance( from, typeRes, craftSystem, gainSkills, ref allRequiredSkills );
if ( GetExceptionalChance( craftSystem, chance, from ) > Utility.RandomDouble() )
quality = 2;
return ( chance > Utility.RandomDouble() );
}
public double GetSuccessChance( Mobile from, Type typeRes, CraftSystem craftSystem, bool gainSkills, ref bool allRequiredSkills )
{
double minMainSkill = 0.0;
double maxMainSkill = 0.0;
double valMainSkill = 0.0;
allRequiredSkills = true;
for ( int i = 0; i < m_arCraftSkill.Count; i++)
{
CraftSkill craftSkill = m_arCraftSkill.GetAt(i);
double minSkill = craftSkill.MinSkill;
double maxSkill = craftSkill.MaxSkill;
double valSkill = from.Skills[craftSkill.SkillToMake].Value;
if ( valSkill < minSkill )
allRequiredSkills = false;
if ( craftSkill.SkillToMake == craftSystem.MainSkill )
{
minMainSkill = minSkill;
maxMainSkill = maxSkill;
valMainSkill = valSkill;
}
if ( gainSkills ) // This is a passive check. Success chance is entirely dependant on the main skill
from.CheckSkill( craftSkill.SkillToMake, minSkill, maxSkill );
}
double chance;
if ( allRequiredSkills )
chance = craftSystem.GetChanceAtMin( this ) + ((valMainSkill - minMainSkill) / (maxMainSkill - minMainSkill) * (1.0 - craftSystem.GetChanceAtMin( this )));
else
chance = 0.0;
#region Mondain's Legacy
if ( allRequiredSkills && from.Talisman is BaseTalisman )
{
BaseTalisman talisman = (BaseTalisman) from.Talisman;
if ( talisman.Skill == craftSystem.MainSkill )
chance += talisman.SuccessBonus / (double) 100;
}
#endregion
if ( allRequiredSkills && valMainSkill == maxMainSkill )
chance = 1.0;
return chance;
}
public void Craft( Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool )
{
if ( from.BeginAction( typeof( CraftSystem ) ) )
{
if( RequiredExpansion == Expansion.None || ( from.NetState != null && from.NetState.SupportsExpansion( RequiredExpansion ) ) )
{
bool allRequiredSkills = true;
double chance = GetSuccessChance( from, typeRes, craftSystem, false, ref allRequiredSkills );
if ( allRequiredSkills && chance >= 0.0 )
{
if( this.Recipe == null || !(from is PlayerMobile) || ((PlayerMobile)from).HasRecipe( this.Recipe ) )
{
int badCraft = craftSystem.CanCraft( from, tool, m_Type );
if( badCraft <= 0 )
{
int resHue = 0;
int maxAmount = 0;
object message = null;
if( ConsumeRes( from, typeRes, craftSystem, ref resHue, ref maxAmount, ConsumeType.None, ref message ) )
{
message = null;
if( ConsumeAttributes( from, ref message, false ) )
{
CraftContext context = craftSystem.GetContext( from );
if( context != null )
context.OnMade( this );
int iMin = craftSystem.MinCraftEffect;
int iMax = (craftSystem.MaxCraftEffect - iMin) + 1;
int iRandom = Utility.Random( iMax );
iRandom += iMin + 1;
new InternalTimer( from, craftSystem, this, typeRes, tool, iRandom ).Start();
}
else
{
from.EndAction( typeof( CraftSystem ) );
from.SendGump( new CraftGump( from, craftSystem, tool, message ) );
}
}
else
{
from.EndAction( typeof( CraftSystem ) );
from.SendGump( new CraftGump( from, craftSystem, tool, message ) );
}
}
else
{
from.EndAction( typeof( CraftSystem ) );
from.SendGump( new CraftGump( from, craftSystem, tool, badCraft ) );
}
}
else
{
from.EndAction( typeof( CraftSystem ) );
from.SendGump( new CraftGump( from, craftSystem, tool, 1072847 ) ); // You must learn that recipe from a scroll.
}
}
else
{
from.EndAction( typeof( CraftSystem ) );
from.SendGump( new CraftGump( from, craftSystem, tool, 1044153 ) ); // You don't have the required skills to attempt this item.
}
}
else
{
from.EndAction( typeof( CraftSystem ) );
from.SendGump( new CraftGump( from, craftSystem, tool, RequiredExpansionMessage( RequiredExpansion ) ) ); //The {0} expansion is required to attempt this item.
}
}
else
{
from.SendLocalizedMessage( 500119 ); // You must wait to perform another action
}
}
private object RequiredExpansionMessage( Expansion expansion ) //Eventually convert to TextDefinition, but that requires that we convert all the gumps to ues it too. Not that it wouldn't be a bad idea.
{
switch( expansion )
{
case Expansion.SE:
return 1063307; // The "Samurai Empire" expansion is required to attempt this item.
case Expansion.ML:
return 1072650; // The "Mondain's Legacy" expansion is required to attempt this item.
default:
return String.Format( "The "{0}" expansion is required to attempt this item.", ExpansionInfo.GetInfo( expansion ).Name );
}
}
public void CompleteCraft( int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CustomCraft customCraft )
{
int badCraft = craftSystem.CanCraft( from, tool, m_Type );
if ( badCraft > 0 )
{
if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 )
from.SendGump( new CraftGump( from, craftSystem, tool, badCraft ) );
else
from.SendLocalizedMessage( badCraft );
return;
}
int checkResHue = 0, checkMaxAmount = 0;
object checkMessage = null;
// Not enough resource to craft it
if ( !ConsumeRes( from, typeRes, craftSystem, ref checkResHue, ref checkMaxAmount, ConsumeType.None, ref checkMessage ) )
{
if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 )
from.SendGump( new CraftGump( from, craftSystem, tool, checkMessage ) );
else if ( checkMessage is int && (int)checkMessage > 0 )
from.SendLocalizedMessage( (int)checkMessage );
else if ( checkMessage is string )
from.SendMessage( (string)checkMessage );
return;
}
else if ( !ConsumeAttributes( from, ref checkMessage, false ) )
{
if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 )
from.SendGump( new CraftGump( from, craftSystem, tool, checkMessage ) );
else if ( checkMessage is int && (int)checkMessage > 0 )
from.SendLocalizedMessage( (int)checkMessage );
else if ( checkMessage is string )
from.SendMessage( (string)checkMessage );
return;
}
bool toolBroken = false;
int ignored = 1;
int endquality = 1;
bool allRequiredSkills = true;
if ( CheckSkills( from, typeRes, craftSystem, ref ignored, ref allRequiredSkills ) )
{
// Resource
int resHue = 0;
int maxAmount = 0;
object message = null;
// Not enough resource to craft it
if ( !ConsumeRes( from, typeRes, craftSystem, ref resHue, ref maxAmount, ConsumeType.All, ref message ) )
{
if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 )
from.SendGump( new CraftGump( from, craftSystem, tool, message ) );
else if ( message is int && (int)message > 0 )
from.SendLocalizedMessage( (int)message );
else if ( message is string )
from.SendMessage( (string)message );
return;
}
else if ( !ConsumeAttributes( from, ref message, true ) )
{
if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 )
from.SendGump( new CraftGump( from, craftSystem, tool, message ) );
else if ( message is int && (int)message > 0 )
from.SendLocalizedMessage( (int)message );
else if ( message is string )
from.SendMessage( (string)message );
return;
}
tool.UsesRemaining--;
if ( craftSystem is DefBlacksmithy )
{
AncientSmithyHammer hammer = from.FindItemOnLayer( Layer.OneHanded ) as AncientSmithyHammer;
if ( hammer != null && hammer != tool )
{
#region Mondain's Legacy
if ( hammer is HammerOfHephaestus )
{
if ( hammer.UsesRemaining > 0 )
hammer.UsesRemaining--;
if ( hammer.UsesRemaining < 1 )
from.PlaceInBackpack( hammer );
}
else
{
hammer.UsesRemaining--;
if ( hammer.UsesRemaining < 1 )
hammer.Delete();
}
#endregion
}
}
#region Mondain's Legacy
if ( tool is HammerOfHephaestus )
{
if ( tool.UsesRemaining < 1 )
tool.UsesRemaining = 0;
}
else
{
if ( tool.UsesRemaining < 1 )
toolBroken = true;
if ( toolBroken )
tool.Delete();
}
#endregion
int num = 0;
Item item;
if ( customCraft != null )
{
item = customCraft.CompleteCraft( out num );
}
else if ( typeof( MapItem ).IsAssignableFrom( ItemType ) && from.Map != Map.Trammel && from.Map != Map.Felucca )
{
item = new IndecipherableMap();
from.SendLocalizedMessage( 1070800 ); // The map you create becomes mysteriously indecipherable.
}
else
{
item = Activator.CreateInstance( ItemType ) as Item;
}
if ( item != null )
{
#region Mondain's Legacy
if ( item is Board )
{
Type resourceType = typeRes;
if ( resourceType == null )
resourceType = Ressources.GetAt( 0 ).ItemType;
CraftResource thisResource = CraftResources.GetFromType( resourceType );
switch ( thisResource )
{
case CraftResource.Pine: item = new PineBoard(); break;
case CraftResource.Cedar: item = new CedarBoard(); break;
case CraftResource.Cherry: item = new CherryBoard(); break;
case CraftResource.Mahogany: item = new MahoganyBoard(); break;
case CraftResource.Oak: item = new OakBoard(); break;
case CraftResource.Ash: item = new AshBoard(); break;
case CraftResource.Yew: item = new YewBoard(); break;
case CraftResource.Heartwood: item = new HeartwoodBoard(); break;
case CraftResource.Bloodwood: item = new BloodwoodBoard(); break;
case CraftResource.Frostwood: item = new FrostwoodBoard(); break;
default: item = new Board(); break;
}
}
#endregion
//For new marble system
if ( item is Marble )
{
Type resourceType = typeRes;
if ( resourceType == null )
resourceType = Ressources.GetAt( 0 ).ItemType;
CraftResource thisResource = CraftResources.GetFromType( resourceType );
switch ( thisResource )
{
case CraftResource.DullCopper: item = new DullCopperMarble(); break;
case CraftResource.ShadowIron: item = new ShadowIronMarble(); break;
case CraftResource.Copper: item = new CopperMarble(); break;
case CraftResource.Bronze: item = new BronzeMarble(); break;
case CraftResource.Gold: item = new GoldMarble(); break;
case CraftResource.Agapite: item = new AgapiteMarble(); break;
case CraftResource.Verite: item = new VeriteMarble(); break;
case CraftResource.Valorite: item = new ValoriteMarble(); break;
case CraftResource.Silver: item = new SilverMarble(); break;
case CraftResource.Platinum: item = new PlatinumMarble(); break;
case CraftResource.Mythril: item = new MythrilMarble(); break;
case CraftResource.Obsidian: item = new ObsidianMarble(); break;
case CraftResource.Jade: item = new JadeMarble(); break;
case CraftResource.Moonstone: item = new MoonstoneMarble(); break;
case CraftResource.Sunstone: item = new SunstoneMarble(); break;
case CraftResource.Bloodstone: item = new BloodstoneMarble(); break;
default: item = new Marble(); break;
}
}
//end for new marble system
if( item is ICraftable )
endquality = ((ICraftable)item).OnCraft( quality, makersMark, from, craftSystem, typeRes, tool, this, resHue );
else if ( item.Hue == 0 )
item.Hue = resHue;
if ( maxAmount > 0 )
{
if ( !item.Stackable && item is IUsesRemaining )
((IUsesRemaining)item).UsesRemaining *= maxAmount;
else
item.Amount = maxAmount;
}
from.AddToBackpack( item );
if( from.AccessLevel > AccessLevel.Player )
CommandLogging.WriteLine( from, "Crafting {0} with craft system {1}", CommandLogging.Format( item ), craftSystem.GetType().Name );
//from.PlaySound( 0x57 );
}
if ( num == 0 )
num = craftSystem.PlayEndingEffect( from, false, true, toolBroken, endquality, makersMark, this );
bool queryFactionImbue = false;
int availableSilver = 0;
FactionItemDefinition def = null;
Faction faction = null;
if ( item is IFactionItem )
{
def = FactionItemDefinition.Identify( item );
if ( def != null )
{
faction = Faction.Find( from );
if ( faction != null )
{
Town town = Town.FromRegion( from.Region );
if ( town != null && town.Owner == faction )
{
Container pack = from.Backpack;
if ( pack != null )
{
availableSilver = pack.GetAmount( typeof( Silver ) );
if ( availableSilver >= def.SilverCost )
queryFactionImbue = Faction.IsNearType( from, def.VendorType, 12 );
}
}
}
}
}
// TODO: Scroll imbuing
if ( queryFactionImbue )
from.SendGump( new FactionImbueGump( quality, item, from, craftSystem, tool, num, availableSilver, faction, def ) );
else if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 )
from.SendGump( new CraftGump( from, craftSystem, tool, num ) );
else if ( num > 0 )
from.SendLocalizedMessage( num );
}
else if ( !allRequiredSkills )
{
if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 )
from.SendGump( new CraftGump( from, craftSystem, tool, 1044153 ) );
else
from.SendLocalizedMessage( 1044153 ); // You don't have the required skills to attempt this item.
}
else
{
ConsumeType consumeType = ( UseAllRes ? ConsumeType.Half : ConsumeType.All );
int resHue = 0;
int maxAmount = 0;
object message = null;
// Not enough resource to craft it
if ( !ConsumeRes( from, typeRes, craftSystem, ref resHue, ref maxAmount, consumeType, ref message, true ) )
{
if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 )
from.SendGump( new CraftGump( from, craftSystem, tool, message ) );
else if ( message is int && (int)message > 0 )
from.SendLocalizedMessage( (int)message );
else if ( message is string )
from.SendMessage( (string)message );
return;
}
tool.UsesRemaining--;
if ( tool.UsesRemaining < 1 )
toolBroken = true;
if ( toolBroken )
tool.Delete();
// SkillCheck failed.
int num = craftSystem.PlayEndingEffect( from, true, true, toolBroken, endquality, false, this );
if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 )
from.SendGump( new CraftGump( from, craftSystem, tool, num ) );
else if ( num > 0 )
from.SendLocalizedMessage( num );
}
}
private class InternalTimer : Timer
{
private Mobile m_From;
private int m_iCount;
private int m_iCountMax;
private CraftItem m_CraftItem;
private CraftSystem m_CraftSystem;
private Type m_TypeRes;
private BaseTool m_Tool;
public InternalTimer( Mobile from, CraftSystem craftSystem, CraftItem craftItem, Type typeRes, BaseTool tool, int iCountMax ) : base( TimeSpan.Zero, TimeSpan.FromSeconds( craftSystem.Delay ), iCountMax )
{
m_From = from;
m_CraftItem = craftItem;
m_iCount = 0;
m_iCountMax = iCountMax;
m_CraftSystem = craftSystem;
m_TypeRes = typeRes;
m_Tool = tool;
}
protected override void OnTick()
{
m_iCount++;
m_From.DisruptiveAction();
if ( m_iCount < m_iCountMax )
{
m_CraftSystem.PlayCraftEffect( m_From );
}
else
{
m_From.EndAction( typeof( CraftSystem ) );
int badCraft = m_CraftSystem.CanCraft( m_From, m_Tool, m_CraftItem.m_Type );
if ( badCraft > 0 )
{
if ( m_Tool != null && !m_Tool.Deleted && m_Tool.UsesRemaining > 0 )
m_From.SendGump( new CraftGump( m_From, m_CraftSystem, m_Tool, badCraft ) );
else
m_From.SendLocalizedMessage( badCraft );
return;
}
int quality = 1;
bool allRequiredSkills = true;
m_CraftItem.CheckSkills( m_From, m_TypeRes, m_CraftSystem, ref quality, ref allRequiredSkills, false );
CraftContext context = m_CraftSystem.GetContext( m_From );
if ( context == null )
return;
if ( typeof( CustomCraft ).IsAssignableFrom( m_CraftItem.ItemType ) )
{
CustomCraft cc = null;
try{ cc = Activator.CreateInstance( m_CraftItem.ItemType, new object[] { m_From, m_CraftItem, m_CraftSystem, m_TypeRes, m_Tool, quality } ) as CustomCraft; }
catch{}
if ( cc != null )
cc.EndCraftAction();
return;
}
bool makersMark = false;
if ( quality == 2 && m_From.Skills[m_CraftSystem.MainSkill].Base >= 100.0 )
makersMark = m_CraftItem.IsMarkable( m_CraftItem.ItemType );
if ( makersMark && context.MarkOption == CraftMarkOption.PromptForMark )
{
m_From.SendGump( new QueryMakersMarkGump( quality, m_From, m_CraftItem, m_CraftSystem, m_TypeRes, m_Tool ) );
}
else
{
if ( context.MarkOption == CraftMarkOption.DoNotMark )
makersMark = false;
m_CraftItem.CompleteCraft( quality, makersMark, m_From, m_CraftSystem, m_TypeRes, m_Tool, null );
}
}
}
}
}
}
using System;
using Server;
using Server.Items;
using Server.Network;
namespace Server.Items
{
public class BaseBoards : Item, ICommodity
{
private CraftResource m_Resource;
[CommandProperty( AccessLevel.GameMaster )]
public CraftResource Resource
{
get{ return m_Resource; }
set{ m_Resource = value; InvalidateProperties(); }
}
public override double DefaultWeight
{
get { return 1.0; }
}
string ICommodity.Description
{
get
{
return String.Format( Amount == 1 ? "{0} {1} board" : "{0} {1} boards", Amount, CraftResources.GetName( m_Resource ).ToLower() );
}
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 2 ); // version
writer.Write( (int) m_Resource );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch ( version )
{
case 2:
{
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 BaseBoards( CraftResource resource ) : this( resource, 1 )
{
}
public BaseBoards( CraftResource resource, int amount ) : base( 0x1BD7 )
{
Stackable = true;
Amount = amount;
Hue = CraftResources.GetHue( resource );
m_Resource = resource;
}
public BaseBoards( Serial serial ) : base( serial )
{
}
public override void AddNameProperty( ObjectPropertyList list )
{
if ( Amount > 1 )
list.Add( 1050039, "{0}t#{1}", Amount, 1027128 ); // ~1_NUMBER~ ~2_ITEMNAME~
else
list.Add( 1027127 ); // boards
}
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 ) );
}
}
}
[FlipableAttribute( 0x1BD7, 0x1BDA )]
public class Board : BaseBoards
{
[Constructable]
public Board() : this( 1 )
{
}
[Constructable]
public Board( int amount ) : base( CraftResource.Log, amount )
{
}
public Board( 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();
}
}
[FlipableAttribute( 0x1BD7, 0x1BDA )]
public class PineBoard : BaseBoards
{
[Constructable]
public PineBoard() : this( 1 )
{
}
[Constructable]
public PineBoard( int amount ) : base( CraftResource.Pine, amount )
{
}
public PineBoard( 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();
}
}
[FlipableAttribute( 0x1BD7, 0x1BDA )]
public class CedarBoard : BaseBoards
{
[Constructable]
public CedarBoard() : this( 1 )
{
}
[Constructable]
public CedarBoard( int amount ) : base( CraftResource.Cedar, amount )
{
}
public CedarBoard( 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();
}
}
[FlipableAttribute( 0x1BD7, 0x1BDA )]
public class CherryBoard : BaseBoards
{
[Constructable]
public CherryBoard() : this( 1 )
{
}
//public override int LabelNumber
[Constructable]
public CherryBoard( int amount ) : base( CraftResource.Cherry, amount )
{
}
public CherryBoard( 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 );
get
{
if ( m_Resource >= CraftResource.Oak && m_Resource <= CraftResource.Yew )
return 1075052 + (int)(m_Resource - CraftResource.Oak);
else if ( m_Resource == CraftResource.Heartwood )
return 1075062;
else if ( m_Resource == CraftResource.Bloodwood )
return 1075055;
else if ( m_Resource == CraftResource.Frostwood )
return 1075056;
return 1015101;
int version = reader.ReadInt();
}
}
}
[FlipableAttribute( 0x1BD7, 0x1BDA )]
public class MahoganyBoard : BaseBoards
{
[Constructable]
public MahoganyBoard() : this( 1 )
{
}
[Constructable]
public MahoganyBoard( int amount ) : base( CraftResource.Mahogany, amount )
{
}
public MahoganyBoard( 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();
}
}
[FlipableAttribute( 0x1BD7, 0x1BDA )]
public class OakBoard : BaseBoards
{
[Constructable]
public OakBoard() : this( 1 )
{
}
[Constructable]
public OakBoard( int amount ) : base( CraftResource.Oak, amount )
{
}
public OakBoard( 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();
}
}
[FlipableAttribute( 0x1BD7, 0x1BDA )]
public class AshBoard : BaseBoards
{
[Constructable]
public AshBoard() : this( 1 )
{
}
[Constructable]
public AshBoard( int amount ) : base( CraftResource.Ash, amount )
{
}
public AshBoard( 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();
}
}
[FlipableAttribute( 0x1BD7, 0x1BDA )]
public class YewBoard : BaseBoards
{
[Constructable]
public YewBoard() : this( 1 )
{
}
[Constructable]
public YewBoard( int amount ) : base( CraftResource.Yew, amount )
{
}
public YewBoard( 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();
}
}
[FlipableAttribute( 0x1BD7, 0x1BDA )]
public class HeartwoodBoard : BaseBoards
{
[Constructable]
public HeartwoodBoard() : this( 1 )
{
}
[Constructable]
public HeartwoodBoard( int amount ) : base( CraftResource.Heartwood, amount )
{
}
public HeartwoodBoard( 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();
}
}
[FlipableAttribute( 0x1BD7, 0x1BDA )]
public class BloodwoodBoard : BaseBoards
{
[Constructable]
public BloodwoodBoard() : this( 1 )
{
}
[Constructable]
public BloodwoodBoard( int amount ) : base( CraftResource.Bloodwood, amount )
{
}
public BloodwoodBoard( 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();
}
}
[FlipableAttribute( 0x1BD7, 0x1BDA )]
public class FrostwoodBoard : BaseBoards
{
[Constructable]
public FrostwoodBoard() : this( 1 )
{
}
[Constructable]
public FrostwoodBoard( int amount ) : base( CraftResource.Frostwood, amount )
{
}
public FrostwoodBoard( 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();
}
}
}
/////////////////////////////////////////////////
// //
// Created by Manu for //
// Splitterwelt.com //
// german roleplay freeshard //
// //
// may be used and modified as you like, as //
// long as this header is kept //
/////////////////////////////////////////////////
using System;
using Server.Items;
using Server.Mobiles;
namespace Server.Engines.Craft
{
public class DefMarbleCrafting : CraftSystem
{
public override SkillName MainSkill
{
get { return SkillName.Mining; }
}
private static CraftSystem m_CraftSystem;
public static CraftSystem CraftSystem
{
get
{
if ( m_CraftSystem == null )
m_CraftSystem = new DefMarbleCrafting();
return m_CraftSystem;
}
}
public override CraftECA ECA{ get{ return CraftECA.ChanceMinusSixtyToFourtyFive; } }
public override double GetChanceAtMin( CraftItem item )
{
return 0.0; // 0%
}
private DefMarbleCrafting() : base( 1, 1, 1.25 )// base( 1, 1, 1.5 )
{
}
public override bool RetainsColorFrom( CraftItem item, Type type )
{
return true;
}
public override int CanCraft( Mobile from, BaseTool tool, Type itemType )
{
if ( tool.Deleted || tool.UsesRemaining < 0 )
return 1044038; // You have worn out your tool!
else if ( !(from is PlayerMobile && ((PlayerMobile)from).Masonry && from.Skills[SkillName.Mining].Base >= 50.0) )
return 1044633; // You havent learned stonecraft.
else if ( !BaseTool.CheckAccessible( tool, from ) )
return 1044263; // The tool must be on your person to use.
return 0;
}
public override void PlayCraftEffect( Mobile from )
{
}
public override int PlayEndingEffect( Mobile from, bool failed, bool lostMaterial, bool toolBroken, int quality, bool makersMark, CraftItem item )
{
if ( toolBroken )
from.SendLocalizedMessage( 1044038 ); // You have worn out your tool
if ( failed )
{
if ( lostMaterial )
return 1044043; // You failed to create the item, and some of your materials are lost.
else
return 1044157; // You failed to create the item, but no materials were lost.
}
else
{
if ( quality == 0 )
return 502785; // You were barely able to make this item. It's quality is below average.
else if ( makersMark && quality == 2 )
return 1044156; // You create an exceptional quality item and affix your maker's mark.
else if ( quality == 2 )
return 1044155; // You create an exceptional quality item.
else
return 1044154; // You create the item.
}
}
public override void InitCraftList()
{
int index = -1;
// Other Items
//AddCraft( typeof( Marble ), 1044294, "raw marble block", 0.0, 0.0, typeof( Granite ), 1044514, 1, 1044513 );
//SetUseSubRes2( index, true );*/
/* Begin Benches */
AddCraft( typeof( MarbleBenchSmallSouthAddonDeed ), "Benches", "Small Marble Bench (South)", 80.0, 100.0, typeof( Marble ), "Raw Marble Block", 1, "You need more marble!" );
AddCraft( typeof( MarbleBenchSmallEastAddonDeed ), "Benches", "Small Marble Bench(East)", 80.0, 100.0, typeof( Marble ), "Raw Marble Block", 1, "You need more marble!" );
AddCraft( typeof( MarbleBenchMediumSouthAddonDeed ), "Benches", "Medium Marble Bench (South)", 80.0, 105.0, typeof( Marble ), "Raw Marble Block", 2, "You need more marble!" );
AddCraft( typeof( MarbleBenchMediumEastAddonDeed ), "Benches", "Medium Marble Bench(East)", 80.0, 105.0, typeof( Marble ), "Raw Marble Block", 2, "You need more marble!" );
AddCraft( typeof( MarbleBenchLongSouthAddonDeed ), "Benches", "Long Marble Bench (South)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 3, "You need more marble!" );
AddCraft( typeof( MarbleBenchLongEastAddonDeed ), "Benches", "Long Marble Bench (East)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 3, "You need more marble!" );
/* End Benches */
/* Begin Statues */
AddCraft( typeof( LightMarbleDaemonStatueAddonDeed ), "Statues", "Daemon-Statue (Bright Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( DarkMarbleDaemonStatueAddonDeed ), "Statues", "Daemon-Statue (Dark Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( LightMarbleGargoyleStatueAddonDeed ), "Statues", "Gargoyle-Statue (Bright Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( DarkMarbleGargoyleStatueAddonDeed ), "Statues", "Gargoyle-Statue (Dark Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( LightMarbleNightmareStatueAddonDeed ), "Statues", "Nightmare-Statue (Bright Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( DarkMarbleNightmareStatueAddonDeed ), "Statues", "Nightmare-Statue (Dark Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( LightMarbleUnicornStatueAddonDeed ), "Statues", "Unicorn-Statue (Bright Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( DarkMarbleUnicornStatueAddonDeed ), "Statues", "Unicorn-Statue (Dark Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( LightMarbleRunebeetleStatueAddonDeed ), "Statues", "Runebeetle-Statue (Bright Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( DarkMarbleRunebeetleStatueAddonDeed ), "Statues", "Runebeetle-Statue (Dark Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( LightMarbleSkeletonwarriorStatueAddonDeed ), "Statues", "Skeletonwarrior-Statue (Bright Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( DarkMarbleSkeletonwarriorStatueAddonDeed ), "Statues", "Skeletonwarrior-Statue (Dark Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( LightMarbleSnowleopardStatueAddonDeed ), "Statues", "Snowleopard-Statue (Bright Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( DarkMarbleSnowleopardStatueAddonDeed ), "Statues", "Snowleopard-Statue (Dark Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( LightMarbleWolfStatueAddonDeed ), "Statues", "Wolf-Statue (Bright Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( DarkMarbleWolfStatueAddonDeed ), "Statues", "Wolf-Statue (Dark Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
/* End Statues */
SetSubRes( typeof( Marble ), "Marble" );
AddSubRes( typeof( Marble ), 1044525, 00.0, 1044514, 1044526 );
AddSubRes( typeof( DullCopperMarble ), 1044023, 40.0, 1044514, 1044527 );
AddSubRes( typeof( ShadowIronMarble ), 1044024, 45.0, 1044514, 1044527 );
AddSubRes( typeof( CopperMarble ), 1044025, 50.0, 1044514, 1044527 );
AddSubRes( typeof( BronzeMarble ), 1044026, 55.0, 1044514, 1044527 );
AddSubRes( typeof( GoldMarble ), 1044027, 60.0, 1044514, 1044527 );
AddSubRes( typeof( AgapiteMarble ), 1044028, 65.0, 1044514, 1044527 );
AddSubRes( typeof( VeriteMarble ), 1044029, 70.0, 1044514, 1044527 );
AddSubRes( typeof( ValoriteMarble ), 1044030, 75.0, 1044514, 1044527 );
AddSubRes( typeof( SilverMarble ), "SILVER", 80.0, 1044527 );
AddSubRes( typeof( PlatinumMarble ), "PLATINUM", 85.0, 1044527 );
AddSubRes( typeof( MythrilMarble ), "MYTHRIL", 90.0, 1044527 );
AddSubRes( typeof( ObsidianMarble ), "OBSIDIAN", 95.0, 1044527 );
AddSubRes( typeof( JadeMarble ), "JADE", 100.0, 1044527 );
AddSubRes( typeof( MoonstoneMarble ), "MOONSTONE", 105.0, 1044527 );
AddSubRes( typeof( SunstoneMarble ), "SUNSTONE", 110.0, 1044527 );
AddSubRes( typeof( BloodstoneMarble ), "BLOODSTONE", 115.0, 1044527 );
}
}
}
Warnings:
+ Items/Containers/LockableContainer.cs:
CS0108: Line 122: 'Server.Items.LockableContainer.Resource' hides inherited
member 'Server.Items.BaseContainer.Resource'. Use the new keyword if hiding was
intended.
+ Customs/Karma/MarbleCrafting/DefMarbleCrafting.cs:
CS0219: Line 95: The variable 'index' is assigned but its value is never use
d
Errors:
+ Items/Armor/BaseArmor.cs:
CS0029: Line 1599: Cannot implicitly convert type 'int' to 'string'
CS0029: Line 1599: Cannot implicitly convert type 'string' to 'bool'
CS0029: Line 1606: Cannot implicitly convert type 'int' to 'string'
CS0029: Line 1606: Cannot implicitly convert type 'string' to 'bool'
Scripts: One or more scripts failed to compile or no script files were found.
- Press return to exit, or R to try again.
using System;
using System.Collections;
using System.Collections.Generic;
using Server.Network;
using Server.Engines.Craft;
using Server.Factions;
using AMA = Server.Items.ArmorMeditationAllowance;
using AMT = Server.Items.ArmorMaterialType;
using ABT = Server.Items.ArmorBodyType;
namespace Server.Items
{
public abstract class BaseArmor : Item, IScissorable, IFactionItem, ICraftable, IWearableDurability, ISetItem
{
#region Factions
private FactionItem m_FactionState;
public FactionItem FactionItemState
{
get{ return m_FactionState; }
set
{
m_FactionState = value;
if ( m_FactionState == null )
Hue = CraftResources.GetHue( Resource );
LootType = ( m_FactionState == null ? LootType.Regular : LootType.Blessed );
}
}
#endregion
/* Armor internals work differently now (Jun 19 2003)
*
* The attributes defined below default to -1.
* If the value is -1, the corresponding virtual 'Aos/Old' property is used.
* If not, the attribute value itself is used. Here's the list:
* - ArmorBase
* - StrBonus
* - DexBonus
* - IntBonus
* - StrReq
* - DexReq
* - IntReq
* - MeditationAllowance
*/
// Instance values. These values must are unique to each armor piece.
private int m_MaxHitPoints;
private int m_HitPoints;
private Mobile m_Crafter;
private ArmorQuality m_Quality;
private ArmorDurabilityLevel m_Durability;
private ArmorProtectionLevel m_Protection;
private CraftResource m_Resource;
private bool m_Identified, m_PlayerConstructed;
private int m_PhysicalBonus, m_FireBonus, m_ColdBonus, m_PoisonBonus, m_EnergyBonus;
private AosAttributes m_AosAttributes;
private AosArmorAttributes m_AosArmorAttributes;
private AosSkillBonuses m_AosSkillBonuses;
// Overridable values. These values are provided to override the defaults which get defined in the individual armor scripts.
private int m_ArmorBase = -1;
private int m_StrBonus = -1, m_DexBonus = -1, m_IntBonus = -1;
private int m_StrReq = -1, m_DexReq = -1, m_IntReq = -1;
private AMA m_Meditate = (AMA)(-1);
public virtual bool AllowMaleWearer{ get{ return true; } }
public virtual bool AllowFemaleWearer{ get{ return true; } }
public abstract AMT MaterialType{ get; }
public virtual int RevertArmorBase{ get{ return ArmorBase; } }
public virtual int ArmorBase{ get{ return 0; } }
public virtual AMA DefMedAllowance{ get{ return AMA.None; } }
public virtual AMA AosMedAllowance{ get{ return DefMedAllowance; } }
public virtual AMA OldMedAllowance{ get{ return DefMedAllowance; } }
public virtual int AosStrBonus{ get{ return 0; } }
public virtual int AosDexBonus{ get{ return 0; } }
public virtual int AosIntBonus{ get{ return 0; } }
public virtual int AosStrReq{ get{ return 0; } }
public virtual int AosDexReq{ get{ return 0; } }
public virtual int AosIntReq{ get{ return 0; } }
public virtual int OldStrBonus{ get{ return 0; } }
public virtual int OldDexBonus{ get{ return 0; } }
public virtual int OldIntBonus{ get{ return 0; } }
public virtual int OldStrReq{ get{ return 0; } }
public virtual int OldDexReq{ get{ return 0; } }
public virtual int OldIntReq{ get{ return 0; } }
[CommandProperty( AccessLevel.GameMaster )]
public AMA MeditationAllowance
{
get{ return ( m_Meditate == (AMA)(-1) ? Core.AOS ? AosMedAllowance : OldMedAllowance : m_Meditate ); }
set{ m_Meditate = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public int BaseArmorRating
{
get
{
if ( m_ArmorBase == -1 )
return ArmorBase;
else
return m_ArmorBase;
}
set
{
m_ArmorBase = value; Invalidate();
}
}
public double BaseArmorRatingScaled
{
get
{
return ( BaseArmorRating * ArmorScalar );
}
}
public virtual double ArmorRating
{
get
{
int ar = BaseArmorRating;
if ( m_Protection != ArmorProtectionLevel.Regular )
ar += 10 + (5 * (int)m_Protection);
switch ( m_Resource )
{
case CraftResource.DullCopper: ar += 2; break;
case CraftResource.ShadowIron: ar += 4; break;
case CraftResource.Copper: ar += 6; break;
case CraftResource.Bronze: ar += 8; break;
case CraftResource.Gold: ar += 10; break;
case CraftResource.Agapite: ar += 12; break;
case CraftResource.Verite: ar += 14; break;
case CraftResource.Valorite: ar += 16; break;
case CraftResource.Silver: ar += 18; break;
case CraftResource.Platinum: ar += 20; break;
case CraftResource.Mythril: ar += 22; break;
case CraftResource.Obsidian: ar += 24; break;
case CraftResource.Jade: ar += 26; break;
case CraftResource.Moonstone: ar += 28; break;
case CraftResource.Sunstone: ar += 30; break;
case CraftResource.Bloodstone: ar += 32; break;
case CraftResource.SpinedLeather: ar += 10; break;
case CraftResource.HornedLeather: ar += 13; break;
case CraftResource.BarbedLeather: ar += 16; break;
case CraftResource.DragonLeather: ar += 18; break;
case CraftResource.DaemonLeather: ar += 20; break;
}
ar += -8 + (8 * (int)m_Quality);
return ScaleArmorByDurability( ar );
}
}
public double ArmorRatingScaled
{
get
{
return ( ArmorRating * ArmorScalar );
}
}
[CommandProperty( AccessLevel.GameMaster )]
public int StrBonus
{
get{ return ( m_StrBonus == -1 ? Core.AOS ? AosStrBonus : OldStrBonus : m_StrBonus ); }
set{ m_StrBonus = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public int DexBonus
{
get{ return ( m_DexBonus == -1 ? Core.AOS ? AosDexBonus : OldDexBonus : m_DexBonus ); }
set{ m_DexBonus = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public int IntBonus
{
get{ return ( m_IntBonus == -1 ? Core.AOS ? AosIntBonus : OldIntBonus : m_IntBonus ); }
set{ m_IntBonus = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public int StrRequirement
{
get{ return ( m_StrReq == -1 ? Core.AOS ? AosStrReq : OldStrReq : m_StrReq ); }
set{ m_StrReq = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public int DexRequirement
{
get{ return ( m_DexReq == -1 ? Core.AOS ? AosDexReq : OldDexReq : m_DexReq ); }
set{ m_DexReq = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public int IntRequirement
{
get{ return ( m_IntReq == -1 ? Core.AOS ? AosIntReq : OldIntReq : m_IntReq ); }
set{ m_IntReq = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public bool Identified
{
get{ return m_Identified; }
set{ m_Identified = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public bool PlayerConstructed
{
get{ return m_PlayerConstructed; }
set{ m_PlayerConstructed = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public CraftResource Resource
{
get
{
return m_Resource;
}
set
{
if ( m_Resource != value )
{
UnscaleDurability();
m_Resource = value;
Hue = CraftResources.GetHue( m_Resource );
Invalidate();
InvalidateProperties();
if ( Parent is Mobile )
((Mobile)Parent).UpdateResistances();
ScaleDurability();
}
}
}
public virtual double ArmorScalar
{
get
{
int pos = (int)BodyPosition;
if ( pos >= 0 && pos < m_ArmorScalars.Length )
return m_ArmorScalars[pos];
return 1.0;
}
}
[CommandProperty( AccessLevel.GameMaster )]
public int MaxHitPoints
{
get{ return m_MaxHitPoints; }
set{ m_MaxHitPoints = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public int HitPoints
{
get
{
return m_HitPoints;
}
set
{
if ( value != m_HitPoints && MaxHitPoints > 0 )
{
m_HitPoints = value;
if ( m_HitPoints < 0 )
Delete();
else if ( m_HitPoints > MaxHitPoints )
m_HitPoints = MaxHitPoints;
InvalidateProperties();
}
}
}
[CommandProperty( AccessLevel.GameMaster )]
public Mobile Crafter
{
get{ return m_Crafter; }
set{ m_Crafter = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public ArmorQuality Quality
{
get{ return m_Quality; }
set{ UnscaleDurability(); m_Quality = value; Invalidate(); InvalidateProperties(); ScaleDurability(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public ArmorDurabilityLevel Durability
{
get{ return m_Durability; }
set{ UnscaleDurability(); m_Durability = value; ScaleDurability(); InvalidateProperties(); }
}
public virtual int ArtifactRarity
{
get{ return 0; }
}
[CommandProperty( AccessLevel.GameMaster )]
public ArmorProtectionLevel ProtectionLevel
{
get
{
return m_Protection;
}
set
{
if ( m_Protection != value )
{
m_Protection = value;
Invalidate();
InvalidateProperties();
if ( Parent is Mobile )
((Mobile)Parent).UpdateResistances();
}
}
}
[CommandProperty( AccessLevel.GameMaster )]
public AosAttributes Attributes
{
get{ return m_AosAttributes; }
set{}
}
[CommandProperty( AccessLevel.GameMaster )]
public AosArmorAttributes ArmorAttributes
{
get{ return m_AosArmorAttributes; }
set{}
}
[CommandProperty( AccessLevel.GameMaster )]
public AosSkillBonuses SkillBonuses
{
get{ return m_AosSkillBonuses; }
set{}
}
public int ComputeStatReq( StatType type )
{
int v;
if ( type == StatType.Str )
v = StrRequirement;
else if ( type == StatType.Dex )
v = DexRequirement;
else
v = IntRequirement;
return AOS.Scale( v, 100 - GetLowerStatReq() );
}
public int ComputeStatBonus( StatType type )
{
if ( type == StatType.Str )
return StrBonus + Attributes.BonusStr;
else if ( type == StatType.Dex )
return DexBonus + Attributes.BonusDex;
else
return IntBonus + Attributes.BonusInt;
}
[CommandProperty( AccessLevel.GameMaster )]
public int PhysicalBonus{ get{ return m_PhysicalBonus; } set{ m_PhysicalBonus = value; InvalidateProperties(); } }
[CommandProperty( AccessLevel.GameMaster )]
public int FireBonus{ get{ return m_FireBonus; } set{ m_FireBonus = value; InvalidateProperties(); } }
[CommandProperty( AccessLevel.GameMaster )]
public int ColdBonus{ get{ return m_ColdBonus; } set{ m_ColdBonus = value; InvalidateProperties(); } }
[CommandProperty( AccessLevel.GameMaster )]
public int PoisonBonus{ get{ return m_PoisonBonus; } set{ m_PoisonBonus = value; InvalidateProperties(); } }
[CommandProperty( AccessLevel.GameMaster )]
public int EnergyBonus{ get{ return m_EnergyBonus; } set{ m_EnergyBonus = value; InvalidateProperties(); } }
public virtual int BasePhysicalResistance{ get{ return 0; } }
public virtual int BaseFireResistance{ get{ return 0; } }
public virtual int BaseColdResistance{ get{ return 0; } }
public virtual int BasePoisonResistance{ get{ return 0; } }
public virtual int BaseEnergyResistance{ get{ return 0; } }
// Mondain's Legacy Mod
public override int PhysicalResistance{ get{ return BasePhysicalResistance + GetProtOffset() + GetResourceAttrs().ArmorPhysicalResist + m_PhysicalBonus + (SetEquipped ? m_SetPhysicalBonus : 0 ); } }
public override int FireResistance{ get{ return BaseFireResistance + GetProtOffset() + GetResourceAttrs().ArmorFireResist + m_FireBonus + (SetEquipped ? m_SetFireBonus : 0 ); } }
public override int ColdResistance{ get{ return BaseColdResistance + GetProtOffset() + GetResourceAttrs().ArmorColdResist + m_ColdBonus + (SetEquipped ? m_SetColdBonus : 0 ); } }
public override int PoisonResistance{ get{ return BasePoisonResistance + GetProtOffset() + GetResourceAttrs().ArmorPoisonResist + m_PoisonBonus + (SetEquipped ? m_SetPoisonBonus : 0 ); } }
public override int EnergyResistance{ get{ return BaseEnergyResistance + GetProtOffset() + GetResourceAttrs().ArmorEnergyResist + m_EnergyBonus + (SetEquipped ? m_SetEnergyBonus : 0 ); } }
public virtual int InitMinHits{ get{ return 0; } }
public virtual int InitMaxHits{ get{ return 0; } }
[CommandProperty( AccessLevel.GameMaster )]
public ArmorBodyType BodyPosition
{
get
{
switch ( this.Layer )
{
default:
case Layer.Neck: return ArmorBodyType.Gorget;
case Layer.TwoHanded: return ArmorBodyType.Shield;
case Layer.Gloves: return ArmorBodyType.Gloves;
case Layer.Helm: return ArmorBodyType.Helmet;
case Layer.Arms: return ArmorBodyType.Arms;
case Layer.InnerLegs:
case Layer.OuterLegs:
case Layer.Pants: return ArmorBodyType.Legs;
case Layer.InnerTorso:
case Layer.OuterTorso:
case Layer.Shirt: return ArmorBodyType.Chest;
}
}
}
public void DistributeBonuses( int amount )
{
for ( int i = 0; i < amount; ++i )
{
switch ( Utility.Random( 5 ) )
{
case 0: ++m_PhysicalBonus; break;
case 1: ++m_FireBonus; break;
case 2: ++m_ColdBonus; break;
case 3: ++m_PoisonBonus; break;
case 4: ++m_EnergyBonus; break;
}
}
InvalidateProperties();
}
public CraftAttributeInfo GetResourceAttrs()
{
CraftResourceInfo info = CraftResources.GetInfo( m_Resource );
if ( info == null )
return CraftAttributeInfo.Blank;
return info.AttributeInfo;
}
public int GetProtOffset()
{
switch ( m_Protection )
{
case ArmorProtectionLevel.Guarding: return 1;
case ArmorProtectionLevel.Hardening: return 2;
case ArmorProtectionLevel.Fortification: return 3;
case ArmorProtectionLevel.Invulnerability: return 4;
}
return 0;
}
public void UnscaleDurability()
{
int scale = 100 + GetDurabilityBonus();
m_HitPoints = ((m_HitPoints * 100) + (scale - 1)) / scale;
m_MaxHitPoints = ((m_MaxHitPoints * 100) + (scale - 1)) / scale;
InvalidateProperties();
}
public void ScaleDurability()
{
int scale = 100 + GetDurabilityBonus();
m_HitPoints = ((m_HitPoints * scale) + 99) / 100;
m_MaxHitPoints = ((m_MaxHitPoints * scale) + 99) / 100;
InvalidateProperties();
}
public int GetDurabilityBonus()
{
int bonus = 0;
if ( m_Quality == ArmorQuality.Exceptional )
bonus += 20;
switch ( m_Durability )
{
case ArmorDurabilityLevel.Durable: bonus += 20; break;
case ArmorDurabilityLevel.Substantial: bonus += 50; break;
case ArmorDurabilityLevel.Massive: bonus += 70; break;
case ArmorDurabilityLevel.Fortified: bonus += 100; break;
case ArmorDurabilityLevel.Indestructible: bonus += 120; break;
}
if ( Core.AOS )
{
bonus += m_AosArmorAttributes.DurabilityBonus;
#region Mondain's Legacy
if ( m_Resource == CraftResource.Heartwood )
return bonus;
#endregion
CraftResourceInfo resInfo = CraftResources.GetInfo( m_Resource );
CraftAttributeInfo attrInfo = null;
if ( resInfo != null )
attrInfo = resInfo.AttributeInfo;
if ( attrInfo != null )
bonus += attrInfo.ArmorDurability;
}
return bonus;
}
public bool Scissor( Mobile from, Scissors scissors )
{
if ( !IsChildOf( from.Backpack ) )
{
from.SendLocalizedMessage( 502437 ); // Items you wish to cut must be in your backpack.
return false;
}
if ( Ethics.Ethic.IsImbued( this ) )
{
from.SendLocalizedMessage( 502440 ); // Scissors can not be used on that to produce anything.
return false;
}
CraftSystem system = DefTailoring.CraftSystem;
CraftItem item = system.CraftItems.SearchFor( GetType() );
if ( item != null && item.Ressources.Count == 1 && item.Ressources.GetAt( 0 ).Amount >= 2 )
{
try
{
Item res = (Item)Activator.CreateInstance( CraftResources.GetInfo( m_Resource ).ResourceTypes[0] );
ScissorHelper( from, res, m_PlayerConstructed ? (item.Ressources.GetAt( 0 ).Amount / 2) : 1 );
return true;
}
catch
{
}
}
from.SendLocalizedMessage( 502440 ); // Scissors can not be used on that to produce anything.
return false;
}
private static double[] m_ArmorScalars = { 0.07, 0.07, 0.14, 0.15, 0.22, 0.35 };
public static double[] ArmorScalars
{
get
{
return m_ArmorScalars;
}
set
{
m_ArmorScalars = value;
}
}
public static void ValidateMobile( Mobile m )
{
for ( int i = m.Items.Count - 1; i >= 0; --i )
{
if ( i >= m.Items.Count )
continue;
Item item = m.Items[i];
if ( item is BaseArmor )
{
BaseArmor armor = (BaseArmor)item;
if( armor.RequiredRace != null && m.Race != armor.RequiredRace )
{
if( armor.RequiredRace == Race.Elf )
m.SendLocalizedMessage( 1072203 ); // Only Elves may use this.
else
m.SendMessage( "Only {0} may use this.", armor.RequiredRace.PluralName );
m.AddToBackpack( armor );
}
else if ( !armor.AllowMaleWearer && !m.Female && m.AccessLevel < AccessLevel.GameMaster )
{
if ( armor.AllowFemaleWearer )
m.SendLocalizedMessage( 1010388 ); // Only females can wear this.
else
m.SendMessage( "You may not wear this." );
m.AddToBackpack( armor );
}
else if ( !armor.AllowFemaleWearer && m.Female && m.AccessLevel < AccessLevel.GameMaster )
{
if ( armor.AllowMaleWearer )
m.SendLocalizedMessage( 1063343 ); // Only males can wear this.
else
m.SendMessage( "You may not wear this." );
m.AddToBackpack( armor );
}
}
}
}
public int GetLowerStatReq()
{
if ( !Core.AOS )
return 0;
int v = m_AosArmorAttributes.LowerStatReq;
#region Mondain's Legacy
if ( m_Resource == CraftResource.Heartwood )
return v;
#endregion
CraftResourceInfo info = CraftResources.GetInfo( m_Resource );
if ( info != null )
{
CraftAttributeInfo attrInfo = info.AttributeInfo;
if ( attrInfo != null )
v += attrInfo.ArmorLowerRequirements;
}
if ( v > 100 )
v = 100;
return v;
}
public override void OnAdded( object parent )
{
if ( parent is Mobile )
{
Mobile from = (Mobile)parent;
if ( Core.AOS )
m_AosSkillBonuses.AddTo( from );
#region Mondain's Legacy
if ( IsSetItem )
m_SetEquipped = SetHelper.FullSetPresent( from, SetID, Pieces );
if ( m_SetEquipped )
{
m_LastEquipped = true;
SetHelper.AddSetBonus( from, SetID );
}
#endregion
from.Delta( MobileDelta.Armor ); // Tell them armor rating has changed
}
}
public virtual double ScaleArmorByDurability( double armor )
{
int scale = 100;
if ( m_MaxHitPoints > 0 && m_HitPoints < m_MaxHitPoints )
scale = 50 + ((50 * m_HitPoints) / m_MaxHitPoints);
return ( armor * scale ) / 100;
}
protected void Invalidate()
{
if ( Parent is Mobile )
((Mobile)Parent).Delta( MobileDelta.Armor ); // Tell them armor rating has changed
}
public BaseArmor( Serial serial ) : base( serial )
{
}
private static void SetSaveFlag( ref SaveFlag flags, SaveFlag toSet, bool setIf )
{
if ( setIf )
flags |= toSet;
}
private static bool GetSaveFlag( SaveFlag flags, SaveFlag toGet )
{
return ( (flags & toGet) != 0 );
}
[Flags]
private enum SaveFlag
{
None = 0x00000000,
Attributes = 0x00000001,
ArmorAttributes = 0x00000002,
PhysicalBonus = 0x00000004,
FireBonus = 0x00000008,
ColdBonus = 0x00000010,
PoisonBonus = 0x00000020,
EnergyBonus = 0x00000040,
Identified = 0x00000080,
MaxHitPoints = 0x00000100,
HitPoints = 0x00000200,
Crafter = 0x00000400,
Quality = 0x00000800,
Durability = 0x00001000,
Protection = 0x00002000,
Resource = 0x00004000,
BaseArmor = 0x00008000,
StrBonus = 0x00010000,
DexBonus = 0x00020000,
IntBonus = 0x00040000,
StrReq = 0x00080000,
DexReq = 0x00100000,
IntReq = 0x00200000,
MedAllowance = 0x00400000,
SkillBonuses = 0x00800000,
PlayerConstructed = 0x01000000
}
#region Mondain's Legacy
private static void SetSaveFlag( ref SetFlag flags, SetFlag toSet, bool setIf )
{
if ( setIf )
flags |= toSet;
}
private static bool GetSaveFlag( SetFlag flags, SetFlag toGet )
{
return ( (flags & toGet) != 0 );
}
[Flags]
private enum SetFlag
{
None = 0x00000000,
Attributes = 0x00000001,
ArmorAttributes = 0x00000002,
SkillBonuses = 0x00000004,
PhysicalBonus = 0x00000008,
FireBonus = 0x00000010,
ColdBonus = 0x00000020,
PoisonBonus = 0x00000040,
EnergyBonus = 0x00000080,
SetHue = 0x00000100,
LastEquipped = 0x00000200,
SetEquipped = 0x00000400,
}
#endregion
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 8 ); // version
#region Mondain's Legacy version 8
SetFlag sflags = SetFlag.None;
SetSaveFlag( ref sflags, SetFlag.Attributes, !m_SetAttributes.IsEmpty );
SetSaveFlag( ref sflags, SetFlag.ArmorAttributes, !m_SetArmorAttributes.IsEmpty );
SetSaveFlag( ref sflags, SetFlag.SkillBonuses, !m_SetSkillBonuses.IsEmpty );
SetSaveFlag( ref sflags, SetFlag.PhysicalBonus, m_SetPhysicalBonus != 0 );
SetSaveFlag( ref sflags, SetFlag.FireBonus, m_SetFireBonus != 0 );
SetSaveFlag( ref sflags, SetFlag.ColdBonus, m_SetColdBonus != 0 );
SetSaveFlag( ref sflags, SetFlag.PoisonBonus, m_SetPoisonBonus != 0 );
SetSaveFlag( ref sflags, SetFlag.EnergyBonus, m_SetEnergyBonus != 0 );
SetSaveFlag( ref sflags, SetFlag.SetHue, m_SetHue != 0 );
SetSaveFlag( ref sflags, SetFlag.LastEquipped, true );
SetSaveFlag( ref sflags, SetFlag.SetEquipped, true );
writer.WriteEncodedInt( (int) sflags );
if ( GetSaveFlag( sflags, SetFlag.Attributes ) )
m_SetAttributes.Serialize( writer );
if ( GetSaveFlag( sflags, SetFlag.ArmorAttributes ) )
m_SetArmorAttributes.Serialize( writer );
if ( GetSaveFlag( sflags, SetFlag.SkillBonuses ) )
m_SetSkillBonuses.Serialize( writer );
if ( GetSaveFlag( sflags, SetFlag.PhysicalBonus ) )
writer.WriteEncodedInt( (int) m_SetPhysicalBonus );
if ( GetSaveFlag( sflags, SetFlag.FireBonus ) )
writer.WriteEncodedInt( (int) m_SetFireBonus );
if ( GetSaveFlag( sflags, SetFlag.ColdBonus ) )
writer.WriteEncodedInt( (int) m_SetColdBonus );
if ( GetSaveFlag( sflags, SetFlag.PoisonBonus ) )
writer.WriteEncodedInt( (int) m_SetPoisonBonus );
if ( GetSaveFlag( sflags, SetFlag.EnergyBonus ) )
writer.WriteEncodedInt( (int) m_SetEnergyBonus );
if ( GetSaveFlag( sflags, SetFlag.SetHue ) )
writer.WriteEncodedInt( (int) m_SetHue );
if ( GetSaveFlag( sflags, SetFlag.LastEquipped ) )
writer.Write( (bool) m_LastEquipped );
if ( GetSaveFlag( sflags, SetFlag.SetEquipped ) )
writer.Write( (bool) m_SetEquipped );
#endregion
SaveFlag flags = SaveFlag.None;
SetSaveFlag( ref flags, SaveFlag.Attributes, !m_AosAttributes.IsEmpty );
SetSaveFlag( ref flags, SaveFlag.ArmorAttributes, !m_AosArmorAttributes.IsEmpty );
SetSaveFlag( ref flags, SaveFlag.PhysicalBonus, m_PhysicalBonus != 0 );
SetSaveFlag( ref flags, SaveFlag.FireBonus, m_FireBonus != 0 );
SetSaveFlag( ref flags, SaveFlag.ColdBonus, m_ColdBonus != 0 );
SetSaveFlag( ref flags, SaveFlag.PoisonBonus, m_PoisonBonus != 0 );
SetSaveFlag( ref flags, SaveFlag.EnergyBonus, m_EnergyBonus != 0 );
SetSaveFlag( ref flags, SaveFlag.Identified, m_Identified != false );
SetSaveFlag( ref flags, SaveFlag.MaxHitPoints, m_MaxHitPoints != 0 );
SetSaveFlag( ref flags, SaveFlag.HitPoints, m_HitPoints != 0 );
SetSaveFlag( ref flags, SaveFlag.Crafter, m_Crafter != null );
SetSaveFlag( ref flags, SaveFlag.Quality, m_Quality != ArmorQuality.Regular );
SetSaveFlag( ref flags, SaveFlag.Durability, m_Durability != ArmorDurabilityLevel.Regular );
SetSaveFlag( ref flags, SaveFlag.Protection, m_Protection != ArmorProtectionLevel.Regular );
SetSaveFlag( ref flags, SaveFlag.Resource, m_Resource != DefaultResource );
SetSaveFlag( ref flags, SaveFlag.BaseArmor, m_ArmorBase != -1 );
SetSaveFlag( ref flags, SaveFlag.StrBonus, m_StrBonus != -1 );
SetSaveFlag( ref flags, SaveFlag.DexBonus, m_DexBonus != -1 );
SetSaveFlag( ref flags, SaveFlag.IntBonus, m_IntBonus != -1 );
SetSaveFlag( ref flags, SaveFlag.StrReq, m_StrReq != -1 );
SetSaveFlag( ref flags, SaveFlag.DexReq, m_DexReq != -1 );
SetSaveFlag( ref flags, SaveFlag.IntReq, m_IntReq != -1 );
SetSaveFlag( ref flags, SaveFlag.MedAllowance, m_Meditate != (AMA)(-1) );
SetSaveFlag( ref flags, SaveFlag.SkillBonuses, !m_AosSkillBonuses.IsEmpty );
SetSaveFlag( ref flags, SaveFlag.PlayerConstructed, m_PlayerConstructed != false );
writer.WriteEncodedInt( (int) flags );
if ( GetSaveFlag( flags, SaveFlag.Attributes ) )
m_AosAttributes.Serialize( writer );
if ( GetSaveFlag( flags, SaveFlag.ArmorAttributes ) )
m_AosArmorAttributes.Serialize( writer );
if ( GetSaveFlag( flags, SaveFlag.PhysicalBonus ) )
writer.WriteEncodedInt( (int) m_PhysicalBonus );
if ( GetSaveFlag( flags, SaveFlag.FireBonus ) )
writer.WriteEncodedInt( (int) m_FireBonus );
if ( GetSaveFlag( flags, SaveFlag.ColdBonus ) )
writer.WriteEncodedInt( (int) m_ColdBonus );
if ( GetSaveFlag( flags, SaveFlag.PoisonBonus ) )
writer.WriteEncodedInt( (int) m_PoisonBonus );
if ( GetSaveFlag( flags, SaveFlag.EnergyBonus ) )
writer.WriteEncodedInt( (int) m_EnergyBonus );
if ( GetSaveFlag( flags, SaveFlag.MaxHitPoints ) )
writer.WriteEncodedInt( (int) m_MaxHitPoints );
if ( GetSaveFlag( flags, SaveFlag.HitPoints ) )
writer.WriteEncodedInt( (int) m_HitPoints );
if ( GetSaveFlag( flags, SaveFlag.Crafter ) )
writer.Write( (Mobile) m_Crafter );
if ( GetSaveFlag( flags, SaveFlag.Quality ) )
writer.WriteEncodedInt( (int) m_Quality );
if ( GetSaveFlag( flags, SaveFlag.Durability ) )
writer.WriteEncodedInt( (int) m_Durability );
if ( GetSaveFlag( flags, SaveFlag.Protection ) )
writer.WriteEncodedInt( (int) m_Protection );
if ( GetSaveFlag( flags, SaveFlag.Resource ) )
writer.WriteEncodedInt( (int) m_Resource );
if ( GetSaveFlag( flags, SaveFlag.BaseArmor ) )
writer.WriteEncodedInt( (int) m_ArmorBase );
if ( GetSaveFlag( flags, SaveFlag.StrBonus ) )
writer.WriteEncodedInt( (int) m_StrBonus );
if ( GetSaveFlag( flags, SaveFlag.DexBonus ) )
writer.WriteEncodedInt( (int) m_DexBonus );
if ( GetSaveFlag( flags, SaveFlag.IntBonus ) )
writer.WriteEncodedInt( (int) m_IntBonus );
if ( GetSaveFlag( flags, SaveFlag.StrReq ) )
writer.WriteEncodedInt( (int) m_StrReq );
if ( GetSaveFlag( flags, SaveFlag.DexReq ) )
writer.WriteEncodedInt( (int) m_DexReq );
if ( GetSaveFlag( flags, SaveFlag.IntReq ) )
writer.WriteEncodedInt( (int) m_IntReq );
if ( GetSaveFlag( flags, SaveFlag.MedAllowance ) )
writer.WriteEncodedInt( (int) m_Meditate );
if ( GetSaveFlag( flags, SaveFlag.SkillBonuses ) )
m_AosSkillBonuses.Serialize( writer );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch ( version )
{
#region Mondain's Legacy
case 8:
SetFlag sflags = (SetFlag) reader.ReadEncodedInt();
if ( GetSaveFlag( sflags, SetFlag.Attributes ) )
m_SetAttributes = new AosAttributes( this, reader );
else
m_SetAttributes = new AosAttributes( this );
if ( GetSaveFlag( sflags, SetFlag.ArmorAttributes ) )
m_SetArmorAttributes = new AosArmorAttributes( this, reader );
else
m_SetArmorAttributes = new AosArmorAttributes( this );
if ( GetSaveFlag( sflags, SetFlag.SkillBonuses ) )
m_SetSkillBonuses = new AosSkillBonuses( this, reader );
else
m_SetSkillBonuses = new AosSkillBonuses( this );
if ( GetSaveFlag( sflags, SetFlag.PhysicalBonus ) )
m_SetPhysicalBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( sflags, SetFlag.FireBonus ) )
m_SetFireBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( sflags, SetFlag.ColdBonus ) )
m_SetColdBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( sflags, SetFlag.PoisonBonus ) )
m_SetPoisonBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( sflags, SetFlag.EnergyBonus ) )
m_SetEnergyBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( sflags, SetFlag.SetHue ) )
m_SetHue = reader.ReadEncodedInt();
if ( GetSaveFlag( sflags, SetFlag.LastEquipped ) )
m_LastEquipped = reader.ReadBool();
if ( GetSaveFlag( sflags, SetFlag.SetEquipped ) )
m_SetEquipped = reader.ReadBool();
goto case 7;
#endregion
case 7:
case 6:
case 5:
{
SaveFlag flags = (SaveFlag)reader.ReadEncodedInt();
if ( GetSaveFlag( flags, SaveFlag.Attributes ) )
m_AosAttributes = new AosAttributes( this, reader );
else
m_AosAttributes = new AosAttributes( this );
if ( GetSaveFlag( flags, SaveFlag.ArmorAttributes ) )
m_AosArmorAttributes = new AosArmorAttributes( this, reader );
else
m_AosArmorAttributes = new AosArmorAttributes( this );
if ( GetSaveFlag( flags, SaveFlag.PhysicalBonus ) )
m_PhysicalBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( flags, SaveFlag.FireBonus ) )
m_FireBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( flags, SaveFlag.ColdBonus ) )
m_ColdBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( flags, SaveFlag.PoisonBonus ) )
m_PoisonBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( flags, SaveFlag.EnergyBonus ) )
m_EnergyBonus = reader.ReadEncodedInt();
if ( GetSaveFlag( flags, SaveFlag.Identified ) )
m_Identified = ( version >= 7 || reader.ReadBool() );
if ( GetSaveFlag( flags, SaveFlag.MaxHitPoints ) )
m_MaxHitPoints = reader.ReadEncodedInt();
if ( GetSaveFlag( flags, SaveFlag.HitPoints ) )
m_HitPoints = reader.ReadEncodedInt();
if ( GetSaveFlag( flags, SaveFlag.Crafter ) )
m_Crafter = reader.ReadMobile();
if ( GetSaveFlag( flags, SaveFlag.Quality ) )
m_Quality = (ArmorQuality)reader.ReadEncodedInt();
else
m_Quality = ArmorQuality.Regular;
if ( version == 5 && m_Quality == ArmorQuality.Low )
m_Quality = ArmorQuality.Regular;
if ( GetSaveFlag( flags, SaveFlag.Durability ) )
{
m_Durability = (ArmorDurabilityLevel)reader.ReadEncodedInt();
if ( m_Durability > ArmorDurabilityLevel.Indestructible )
m_Durability = ArmorDurabilityLevel.Durable;
}
if ( GetSaveFlag( flags, SaveFlag.Protection ) )
{
m_Protection = (ArmorProtectionLevel)reader.ReadEncodedInt();
if ( m_Protection > ArmorProtectionLevel.Invulnerability )
m_Protection = ArmorProtectionLevel.Defense;
}
if ( GetSaveFlag( flags, SaveFlag.Resource ) )
m_Resource = (CraftResource)reader.ReadEncodedInt();
else
m_Resource = DefaultResource;
if ( m_Resource == CraftResource.None )
m_Resource = DefaultResource;
if ( GetSaveFlag( flags, SaveFlag.BaseArmor ) )
m_ArmorBase = reader.ReadEncodedInt();
else
m_ArmorBase = -1;
if ( GetSaveFlag( flags, SaveFlag.StrBonus ) )
m_StrBonus = reader.ReadEncodedInt();
else
m_StrBonus = -1;
if ( GetSaveFlag( flags, SaveFlag.DexBonus ) )
m_DexBonus = reader.ReadEncodedInt();
else
m_DexBonus = -1;
if ( GetSaveFlag( flags, SaveFlag.IntBonus ) )
m_IntBonus = reader.ReadEncodedInt();
else
m_IntBonus = -1;
if ( GetSaveFlag( flags, SaveFlag.StrReq ) )
m_StrReq = reader.ReadEncodedInt();
else
m_StrReq = -1;
if ( GetSaveFlag( flags, SaveFlag.DexReq ) )
m_DexReq = reader.ReadEncodedInt();
else
m_DexReq = -1;
if ( GetSaveFlag( flags, SaveFlag.IntReq ) )
m_IntReq = reader.ReadEncodedInt();
else
m_IntReq = -1;
if ( GetSaveFlag( flags, SaveFlag.MedAllowance ) )
m_Meditate = (AMA)reader.ReadEncodedInt();
else
m_Meditate = (AMA)(-1);
if ( GetSaveFlag( flags, SaveFlag.SkillBonuses ) )
m_AosSkillBonuses = new AosSkillBonuses( this, reader );
if ( GetSaveFlag( flags, SaveFlag.PlayerConstructed ) )
m_PlayerConstructed = true;
break;
}
case 4:
{
m_AosAttributes = new AosAttributes( this, reader );
m_AosArmorAttributes = new AosArmorAttributes( this, reader );
goto case 3;
}
case 3:
{
m_PhysicalBonus = reader.ReadInt();
m_FireBonus = reader.ReadInt();
m_ColdBonus = reader.ReadInt();
m_PoisonBonus = reader.ReadInt();
m_EnergyBonus = reader.ReadInt();
goto case 2;
}
case 2:
case 1:
{
m_Identified = reader.ReadBool();
goto case 0;
}
case 0:
{
m_ArmorBase = reader.ReadInt();
m_MaxHitPoints = reader.ReadInt();
m_HitPoints = reader.ReadInt();
m_Crafter = reader.ReadMobile();
m_Quality = (ArmorQuality)reader.ReadInt();
m_Durability = (ArmorDurabilityLevel)reader.ReadInt();
m_Protection = (ArmorProtectionLevel)reader.ReadInt();
AMT mat = (AMT)reader.ReadInt();
if ( m_ArmorBase == RevertArmorBase )
m_ArmorBase = -1;
/*m_BodyPos = (ArmorBodyType)*/reader.ReadInt();
if ( version < 4 )
{
m_AosAttributes = new AosAttributes( this );
m_AosArmorAttributes = new AosArmorAttributes( this );
}
if ( version < 3 && m_Quality == ArmorQuality.Exceptional )
DistributeBonuses( 6 );
if ( version >= 2 )
{
m_Resource = (CraftResource)reader.ReadInt();
}
else
{
OreInfo info;
switch ( reader.ReadInt() )
{
default:
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.Silver; break;
case 10: info = OreInfo.Platinum; break;
case 11: info = OreInfo.Mythril; break;
case 12: info = OreInfo.Obsidian; break;
case 13: info = OreInfo.Jade; break;
case 14: info = OreInfo.Moonstone; break;
case 15: info = OreInfo.Sunstone; break;
case 16: info = OreInfo.Bloodstone; break;
}
m_Resource = CraftResources.GetFromOreInfo( info, mat );
}
m_StrBonus = reader.ReadInt();
m_DexBonus = reader.ReadInt();
m_IntBonus = reader.ReadInt();
m_StrReq = reader.ReadInt();
m_DexReq = reader.ReadInt();
m_IntReq = reader.ReadInt();
if ( m_StrBonus == OldStrBonus )
m_StrBonus = -1;
if ( m_DexBonus == OldDexBonus )
m_DexBonus = -1;
if ( m_IntBonus == OldIntBonus )
m_IntBonus = -1;
if ( m_StrReq == OldStrReq )
m_StrReq = -1;
if ( m_DexReq == OldDexReq )
m_DexReq = -1;
if ( m_IntReq == OldIntReq )
m_IntReq = -1;
m_Meditate = (AMA)reader.ReadInt();
if ( m_Meditate == OldMedAllowance )
m_Meditate = (AMA)(-1);
if ( m_Resource == CraftResource.None )
{
if ( mat == ArmorMaterialType.Studded || mat == ArmorMaterialType.Leather )
m_Resource = CraftResource.RegularLeather;
else if ( mat == ArmorMaterialType.Spined )
m_Resource = CraftResource.SpinedLeather;
else if ( mat == ArmorMaterialType.Horned )
m_Resource = CraftResource.HornedLeather;
else if ( mat == ArmorMaterialType.Barbed )
m_Resource = CraftResource.BarbedLeather;
else if ( mat == ArmorMaterialType.DragonL )
m_Resource = CraftResource.DragonLeather;
else if ( mat == ArmorMaterialType.Daemon )
m_Resource = CraftResource.DaemonLeather;
else
m_Resource = CraftResource.Iron;
}
if ( m_MaxHitPoints == 0 && m_HitPoints == 0 )
m_HitPoints = m_MaxHitPoints = Utility.RandomMinMax( InitMinHits, InitMaxHits );
break;
}
}
#region Mondain's Legacy
if ( m_SetAttributes == null )
m_SetAttributes = new AosAttributes( this );
if ( m_SetArmorAttributes == null )
m_SetArmorAttributes = new AosArmorAttributes( this );
if ( m_SetSkillBonuses == null )
m_SetSkillBonuses = new AosSkillBonuses( this );
#endregion
if ( m_AosSkillBonuses == null )
m_AosSkillBonuses = new AosSkillBonuses( this );
if ( Core.AOS && Parent is Mobile )
m_AosSkillBonuses.AddTo( (Mobile)Parent );
int strBonus = ComputeStatBonus( StatType.Str );
int dexBonus = ComputeStatBonus( StatType.Dex );
int intBonus = ComputeStatBonus( StatType.Int );
if ( Parent is Mobile && (strBonus != 0 || dexBonus != 0 || intBonus != 0) )
{
Mobile m = (Mobile)Parent;
string modName = Serial.ToString();
if ( strBonus != 0 )
m.AddStatMod( new StatMod( StatType.Str, modName + "Str", strBonus, TimeSpan.Zero ) );
if ( dexBonus != 0 )
m.AddStatMod( new StatMod( StatType.Dex, modName + "Dex", dexBonus, TimeSpan.Zero ) );
if ( intBonus != 0 )
m.AddStatMod( new StatMod( StatType.Int, modName + "Int", intBonus, TimeSpan.Zero ) );
}
if ( Parent is Mobile )
((Mobile)Parent).CheckStatTimers();
if ( version < 7 )
m_PlayerConstructed = true; // we don't know, so, assume it's crafted
}
public virtual CraftResource DefaultResource{ get{ return CraftResource.Iron; } }
public BaseArmor( int itemID ) : base( itemID )
{
m_Quality = ArmorQuality.Regular;
m_Durability = ArmorDurabilityLevel.Regular;
m_Crafter = null;
m_Resource = DefaultResource;
Hue = CraftResources.GetHue( m_Resource );
m_HitPoints = m_MaxHitPoints = Utility.RandomMinMax( InitMinHits, InitMaxHits );
this.Layer = (Layer)ItemData.Quality;
m_AosAttributes = new AosAttributes( this );
m_AosArmorAttributes = new AosArmorAttributes( this );
m_AosSkillBonuses = new AosSkillBonuses( this );
#region Mondain's Legacy
m_SetAttributes = new AosAttributes( this );
m_SetArmorAttributes = new AosArmorAttributes( this );
m_SetSkillBonuses = new AosSkillBonuses( this );
m_LastEquipped = false;
#endregion
}
public override bool AllowSecureTrade( Mobile from, Mobile to, Mobile newOwner, bool accepted )
{
if ( !Ethics.Ethic.CheckTrade( from, to, newOwner, this ) )
return false;
return base.AllowSecureTrade( from, to, newOwner, accepted );
}
public virtual Race RequiredRace { get { return null; } }
public override bool CanEquip( Mobile from )
{
if( !Ethics.Ethic.CheckEquip( from, this ) )
return false;
if( from.AccessLevel < AccessLevel.GameMaster )
{
if( RequiredRace != null && from.Race != RequiredRace )
{
if( RequiredRace == Race.Elf )
from.SendLocalizedMessage( 1072203 ); // Only Elves may use this.
else
from.SendMessage( "Only {0} may use this.", RequiredRace.PluralName );
return false;
}
else if( !AllowMaleWearer && !from.Female )
{
if( AllowFemaleWearer )
from.SendLocalizedMessage( 1010388 ); // Only females can wear this.
else
from.SendMessage( "You may not wear this." );
return false;
}
else if( !AllowFemaleWearer && from.Female )
{
if( AllowMaleWearer )
from.SendLocalizedMessage( 1063343 ); // Only males can wear this.
else
from.SendMessage( "You may not wear this." );
return false;
}
else
{
int strBonus = ComputeStatBonus( StatType.Str ), strReq = ComputeStatReq( StatType.Str );
int dexBonus = ComputeStatBonus( StatType.Dex ), dexReq = ComputeStatReq( StatType.Dex );
int intBonus = ComputeStatBonus( StatType.Int ), intReq = ComputeStatReq( StatType.Int );
if( from.Dex < dexReq || (from.Dex + dexBonus) < 1 )
{
from.SendLocalizedMessage( 502077 ); // You do not have enough dexterity to equip this item.
return false;
}
else if( from.Str < strReq || (from.Str + strBonus) < 1 )
{
from.SendLocalizedMessage( 500213 ); // You are not strong enough to equip that.
return false;
}
else if( from.Int < intReq || (from.Int + intBonus) < 1 )
{
from.SendMessage( "You are not smart enough to equip that." );
return false;
}
}
}
return base.CanEquip( from );
}
public override bool CheckPropertyConfliction( Mobile m )
{
if ( base.CheckPropertyConfliction( m ) )
return true;
if ( Layer == Layer.Pants )
return ( m.FindItemOnLayer( Layer.InnerLegs ) != null );
if ( Layer == Layer.Shirt )
return ( m.FindItemOnLayer( Layer.InnerTorso ) != null );
return false;
}
public override bool OnEquip( Mobile from )
{
from.CheckStatTimers();
int strBonus = ComputeStatBonus( StatType.Str );
int dexBonus = ComputeStatBonus( StatType.Dex );
int intBonus = ComputeStatBonus( StatType.Int );
if ( strBonus != 0 || dexBonus != 0 || intBonus != 0 )
{
string modName = this.Serial.ToString();
if ( strBonus != 0 )
from.AddStatMod( new StatMod( StatType.Str, modName + "Str", strBonus, TimeSpan.Zero ) );
if ( dexBonus != 0 )
from.AddStatMod( new StatMod( StatType.Dex, modName + "Dex", dexBonus, TimeSpan.Zero ) );
if ( intBonus != 0 )
from.AddStatMod( new StatMod( StatType.Int, modName + "Int", intBonus, TimeSpan.Zero ) );
}
return base.OnEquip( from );
}
public override void OnRemoved( object parent )
{
if ( parent is Mobile )
{
Mobile m = (Mobile)parent;
string modName = this.Serial.ToString();
m.RemoveStatMod( modName + "Str" );
m.RemoveStatMod( modName + "Dex" );
m.RemoveStatMod( modName + "Int" );
if ( Core.AOS )
m_AosSkillBonuses.Remove();
((Mobile)parent).Delta( MobileDelta.Armor ); // Tell them armor rating has changed
m.CheckStatTimers();
#region Set Armor
if ( IsSetItem ? m_SetEquipped : false )
SetHelper.RemoveSetBonus( m, SetID, this );
#endregion
}
base.OnRemoved( parent );
InvalidateProperties();
}
public virtual int OnHit( BaseWeapon weapon, int damageTaken )
{
double HalfAr = ArmorRating / 2.0;
int Absorbed = (int)(HalfAr + HalfAr*Utility.RandomDouble());
damageTaken -= Absorbed;
if ( damageTaken < 0 )
damageTaken = 0;
if ( Absorbed < 2 )
Absorbed = 2;
if ( 25 > Utility.Random( 100 ) ) // 25% chance to lower durability
{
if ( Core.AOS && m_AosArmorAttributes.SelfRepair > Utility.Random( 10 ) )
{
HitPoints += 2;
}
else
{
int wear;
if ( weapon.Type == WeaponType.Bashing )
wear = Absorbed / 2;
else
wear = Utility.Random( 2 );
if ( wear > 0 && m_MaxHitPoints > 0 )
{
if ( m_HitPoints >= wear )
{
HitPoints -= wear;
wear = 0;
}
else
{
wear -= HitPoints;
HitPoints = 0;
}
if ( wear > 0 )
{
if ( m_MaxHitPoints > wear )
{
MaxHitPoints -= wear;
if ( Parent is Mobile )
((Mobile)Parent).LocalOverheadMessage( MessageType.Regular, 0x3B2, 1061121 ); // Your equipment is severely damaged.
}
else
{
Delete();
}
}
}
}
}
return damageTaken;
}
private string GetNameString()
{
string name = this.Name;
if ( name == null )
name = String.Format( "#{0}", LabelNumber );
return name;
}
[Hue, CommandProperty( AccessLevel.GameMaster )]
public override int Hue
{
get{ return base.Hue; }
set{ base.Hue = value; InvalidateProperties(); }
}
public override void AddNameProperty( ObjectPropertyList list )
{
string oreType;
if ( Hue == 0 )
{
oreType = "";
}
else
{
switch ( m_Resource )
{
case CraftResource.DullCopper: oreType = "dull copper"; break; // dull copper
case CraftResource.ShadowIron: oreType = "shadow iron"; break; // shadow iron
case CraftResource.Copper: oreType = "copper"; break; // copper
case CraftResource.Bronze: oreType = "bronze"; break; // bronze
case CraftResource.Gold: oreType = "gold"; break; // golden
case CraftResource.Agapite: oreType = "agapite"; break; // agapite
case CraftResource.Verite: oreType = "verite"; break; // verite
case CraftResource.Valorite: oreType = "valorite"; break; // valorite
case CraftResource.Silver: oreType = "silver"; break; // silver
case CraftResource.Platinum: oreType = "platinum"; break; // platinum
case CraftResource.Mythril: oreType = "mythril"; break; // mythril
case CraftResource.Obsidian: oreType = "obsidian"; break; // obsidian
case CraftResource.Jade: oreType = "jade"; break; // jade
case CraftResource.Moonstone: oreType = "moonstone"; break; // moonstone
case CraftResource.Sunstone: oreType = "sunstone"; break; // sunstone
case CraftResource.Bloodstone: oreType = "bloodstone"; break; // bloodstone
case CraftResource.SpinedLeather: oreType = "spined"; break; // spined
case CraftResource.HornedLeather: oreType = "horned"; break; // horned
case CraftResource.BarbedLeather: oreType = "barbed"; break; // barbed
case CraftResource.DragonLeather: oreType = "dragon"; break; // dragon
case CraftResource.DaemonLeather: oreType = "daemon"; break; // daemon
case CraftResource.RedScales: oreType = "red"; break; // red
case CraftResource.YellowScales: oreType = "yellow"; break; // yellow
case CraftResource.BlackScales: oreType = "black"; break; // black
case CraftResource.GreenScales: oreType = "green"; break; // green
case CraftResource.WhiteScales: oreType = "white"; break; // white
case CraftResource.BlueScales: oreType = "blue"; break; // blue
#region Mondain's Legacy
case CraftResource.Oak: oreType = "oak"; break; // oak
case CraftResource.Ash: oreType = "ash"; break; // ash
case CraftResource.Yew: oreType = "yew"; break; // yew
case CraftResource.Heartwood: oreType = "heartwood"; break; // heartwood
case CraftResource.Bloodwood: oreType = "bloodwood"; break; // bloodwood
case CraftResource.Frostwood: oreType = "frostwood"; break; // frostwood
#endregion
default: oreType = ""; break;
}
if ( m_Quality == ArmorQuality.Exceptional )
{
if ( oreType = 0 )
list.Add( 1053100, "#{0}t{1}", oreType, GetNameString() ); // exceptional ~1_oretype~ ~2_armortype~
else
list.Add( 1050040, GetNameString() ); // exceptional ~1_ITEMNAME~
}
else
{
if ( oreType = 0 )
list.Add( 1053099, "#{0}t{1}", oreType, GetNameString() ); // ~1_oretype~ ~2_armortype~
else if ( Name == null )
list.Add( LabelNumber );
else
list.Add( Name );
}
}
}
public override bool AllowEquipedCast( Mobile from )
{
if ( base.AllowEquipedCast( from ) )
return true;
return ( m_AosAttributes.SpellChanneling != 0 );
}
public virtual int GetLuckBonus()
{
#region Mondain's Legacy
if ( m_Resource == CraftResource.Heartwood )
return 0;
#endregion
CraftResourceInfo resInfo = CraftResources.GetInfo( m_Resource );
if ( resInfo == null )
return 0;
CraftAttributeInfo attrInfo = resInfo.AttributeInfo;
if ( attrInfo == null )
return 0;
return attrInfo.ArmorLuck;
}
public override void GetProperties( ObjectPropertyList list )
{
base.GetProperties( list );
if ( m_Crafter != null )
list.Add( 1050043, m_Crafter.Name ); // crafted by ~1_NAME~
#region Factions
if ( m_FactionState != null )
list.Add( 1041350 ); // faction item
#endregion
#region Mondain's Legacy
if ( IsSetItem )
{
if ( MixedSet )
list.Add( 1073491, Pieces.ToString() ); // Part of a Weapon/Armor Set (~1_val~ pieces)
else
list.Add( 1072376, Pieces.ToString() ); // Part of an Armor Set (~1_val~ pieces)
if ( m_SetEquipped )
{
if ( MixedSet )
list.Add( 1073492 ); // Full Weapon/Armor Set Present
else
list.Add( 1072377 ); // Full Armor Set Present
GetSetProperties( list );
}
}
#endregion
if( RequiredRace == Race.Elf )
list.Add( 1075086 ); // Elves Only
m_AosSkillBonuses.GetProperties( list );
int prop;
if ( (prop = ArtifactRarity) > 0 )
list.Add( 1061078, prop.ToString() ); // artifact rarity ~1_val~
if ( (prop = m_AosAttributes.WeaponDamage) != 0 )
list.Add( 1060401, prop.ToString() ); // damage increase ~1_val~%
if ( (prop = m_AosAttributes.DefendChance) != 0 )
list.Add( 1060408, prop.ToString() ); // defense chance increase ~1_val~%
if ( (prop = m_AosAttributes.BonusDex) != 0 )
list.Add( 1060409, prop.ToString() ); // dexterity bonus ~1_val~
if ( (prop = m_AosAttributes.EnhancePotions) != 0 )
list.Add( 1060411, prop.ToString() ); // enhance potions ~1_val~%
if ( (prop = m_AosAttributes.CastRecovery) != 0 )
list.Add( 1060412, prop.ToString() ); // faster cast recovery ~1_val~
if ( (prop = m_AosAttributes.CastSpeed) != 0 )
list.Add( 1060413, prop.ToString() ); // faster casting ~1_val~
if ( (prop = m_AosAttributes.AttackChance) != 0 )
list.Add( 1060415, prop.ToString() ); // hit chance increase ~1_val~%
if ( (prop = m_AosAttributes.BonusHits) != 0 )
list.Add( 1060431, prop.ToString() ); // hit point increase ~1_val~
if ( (prop = m_AosAttributes.BonusInt) != 0 )
list.Add( 1060432, prop.ToString() ); // intelligence bonus ~1_val~
if ( (prop = m_AosAttributes.LowerManaCost) != 0 )
list.Add( 1060433, prop.ToString() ); // lower mana cost ~1_val~%
if ( (prop = m_AosAttributes.LowerRegCost) != 0 )
list.Add( 1060434, prop.ToString() ); // lower reagent cost ~1_val~%
if ( (prop = GetLowerStatReq()) != 0 )
list.Add( 1060435, prop.ToString() ); // lower requirements ~1_val~%
if ( (prop = (GetLuckBonus() + m_AosAttributes.Luck)) != 0 )
list.Add( 1060436, prop.ToString() ); // luck ~1_val~
if ( (prop = m_AosArmorAttributes.MageArmor) != 0 )
list.Add( 1060437 ); // mage armor
if ( (prop = m_AosAttributes.BonusMana) != 0 )
list.Add( 1060439, prop.ToString() ); // mana increase ~1_val~
if ( (prop = m_AosAttributes.RegenMana) != 0 )
list.Add( 1060440, prop.ToString() ); // mana regeneration ~1_val~
if ( (prop = m_AosAttributes.NightSight) != 0 )
list.Add( 1060441 ); // night sight
if ( (prop = m_AosAttributes.ReflectPhysical) != 0 )
list.Add( 1060442, prop.ToString() ); // reflect physical damage ~1_val~%
if ( (prop = m_AosAttributes.RegenStam) != 0 )
list.Add( 1060443, prop.ToString() ); // stamina regeneration ~1_val~
if ( (prop = m_AosAttributes.RegenHits) != 0 )
list.Add( 1060444, prop.ToString() ); // hit point regeneration ~1_val~
if ( (prop = m_AosArmorAttributes.SelfRepair) != 0 )
list.Add( 1060450, prop.ToString() ); // self repair ~1_val~
if ( (prop = m_AosAttributes.SpellChanneling) != 0 )
list.Add( 1060482 ); // spell channeling
if ( (prop = m_AosAttributes.SpellDamage) != 0 )
list.Add( 1060483, prop.ToString() ); // spell damage increase ~1_val~%
if ( (prop = m_AosAttributes.BonusStam) != 0 )
list.Add( 1060484, prop.ToString() ); // stamina increase ~1_val~
if ( (prop = m_AosAttributes.BonusStr) != 0 )
list.Add( 1060485, prop.ToString() ); // strength bonus ~1_val~
if ( (prop = m_AosAttributes.WeaponSpeed) != 0 )
list.Add( 1060486, prop.ToString() ); // swing speed increase ~1_val~%
base.AddResistanceProperties( list );
if ( (prop = GetDurabilityBonus()) > 0 )
list.Add( 1060410, prop.ToString() ); // durability ~1_val~%
if ( (prop = ComputeStatReq( StatType.Str )) > 0 )
list.Add( 1061170, prop.ToString() ); // strength requirement ~1_val~
if ( m_HitPoints >= 0 && m_MaxHitPoints > 0 )
list.Add( 1060639, "{0}t{1}", m_HitPoints, m_MaxHitPoints ); // durability ~1_val~ / ~2_val~
#region Mondain's Legacy
if ( IsSetItem && !m_SetEquipped )
{
list.Add( 1072378 ); // <br>Only when full set is present:
GetSetProperties( list );
}
#endregion
}
public override void OnSingleClick( Mobile from )
{
List<EquipInfoAttribute> attrs = new List<EquipInfoAttribute>();
if ( DisplayLootType )
{
if ( LootType == LootType.Blessed )
attrs.Add( new EquipInfoAttribute( 1038021 ) ); // blessed
else if ( LootType == LootType.Cursed )
attrs.Add( new EquipInfoAttribute( 1049643 ) ); // cursed
}
#region Factions
if ( m_FactionState != null )
attrs.Add( new EquipInfoAttribute( 1041350 ) ); // faction item
#endregion
if ( m_Quality == ArmorQuality.Exceptional )
attrs.Add( new EquipInfoAttribute( 1018305 - (int)m_Quality ) );
if ( m_Identified || from.AccessLevel >= AccessLevel.GameMaster)
{
if ( m_Durability != ArmorDurabilityLevel.Regular )
attrs.Add( new EquipInfoAttribute( 1038000 + (int)m_Durability ) );
if ( m_Protection > ArmorProtectionLevel.Regular && m_Protection <= ArmorProtectionLevel.Invulnerability )
attrs.Add( new EquipInfoAttribute( 1038005 + (int)m_Protection ) );
}
else if ( m_Durability != ArmorDurabilityLevel.Regular || (m_Protection > ArmorProtectionLevel.Regular && m_Protection <= ArmorProtectionLevel.Invulnerability) )
attrs.Add( new EquipInfoAttribute( 1038000 ) ); // Unidentified
int number;
if ( Name == null )
{
number = LabelNumber;
}
else
{
this.LabelTo( from, Name );
number = 1041000;
}
if ( attrs.Count == 0 && Crafter == null && Name != null )
return;
EquipmentInfo eqInfo = new EquipmentInfo( number, m_Crafter, false, attrs.ToArray() );
from.Send( new DisplayEquipmentInfo( this, eqInfo ) );
}
#region ICraftable Members
public virtual int OnCraft( int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CraftItem craftItem, int resHue )
{
Quality = (ArmorQuality)quality;
if ( makersMark )
Crafter = from;
Type resourceType = typeRes;
if ( resourceType == null )
resourceType = craftItem.Ressources.GetAt( 0 ).ItemType;
Resource = CraftResources.GetFromType( resourceType );
PlayerConstructed = true;
CraftContext context = craftSystem.GetContext( from );
if ( context != null && context.DoNotColor )
Hue = 0;
if( Quality == ArmorQuality.Exceptional )
{
DistributeBonuses( (tool is BaseRunicTool ? 6 : Core.SE ? 15 : 14) ); // Not sure since when, but right now 15 points are added, not 14.
if( Core.ML && !(this is BaseShield) )
{
int bonus = (int)(from.Skills.ArmsLore.Value / 20);
for( int i = 0; i < bonus; i++ )
{
switch( Utility.Random( 5 ) )
{
case 0: m_PhysicalBonus++; break;
case 1: m_FireBonus++; break;
case 2: m_ColdBonus++; break;
case 3: m_EnergyBonus++; break;
case 4: m_PoisonBonus++; break;
}
}
from.CheckSkill( SkillName.ArmsLore, 0, 100 );
}
}
if ( Core.AOS && tool is BaseRunicTool )
((BaseRunicTool)tool).ApplyAttributesTo( this );
#region Mondain's Legacy
if ( craftItem != null && !craftItem.ForceNonExceptional )
{
CraftResourceInfo resInfo = CraftResources.GetInfo( m_Resource );
if ( resInfo == null )
return quality;
CraftAttributeInfo attrInfo = resInfo.AttributeInfo;
if ( attrInfo == null )
return quality;
if ( m_Resource != CraftResource.Heartwood )
{
m_AosAttributes.WeaponDamage += attrInfo.ArmorDamage;
m_AosAttributes.AttackChance += attrInfo.ArmorHitChance;
m_AosAttributes.RegenHits += attrInfo.ArmorRegenHits;
m_AosArmorAttributes.MageArmor += attrInfo.ArmorMage;
}
else
{
switch ( Utility.Random( 5 ) )
{
case 0: m_AosAttributes.WeaponDamage += attrInfo.ArmorDamage; break;
case 1: m_AosAttributes.AttackChance += attrInfo.ArmorHitChance; break;
case 2: m_AosArmorAttributes.MageArmor += attrInfo.ArmorMage; break;
case 3: m_AosAttributes.Luck += attrInfo.ArmorLuck; break;
case 4: m_AosArmorAttributes.LowerStatReq += attrInfo.ArmorLowerRequirements; break;
}
}
}
#endregion
return quality;
}
#endregion
#region Mondain's Legacy Set Armor
public override bool OnDragLift( Mobile from )
{
if ( Parent is Mobile && from == Parent )
{
Mobile m = (Mobile) Parent;
if ( IsSetItem ? m_SetEquipped : false )
SetHelper.RemoveSetBonus( from, SetID, this );
}
return base.OnDragLift( from );
}
public virtual SetItem SetID{ get{ return SetItem.None; } }
public virtual int Pieces{ get{ return 0; } }
public virtual bool MixedSet{ get{ return false; } }
public bool IsSetItem{ get{ return SetID == SetItem.None ? false : true; } }
private int m_SetHue;
private bool m_SetEquipped;
private bool m_LastEquipped;
[CommandProperty( AccessLevel.GameMaster )]
public int SetHue
{
get{ return m_SetHue; }
set{ m_SetHue = value; InvalidateProperties(); }
}
public bool SetEquipped
{
get{ return m_SetEquipped; }
set{ m_SetEquipped = value; }
}
public bool LastEquipped
{
get{ return m_LastEquipped; }
set{ m_LastEquipped = value; }
}
private AosAttributes m_SetAttributes;
private AosArmorAttributes m_SetArmorAttributes;
private AosSkillBonuses m_SetSkillBonuses;
[CommandProperty( AccessLevel.GameMaster )]
public AosAttributes SetAttributes
{
get{ return m_SetAttributes; }
set{}
}
[CommandProperty( AccessLevel.GameMaster )]
public AosArmorAttributes SetArmorAttributes
{
get{ return m_SetArmorAttributes; }
set{}
}
[CommandProperty( AccessLevel.GameMaster )]
public AosSkillBonuses SetSkillBonuses
{
get{ return m_SetSkillBonuses; }
set{}
}
private int m_SetPhysicalBonus, m_SetFireBonus, m_SetColdBonus, m_SetPoisonBonus, m_SetEnergyBonus;
[CommandProperty( AccessLevel.GameMaster )]
public int SetPhysicalBonus{ get{ return m_SetPhysicalBonus; } set{ m_SetPhysicalBonus = value; InvalidateProperties(); } }
[CommandProperty( AccessLevel.GameMaster )]
public int SetFireBonus{ get{ return m_SetFireBonus; } set{ m_SetFireBonus = value; InvalidateProperties(); } }
[CommandProperty( AccessLevel.GameMaster )]
public int SetColdBonus{ get{ return m_SetColdBonus; } set{ m_SetColdBonus = value; InvalidateProperties(); } }
[CommandProperty( AccessLevel.GameMaster )]
public int SetPoisonBonus{ get{ return m_SetPoisonBonus; } set{ m_SetPoisonBonus = value; InvalidateProperties(); } }
[CommandProperty( AccessLevel.GameMaster )]
public int SetEnergyBonus{ get{ return m_SetEnergyBonus; } set{ m_SetEnergyBonus = value; InvalidateProperties(); } }
public virtual void GetSetProperties( ObjectPropertyList list )
{
int prop;
if ( !m_SetEquipped )
{
if ( m_SetPhysicalBonus != 0 )
list.Add( 1072382, m_SetPhysicalBonus.ToString() ); // physical resist +~1_val~%
if ( m_SetFireBonus != 0 )
list.Add( 1072383, m_SetFireBonus.ToString() ); // fire resist +~1_val~%
if ( m_SetColdBonus != 0 )
list.Add( 1072384, m_SetColdBonus.ToString() ); // cold resist +~1_val~%
if ( m_SetPoisonBonus != 0 )
list.Add( 1072385, m_SetPoisonBonus.ToString() ); // poison resist +~1_val~%
if ( m_SetEnergyBonus != 0 )
list.Add( 1072386, m_SetEnergyBonus.ToString() ); // energy resist +~1_val~%
}
if ( (prop = m_SetArmorAttributes.DurabilityBonus) != 0 && GetDurabilityBonus() == 0 )
list.Add( 1060410, prop.ToString() ); // durability ~1_val~%
if ( (prop = m_SetArmorAttributes.LowerStatReq) != 0 && GetLowerStatReq() == 0 )
list.Add( 1060435, prop.ToString() ); // lower requirements ~1_val~%
if ( (prop = m_SetArmorAttributes.MageArmor) != 0 && ArmorAttributes.MageArmor == 0 )
list.Add( 1060437 ); // mage armor
if ( (prop = m_SetArmorAttributes.SelfRepair) != 0 && ArmorAttributes.SelfRepair == 0 )
list.Add( 1060450, prop.ToString() ); // self repair ~1_val~
if ( m_AosSkillBonuses.Skill_1_Value != 0 )
list.Add( 1072502, "{0}t{1}", "#" + ( 1044060 + (int) m_SetSkillBonuses.Skill_1_Name ), m_SetSkillBonuses.Skill_1_Value ); // ~1_skill~ ~2_val~ (total)
SetHelper.GetSetProperties( list, Attributes, m_SetAttributes, m_SetEquipped );
}
#endregion
}
}
/////////////////////////////////////////////////
// //
// Created by Manu for //
// Splitterwelt.com //
// german roleplay freeshard //
// //
// may be used and modified as you like, as //
// long as this header is kept //
/////////////////////////////////////////////////
using System;
using Server.Items;
using Server.Mobiles;
namespace Server.Engines.Craft
{
public class DefMarbleCrafting : CraftSystem
{
public override SkillName MainSkill
{
get { return SkillName.Mining; }
}
private static CraftSystem m_CraftSystem;
public static CraftSystem CraftSystem
{
get
{
if ( m_CraftSystem == null )
m_CraftSystem = new DefMarbleCrafting();
return m_CraftSystem;
}
}
public override CraftECA ECA{ get{ return CraftECA.ChanceMinusSixtyToFourtyFive; } }
public override double GetChanceAtMin( CraftItem item )
{
return 0.0; // 0%
}
private DefMarbleCrafting() : base( 1, 1, 1.25 )// base( 1, 1, 1.5 )
{
}
public override bool RetainsColorFrom( CraftItem item, Type type )
{
return true;
}
public override int CanCraft( Mobile from, BaseTool tool, Type itemType )
{
if ( tool.Deleted || tool.UsesRemaining < 0 )
return 1044038; // You have worn out your tool!
else if ( !(from is PlayerMobile && ((PlayerMobile)from).Masonry && from.Skills[SkillName.Mining].Base >= 50.0) )
return 1044633; // You havent learned stonecraft.
else if ( !BaseTool.CheckAccessible( tool, from ) )
return 1044263; // The tool must be on your person to use.
return 0;
}
public override void PlayCraftEffect( Mobile from )
{
}
public override int PlayEndingEffect( Mobile from, bool failed, bool lostMaterial, bool toolBroken, int quality, bool makersMark, CraftItem item )
{
if ( toolBroken )
from.SendLocalizedMessage( 1044038 ); // You have worn out your tool
if ( failed )
{
if ( lostMaterial )
return 1044043; // You failed to create the item, and some of your materials are lost.
else
return 1044157; // You failed to create the item, but no materials were lost.
}
else
{
if ( quality == 0 )
return 502785; // You were barely able to make this item. It's quality is below average.
else if ( makersMark && quality == 2 )
return 1044156; // You create an exceptional quality item and affix your maker's mark.
else if ( quality == 2 )
return 1044155; // You create an exceptional quality item.
else
return 1044154; // You create the item.
}
}
public override void InitCraftList()
{
int index = 1;
// Other Items
//AddCraft( typeof( Marble ), 1044294, "raw marble block", 0.0, 0.0, typeof( Granite ), 1044514, 1, 1044513 );
//SetUseSubRes2( index, true );*/
/* Begin Benches */
AddCraft( typeof( MarbleBenchSmallSouthAddonDeed ), "Benches", "Small Marble Bench (South)", 80.0, 100.0, typeof( Marble ), "Raw Marble Block", 1, "You need more marble!" );
AddCraft( typeof( MarbleBenchSmallEastAddonDeed ), "Benches", "Small Marble Bench(East)", 80.0, 100.0, typeof( Marble ), "Raw Marble Block", 1, "You need more marble!" );
AddCraft( typeof( MarbleBenchMediumSouthAddonDeed ), "Benches", "Medium Marble Bench (South)", 80.0, 105.0, typeof( Marble ), "Raw Marble Block", 2, "You need more marble!" );
AddCraft( typeof( MarbleBenchMediumEastAddonDeed ), "Benches", "Medium Marble Bench(East)", 80.0, 105.0, typeof( Marble ), "Raw Marble Block", 2, "You need more marble!" );
AddCraft( typeof( MarbleBenchLongSouthAddonDeed ), "Benches", "Long Marble Bench (South)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 3, "You need more marble!" );
AddCraft( typeof( MarbleBenchLongEastAddonDeed ), "Benches", "Long Marble Bench (East)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 3, "You need more marble!" );
/* End Benches */
/* Begin Statues */
AddCraft( typeof( LightMarbleDaemonStatueAddonDeed ), "Statues", "Daemon-Statue (Bright Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( DarkMarbleDaemonStatueAddonDeed ), "Statues", "Daemon-Statue (Dark Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( LightMarbleGargoyleStatueAddonDeed ), "Statues", "Gargoyle-Statue (Bright Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( DarkMarbleGargoyleStatueAddonDeed ), "Statues", "Gargoyle-Statue (Dark Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( LightMarbleNightmareStatueAddonDeed ), "Statues", "Nightmare-Statue (Bright Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( DarkMarbleNightmareStatueAddonDeed ), "Statues", "Nightmare-Statue (Dark Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( LightMarbleUnicornStatueAddonDeed ), "Statues", "Unicorn-Statue (Bright Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( DarkMarbleUnicornStatueAddonDeed ), "Statues", "Unicorn-Statue (Dark Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( LightMarbleRunebeetleStatueAddonDeed ), "Statues", "Runebeetle-Statue (Bright Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( DarkMarbleRunebeetleStatueAddonDeed ), "Statues", "Runebeetle-Statue (Dark Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( LightMarbleSkeletonwarriorStatueAddonDeed ), "Statues", "Skeletonwarrior-Statue (Bright Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( DarkMarbleSkeletonwarriorStatueAddonDeed ), "Statues", "Skeletonwarrior-Statue (Dark Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( LightMarbleSnowleopardStatueAddonDeed ), "Statues", "Snowleopard-Statue (Bright Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( DarkMarbleSnowleopardStatueAddonDeed ), "Statues", "Snowleopard-Statue (Dark Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( LightMarbleWolfStatueAddonDeed ), "Statues", "Wolf-Statue (Bright Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
AddCraft( typeof( DarkMarbleWolfStatueAddonDeed ), "Statues", "Wolf-Statue (Dark Pedestal)", 80.0, 110.0, typeof( Marble ), "Raw Marble Block", 5, "You need more marble!" );
/* End Statues */
SetSubRes( typeof( Marble ), "Marble" );
AddSubRes( typeof( Marble ), 1044525, 00.0, 1044514, 1044526 );
AddSubRes( typeof( DullCopperMarble ), 1044023, 40.0, 1044514, 1044527 );
AddSubRes( typeof( ShadowIronMarble ), 1044024, 45.0, 1044514, 1044527 );
AddSubRes( typeof( CopperMarble ), 1044025, 50.0, 1044514, 1044527 );
AddSubRes( typeof( BronzeMarble ), 1044026, 55.0, 1044514, 1044527 );
AddSubRes( typeof( GoldMarble ), 1044027, 60.0, 1044514, 1044527 );
AddSubRes( typeof( AgapiteMarble ), 1044028, 65.0, 1044514, 1044527 );
AddSubRes( typeof( VeriteMarble ), 1044029, 70.0, 1044514, 1044527 );
AddSubRes( typeof( ValoriteMarble ), 1044030, 75.0, 1044514, 1044527 );
AddSubRes( typeof( SilverMarble ), "SILVER", 80.0, 1044527 );
AddSubRes( typeof( PlatinumMarble ), "PLATINUM", 85.0, 1044527 );
AddSubRes( typeof( MythrilMarble ), "MYTHRIL", 90.0, 1044527 );
AddSubRes( typeof( ObsidianMarble ), "OBSIDIAN", 95.0, 1044527 );
AddSubRes( typeof( JadeMarble ), "JADE", 100.0, 1044527 );
AddSubRes( typeof( MoonstoneMarble ), "MOONSTONE", 105.0, 1044527 );
AddSubRes( typeof( SunstoneMarble ), "SUNSTONE", 110.0, 1044527 );
AddSubRes( typeof( BloodstoneMarble ), "BLOODSTONE", 115.0, 1044527 );
}
}
}
neuton;728762 said:@Oiii if you want after you merge, you can look at my copies of basearmor,baseweapon and craftitem which are the ones I was having the most trouble.
oiii88;728763 said:Did the ML Items give you issues on merging?? That seems to be wear its tossing me up..
I got same error but only with thrones instead of table.RunUO - [www.runuo.com] Version 2.0, Build 2357.32527
Core: Running on .NET Framework Version 2.0.50727
Core: Optimizing for 2 processors
Scripts: Compiling C# scripts...done (cached)
Scripts: Compiling VB.NET scripts...no files found.
Scripts: Verifying...done (2374 items, 568 mobiles)
Regions: Loading...done
World: Loading...An error was encountered while loading a saved object
- Type: Server.Items.WritingTable
- Serial: 0x400041C7
Delete the object? (y/n)
Delete all objects of that type? (y/n)
After pressing return an exception will be thrown and the server will terminate
Error:
System.Exception: Load failed (items=True, mobiles=False, guilds=False, type=Ser
ver.Items.WritingTable, serial=0x400041C7) ---> System.Exception: ***** Bad seri
alize on Server.Items.WritingTable *****
at Server.World.Load()
--- End of inner exception stack trace ---
at Server.World.Load()
at Server.ScriptCompiler.Compile(Boolean debug)
at Server.Core.Main(String[] args)
This exception is fatal, press return to exit
Raivo;729368 said:Got problem here. Added this sytem to my server, replaced original files but when I fire up I get fatal error. Any hints?
I got same error but only with thrones instead of table.