Full Version : crafted jewelry question
xmlspawner >>Scripting Support >>crafted jewelry question


<< Prev | Next >>

semolo- 10-23-2006
Thanks you for the help! All has appeared is easier I has taken for basis ÀÎÑ Attributes look and now all works as it is necessary!
QUOTE
using System;
using Server.Engines.Craft;

namespace Server.Items
{
public enum JewelQuality
{
Low,
Regular,
Exceptional
}
public enum GemType
{
None,
StarSapphire,
Emerald,
Sapphire,
Ruby,
Citrine,
Amethyst,
Tourmaline,
Amber,
Diamond
}

public abstract class BaseJewel : Item, ICraftable
{
private AosAttributes m_AosAttributes;
private AosElementAttributes m_AosResistances;
private AosSkillBonuses m_AosSkillBonuses;
private Mobile m_Crafter;
private JewelQuality m_Quality;
private bool m_PlayerConstructed;
private CraftResource m_Resource;
private GemType m_GemType;

[CommandProperty( AccessLevel.GameMaster )]
public Mobile Crafter
{
get{ return m_Crafter; }
set{ m_Crafter = value; InvalidateProperties(); }
}

[CommandProperty( AccessLevel.GameMaster )]
public JewelQuality Quality
{
get{ return m_Quality; }
set{ m_Quality = value; InvalidateProperties(); }
}

[CommandProperty( AccessLevel.GameMaster )]
public bool PlayerConstructed
{
get{ return m_PlayerConstructed; }
set{ m_PlayerConstructed = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public AosAttributes Attributes
{
get{ return m_AosAttributes; }
set{}
}

[CommandProperty( AccessLevel.GameMaster )]
public AosElementAttributes Resistances
{
get{ return m_AosResistances; }
set{}
}

[CommandProperty( AccessLevel.GameMaster )]
public AosSkillBonuses SkillBonuses
{
get{ return m_AosSkillBonuses; }
set{}
}

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

[CommandProperty( AccessLevel.GameMaster )]
public GemType GemType
{
get{ return m_GemType; }
set{ m_GemType = value; InvalidateProperties(); }
}

public override int PhysicalResistance{ get{ return m_AosResistances.Physical; } }
public override int FireResistance{ get{ return m_AosResistances.Fire; } }
public override int ColdResistance{ get{ return m_AosResistances.Cold; } }
public override int PoisonResistance{ get{ return m_AosResistances.Poison; } }
public override int EnergyResistance{ get{ return m_AosResistances.Energy; } }
public virtual int BaseGemTypeNumber{ get{ return 0; } }

public override int LabelNumber
{
get
{
if ( m_GemType == GemType.None )
return base.LabelNumber;

return BaseGemTypeNumber + (int)m_GemType - 1;
}
}

public virtual int ArtifactRarity{ get{ return 0; } }

public BaseJewel( int itemID, Layer layer ) : base( itemID )
{
m_AosAttributes = new AosAttributes( this );
m_AosResistances = new AosElementAttributes( this );
m_AosSkillBonuses = new AosSkillBonuses( this );
m_Resource = CraftResource.Iron;
m_GemType = GemType.None;

Layer = layer;
}

public override void OnAdded( object parent )
{
if ( Core.AOS && parent is Mobile )
{
Mobile from = (Mobile)parent;

m_AosSkillBonuses.AddTo( from );

int strBonus = m_AosAttributes.BonusStr;
int dexBonus = m_AosAttributes.BonusDex;
int intBonus = m_AosAttributes.BonusInt;

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 ) );
}

from.CheckStatTimers();
}
}

public override void OnRemoved( object parent )
{
if ( Core.AOS && parent is Mobile )
{
Mobile from = (Mobile)parent;

m_AosSkillBonuses.Remove();

string modName = this.Serial.ToString();

from.RemoveStatMod( modName + "Str" );
from.RemoveStatMod( modName + "Dex" );
from.RemoveStatMod( modName + "Int" );

from.CheckStatTimers();
}
}

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

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

if ( m_Crafter != null )
list.Add( 1050043, m_Crafter.Name ); // crafted by ~1_NAME~
if ( m_Quality == JewelQuality.Exceptional )
list.Add( 1060636 ); // exceptional

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 = m_AosAttributes.Luck) != 0 )
list.Add( 1060436, prop.ToString() ); // luck ~1_val~

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_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 );
  }

  #region Serialization
  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  = 0x00000002,
  SkillBonuses  = 0x00000008,
  Resistances  = 0x00000010,
  PlayerConstructed = 0x00000080,
  Crafter    = 0x00000100,
  Quality    = 0x00000200
  }

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

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

  SaveFlag flags = SaveFlag.None;

  SetSaveFlag( ref flags, SaveFlag.Attributes,  !m_AosAttributes.IsEmpty );
  SetSaveFlag( ref flags, SaveFlag.SkillBonuses,  !m_AosSkillBonuses.IsEmpty );
  SetSaveFlag( ref flags, SaveFlag.Resistances,  !m_AosResistances.IsEmpty );
  SetSaveFlag( ref flags, SaveFlag.PlayerConstructed, m_PlayerConstructed != false );
  SetSaveFlag( ref flags, SaveFlag.Crafter,  m_Crafter != null );
  SetSaveFlag( ref flags, SaveFlag.Quality,  m_Quality != JewelQuality.Regular );

  writer.WriteEncodedInt( (int) flags );

  if ( GetSaveFlag( flags, SaveFlag.Attributes ) )
    m_AosAttributes.Serialize( writer );

  if ( GetSaveFlag( flags, SaveFlag.SkillBonuses ) )
    m_AosSkillBonuses.Serialize( writer );

  if ( GetSaveFlag( flags, SaveFlag.Resistances ) )
    m_AosResistances.Serialize( writer );

  if ( GetSaveFlag( flags, SaveFlag.Crafter ) )
    writer.Write( (Mobile) m_Crafter );

  if ( GetSaveFlag( flags, SaveFlag.Quality ) )
    writer.WriteEncodedInt( (int) m_Quality );

  }

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

  int version = reader.ReadInt();

  switch ( version )
  {
    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.SkillBonuses ) )
      m_AosSkillBonuses = new AosSkillBonuses( this, reader );
    else
      m_AosSkillBonuses = new AosSkillBonuses( this );

    if ( GetSaveFlag( flags, SaveFlag.Resistances ) )
      m_AosResistances = new AosElementAttributes( this, reader );
    else
      m_AosResistances = new AosElementAttributes( this );


    if ( GetSaveFlag( flags, SaveFlag.Crafter ) )
      m_Crafter = reader.ReadMobile();

    if ( GetSaveFlag( flags, SaveFlag.Quality ) )
      m_Quality = (JewelQuality)reader.ReadEncodedInt();
    else
      m_Quality = JewelQuality.Regular;

    if ( GetSaveFlag( flags, SaveFlag.PlayerConstructed ) )
      m_PlayerConstructed = true;

    break;
    }
    case 4:
    {
    m_Resource = (CraftResource)reader.ReadInt();

    goto case 3;
    }
    case 3:
    {
    m_AosAttributes = new AosAttributes( this, reader );
    m_AosSkillBonuses = new AosSkillBonuses( this, reader );
    m_AosResistances = new AosElementAttributes( this, reader );

    goto case 2;
    }
    case 2:
    {
    m_PlayerConstructed = reader.ReadBool();
    goto case 1;
    }
    case 1:
    {
    m_Crafter = reader.ReadMobile();
    m_Quality = (JewelQuality)reader.ReadInt();
    break;
    }
    case 0:
    {
    m_Crafter = null;
    m_Quality = JewelQuality.Regular;
    break;
    }
  }

  if ( version < 2 )
    m_PlayerConstructed = true; // we don't know, so, assume it's crafted

  if ( version < 3 )
  {
    m_AosAttributes = new AosAttributes( this );
    m_AosSkillBonuses = new AosSkillBonuses( this );
    m_AosResistances = new AosElementAttributes( this );
  }

  if ( version < 4 )
m_Resource = CraftResource.Iron;
m_GemType = GemType.None;

  }
  #endregion
#region ICraftable Members

public int OnCraft( int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CraftItem craftItem, int resHue )
{
int i_skill = (int)(from.Skills.ItemID.Value - 100);
if (i_skill >= 20 && !(tool is BaseRunicTool))
{
int i_numberof = (int)(i_skill/20);
int i_lowerend = (int)(i_skill - 30);
if (i_lowerend <= 10) i_lowerend = 10;
int i_upperend = (int)(i_skill +10);
if ( i_upperend >= 100) i_upperend = 100;
BaseRunicTool.ApplyAttributesTo((BaseJewel)this, i_numberof, i_lowerend, i_upperend);
}
if (tool is BaseRunicTool)
{
int runicminattributes = 0;
int runicminintensity = 0;
int runicmaxintensity = 0;
BaseRunicTool t_tool = tool as BaseRunicTool;
string s_runicresource = Convert.ToString(t_tool.Resource);

if (s_runicresource == "DullCopper" ) runicminattributes = 2;
if (s_runicresource == "DullCopper" ) runicminintensity = 10;
if (s_runicresource == "DullCopper" ) runicmaxintensity = 35;

if (s_runicresource == "Copper" ) runicminattributes = 2;
if (s_runicresource == "Copper" ) runicminintensity = 25;
if (s_runicresource == "Copper" ) runicmaxintensity = 50;

if (s_runicresource == "Golden" ) runicminattributes = 3;
if (s_runicresource == "Golden" ) runicminintensity = 35;
if (s_runicresource == "Golden" ) runicmaxintensity = 75;

if (s_runicresource == "Agapite" ) runicminattributes = 4;
if (s_runicresource == "Agapite" ) runicminintensity = 40;
if (s_runicresource == "Agapite" ) runicmaxintensity = 80;

if (s_runicresource == "Verite" ) runicminattributes = 6;
if (s_runicresource == "Verite" ) runicminintensity = 45;
if (s_runicresource == "Verite" ) runicmaxintensity = 90;

if (s_runicresource == "Valorite" ) runicminattributes = 7;
if (s_runicresource == "Valorite" ) runicminintensity = 50;
if (s_runicresource == "Valorite" ) runicmaxintensity = 100;

BaseRunicTool.ApplyAttributesTo((BaseJewel)this, runicminattributes, runicminintensity, runicmaxintensity);
}
Quality = (JewelQuality)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 ( 1 < craftItem.Ressources.Count )
{
resourceType = craftItem.Ressources.GetAt( 1 ).ItemType;

if ( resourceType == typeof( StarSapphire ) )
GemType = GemType.StarSapphire;
else if ( resourceType == typeof( Emerald ) )
GemType = GemType.Emerald;
else if ( resourceType == typeof( Sapphire ) )
GemType = GemType.Sapphire;
else if ( resourceType == typeof( Ruby ) )
GemType = GemType.Ruby;
else if ( resourceType == typeof( Citrine ) )
GemType = GemType.Citrine;
else if ( resourceType == typeof( Amethyst ) )
GemType = GemType.Amethyst;
else if ( resourceType == typeof( Tourmaline ) )
GemType = GemType.Tourmaline;
else if ( resourceType == typeof( Amber ) )
GemType = GemType.Amber;
else if ( resourceType == typeof( Diamond ) )
GemType = GemType.Diamond;
}

return 1;
}

#endregion
}
}

tongue.gif

semolo- 10-23-2006
sorry for bad English I from Ukraine and badly I speak!

ArteGordon- 10-23-2006
glad you got it working.

semolo- 10-23-2006
Without you at me it would not turn out! First of all to you thanks