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


<< Prev | Next >>

semolo- 10-21-2006
thanks!

If not difficultly explain me!

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

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

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

writer.WriteEncodedInt( (int) m_Resource );
writer.WriteEncodedInt( (int) m_GemType );

m_AosAttributes.Serialize( writer );
m_AosResistances.Serialize( writer );
m_AosSkillBonuses.Serialize( writer );
}

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

int version = reader.ReadInt();

switch ( version )
{
case 2:
{
m_Resource = (CraftResource)reader.ReadEncodedInt();
m_GemType = (GemType)reader.ReadEncodedInt();

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

if ( Core.AOS && Parent is Mobile )
m_AosSkillBonuses.AddTo( (Mobile)Parent );

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

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

break;
}
case 0:
{
m_AosAttributes = new AosAttributes( this );
m_AosResistances = new AosElementAttributes( this );
m_AosSkillBonuses = new AosSkillBonuses( this );

break;
}
}

if ( version < 2 )
{
m_Resource = CraftResource.Iron;
m_GemType = GemType.None;
}
}
#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
}
}


I Crafted ring user posted image

But When I restart a server user posted image
Why? Please help me!

ArteGordon- 10-21-2006
because you dont serialize the crafter or quality properties so they cannot be restored on server restarts. Properties are not automatically saved, you have to do it yourself.

semolo- 10-21-2006
how I can make it?
Help please me smile.gif

ArteGordon- 10-22-2006
you need to save these properties during serialization
private Mobile m_Crafter;
private JewelQuality m_Quality;

and then restore them during deserialization.

To save them, you need to change the Serialize method by increasing the version number, and then writing out those variables.

QUOTE

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

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

// version 3
writer.Write( m_Crafter);
writer.WriteEncodedInt( (int) m_Quality);

// version 2

writer.WriteEncodedInt( (int) m_Resource );
writer.WriteEncodedInt( (int) m_GemType );

m_AosAttributes.Serialize( writer );
m_AosResistances.Serialize( writer );
m_AosSkillBonuses.Serialize( writer );
}


Then you need to modify Deserialize to read them back in. If you mess this up you will not be able to restart your server without deleting all of your jewelry so be careful.

QUOTE

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

int version = reader.ReadInt();

switch ( version )
{
case 3:
{
m_Crafter = reader.ReadMobile();
m_Quality= (JewelQuality)reader.ReadEncodedInt();

goto case 2;
}

case 2:
{
m_Resource = (CraftResource)reader.ReadEncodedInt();
m_GemType = (GemType)reader.ReadEncodedInt();

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

if ( Core.AOS && Parent is Mobile )
m_AosSkillBonuses.AddTo( (Mobile)Parent );

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

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

break;
}
case 0:
{
m_AosAttributes = new AosAttributes( this );
m_AosResistances = new AosElementAttributes( this );
m_AosSkillBonuses = new AosSkillBonuses( this );

break;
}
}

if ( version < 2 )
{
m_Resource = CraftResource.Iron;
m_GemType = GemType.None;
}
}

semolo- 10-22-2006
Thanks big but... It gives out a mistake: (me already it is not convenient before you!
CODE
[COLOR=red]Errors:
+ Items/Jewels/BaseJewel.cs:
   CS1518: Line 281: Expected class, delegate, enum, interface, or struct
   CS1518: Line 306: Expected class, delegate, enum, interface, or struct
   CS1518: Line 307: Expected class, delegate, enum, interface, or struct
   CS1518: Line 308: Expected class, delegate, enum, interface, or struct
   CS1518: Line 324: Expected class, delegate, enum, interface, or struct
   CS1518: Line 327: Expected class, delegate, enum, interface, or struct
   CS1518: Line 330: Expected class, delegate, enum, interface, or struct
   CS0116: Line 333: A namespace does not directly contain members such as fiel
ds or methods
   CS1022: Line 337: Type or namespace definition, or end-of-file expected[/COLOR]

Line 281 this :
QUOTE
  public override void Deserialize( GenericReader reader )
  {
  base.Deserialize( reader );

  int version = reader.ReadInt();

  switch ( version )
  {
case 3:
{
m_Crafter = reader.ReadMobile();
m_Quality= (JewelQuality)reader.ReadEncodedInt();

goto case 2;
}

    case 2:
    {
    m_Resource = (CraftResource)reader.ReadEncodedInt();
    m_GemType = (GemType)reader.ReadEncodedInt();

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

    if ( Core.AOS && Parent is Mobile )
      m_AosSkillBonuses.AddTo( (Mobile)Parent );

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

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

    break;

semolo- 10-22-2006
OH I apologize it my mistake all have changed!!! Easier to sleep I want =)
WORKS
THANKS BIG!!!

semolo- 10-22-2006
I craft ring!
restart
QUOTE
RunUO - [www.runuo.com] Version 2.0, Build 2357.32527
Core: Running on .NET Framework Version 2.0.50727
Scripts: Compiling C# scripts...done (cached)
Scripts: Compiling VB.NET scripts...no files found.
Scripts: Verifying...done (2467 items, 573 mobiles)
Regions: Loading...done
World: Loading...An error was encountered while loading a saved object
- Type: Server.Items.GoldRing
- Serial: 0x4000001B
Delete the object? (y/n)

ArteGordon- 10-22-2006
you did not change the serialization correctly. As I mentioned, if you make mistakes in serialization/deserialization this is what happens.
You will need to fix the serialization and go back to a previous backup save.

semolo- 10-23-2006
What do I cannot to understand as to make that it worked sad.gif
I in scripts a beginner also am engaged in it of less than two months

ArteGordon- 10-23-2006
you needed to make this change as well

QUOTE

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

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

// version 3
writer.Write( m_Crafter);
writer.WriteEncodedInt( (int) m_Quality);

// version 2

writer.WriteEncodedInt( (int) m_Resource );
writer.WriteEncodedInt( (int) m_GemType );

m_AosAttributes.Serialize( writer );
m_AosResistances.Serialize( writer );
m_AosSkillBonuses.Serialize( writer );
}



You will need to post the script again if you still have problems.

semolo- 10-23-2006
QUOTE

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

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

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

writer.WriteEncodedInt( (int) m_Resource );
writer.WriteEncodedInt( (int) m_GemType );

m_AosAttributes.Serialize( writer );
m_AosResistances.Serialize( writer );
m_AosSkillBonuses.Serialize( writer );
}

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

int version = reader.ReadInt();

switch ( version )
{
case 2:
{
m_Resource = (CraftResource)reader.ReadEncodedInt();
m_GemType = (GemType)reader.ReadEncodedInt();

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

if ( Core.AOS && Parent is Mobile )
m_AosSkillBonuses.AddTo( (Mobile)Parent );

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

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

break;
}
case 0:
{
m_AosAttributes = new AosAttributes( this );
m_AosResistances = new AosElementAttributes( this );
m_AosSkillBonuses = new AosSkillBonuses( this );

break;
}
}

if ( version < 2 )
{
m_Resource = CraftResource.Iron;
m_GemType = GemType.None;
}
}
#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
}
}



I craft ring when i restart server
CODE
RunUO - [www.runuo.com] Version 2.0, Build 2357.32527
Core: Running on .NET Framework Version 2.0.50727
Scripts: Compiling C# scripts...done (0 errors, 0 warnings)
Scripts: Compiling VB.NET scripts...no files found.
Scripts: Verifying...done (2467 items, 573 mobiles)
Regions: Loading...done
World: Loading...An error was encountered while loading a saved object
- Type: Server.Items.GoldRing
- Serial: 0x4000001B
Delete the object? (y/n)

ArteGordon- 10-23-2006
the code that you posted doesnt have any of the modifications that I mentioned. Did you add the changes and then remove them?

You should restore one of your previous backups that was made before you made any changes to the script.

semolo- 10-23-2006
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 );
  }

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

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

  writer.WriteEncodedInt( (int) m_Resource );
  writer.WriteEncodedInt( (int) m_GemType );

  m_AosAttributes.Serialize( writer );
  m_AosResistances.Serialize( writer );
  m_AosSkillBonuses.Serialize( writer );
  }

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

  int version = reader.ReadInt();

  switch ( version )
  {
    case 2:
    {
    m_Resource = (CraftResource)reader.ReadEncodedInt();
    m_GemType = (GemType)reader.ReadEncodedInt();

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

    if ( Core.AOS && Parent is Mobile )
      m_AosSkillBonuses.AddTo( (Mobile)Parent );

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

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

    break;
    }
    case 0:
    {
    m_AosAttributes = new AosAttributes( this );
    m_AosResistances = new AosElementAttributes( this );
    m_AosSkillBonuses = new AosSkillBonuses( this );

    break;
    }
  }

  if ( version < 2 )
  {
    m_Resource = CraftResource.Iron;
    m_GemType = GemType.None;
  }
  }
  #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
}
}


Here my this works, that does not save who has crafted the item

ArteGordon- 10-23-2006
that is the original code and it should allow you to load your old saves.
If you want it to save the crafter and quality, you will need to make the modifications to the Serialize and Deserialize methods that I posted.
If you make a mistake in adding those modifications, you will not be able to load the saves that you make with it and it will ask you to delete the items as you have already seen.

Make backups of your saves and your scripts, then add the modifications as I posted them.
If you want, you can post your modified script and I can take a look at it.

semolo- 10-23-2006
Can be it is correct "DefTinkering"?