RunUO Community

This is a sample guest message. Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

Creating a new weapon property.

Droth

Wanderer
Creating a new weapon property.

Ok, instead of posting my whole BaseWeapon Script, I figured I would just post the variable, and the error that occurs.

I have a variable defined by my Critical system called Crit.
I would like weapons to have a Crit rating defined in base weapon.

Code:
		//Custom
		private int m_CritRate;

		//Custom 
		[CommandProperty( AccessLevel.GameMaster )]
		public int CritRate
		{
			get{ return ( m_CritRate ); }
			set{ m_CritRate = CritRate; InvalidateProperties();}
		}

public override bool OnEquip( Mobile from )
		{
		//Crit Droth
			if ( CritRate != 0 )
				{
				PlayerMobile pmfrom = from as PlayerMobile;
				pmfrom.Crit += m_CritRate;
				return base.OnEquip( from );
				}
		{

For serialization I changed version to 9 from 8.

Code:
			writer.Write( (int) m_CritRate );

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

			int version = reader.ReadInt();

			switch ( version )
			{
				case 9:
					{
					Critical = reader.ReadInt();
					m_CritRate = reader.ReadInt();
					goto case 8;
					}

What works:

When I add a weapon, and use [props to change its CritRate, and equip the item, the Crit value on the playermobile changes.

What doesn't work:
Deserialization! When I save the server and reload, it prompts me to delete all Baseweapons.
Adding via override on weapon script.

Code:
public override int CritRate{ get{ return 5; } }

This shoots an error in the compiler that the variable isn't writable.

Any suggestions on what I'm doing wrong?
 
you have to have your new variable writen 1st right after the version is written, not the last thing being writen

they have to be in exact same order for writer and reader
 

daat99

Moderator
Staff member
After you do what greywolf said you should make the CritRate "virtual" (look for that word in RunUO files and see how it's used).
 

bazspeed

Sorceror
Hi can anyone please explain this a bit more clearly, I have tried adding this to base weapon but getting errors
 

daat99

Moderator
Staff member
Post your code inside code tags and the errors you got so we could help you more.
 

Soteric

Knight
First you add a field to store new weapon property value
Code:
private int m_CritRate;
Then you add property/accessor to be able to share this value with other classes (parts of RunUO) and to be able to change it via [props command.
Code:
[CommandProperty( AccessLevel.GameMaster )]
public int CritRate
{
	get{ return m_CritRate; }
	set{ m_CritRate = value; InvalidateProperties();}
}
Then you need to instruct server to save its value on world save. You modify Serialize method for that. First you increment version. Right after that you add code to serialize new property value. Here my version is 9 (I assume it was 8 and I incremented it).
Code:
public override void Serialize( GenericWriter writer )
{
	...
	writer.Write( (int)9 ); // version
	writer.Write( m_CritRate );
	...
Now you need to tell the server how to load the value. For that you add new case to Deserialize method and add code deserializing and assigning m_CritRate value. 'case' number must match version number. That's an entry point for the server. Where to start loading.
Code:
public override void Deserialize( GenericReader reader )
{
	...
	switch( version )
	{
		case 9:
		{
			m_CritRate = reader.ReadInt();
			goto case 8;
		}
		...
 

bazspeed

Sorceror
Thank you for this. but can you please where in the baseweapon.cs i add them. I am fairly ok with scripting, but still fairly new.

Thnx
 

bazspeed

Sorceror
I just added the lines, but when restarting the server it asked if wanted to delete the weapons already in game.
 

bazspeed

Sorceror
I put the command property after #region Getters & Setters
I put the private int after the #region Var declarations

and the others in the serialize and deserialize, i think i have them right.
 

bazspeed

Sorceror
Here is where i put them

Code:
...
#region Var declarations
 
        private int m_CritRate;
        // Instance values. These values are unique to each weapon.
        private WeaponDamageLevel m_DamageLevel;
        private WeaponAccuracyLevel m_AccuracyLevel;
        private WeaponDurabilityLevel m_DurabilityLevel;
        private WeaponQuality m_Quality;
        private Mobile m_Crafter;
...
Code:
...
#region Getters & Setters
        [CommandProperty( AccessLevel.GameMaster )]
public int CritRate
{
    get{ return ( m_CritRate ); }
    set{ m_CritRate = CritRate; InvalidateProperties();}
}
       
        [CommandProperty( AccessLevel.GameMaster )]
        public AosAttributes Attributes
        {
            get{ return m_AosAttributes; }
            set{}
        }
...
Code:
...
public override void Serialize( GenericWriter writer )
        {
            base.Serialize( writer );
 
            writer.Write( (int) 9 ); // version
            writer.Write( m_CritRate );
 
            SaveFlag flags = SaveFlag.None;
 
            SetSaveFlag( ref flags, SaveFlag.DamageLevel,        m_DamageLevel != WeaponDamageLevel.Regular );
            SetSaveFlag( ref flags, SaveFlag.AccuracyLevel,        m_AccuracyLevel != WeaponAccuracyLevel.Regular );
...
Code:
...
public override void Deserialize( GenericReader reader )
        {
            base.Deserialize( reader );
 
            int version = reader.ReadInt();
 
            switch ( version )
            {
                case 9:
        {
            m_CritRate = reader.ReadInt();
            goto case 8;
        }
                case 8:
                case 7:
                case 6:
                case 5:
...
 

Soteric

Knight
Could you post the whole methods, not only those snippets?

P.S. I noticed an issue with the property posted by Droth. Please revise the fixed one
Code:
[CommandProperty( AccessLevel.GameMaster )]
public int CritRate
{
	get{ return m_CritRate; }
	set{ m_CritRate = value; InvalidateProperties();}
}
 

bazspeed

Sorceror
Code:
public override void Serialize( GenericWriter writer )
        {
            base.Serialize( writer );
 
            writer.Write( (int) 9 ); // version
            writer.Write( m_CritRate );
 
            SaveFlag flags = SaveFlag.None;
 
            SetSaveFlag( ref flags, SaveFlag.DamageLevel,        m_DamageLevel != WeaponDamageLevel.Regular );
            SetSaveFlag( ref flags, SaveFlag.AccuracyLevel,        m_AccuracyLevel != WeaponAccuracyLevel.Regular );
            SetSaveFlag( ref flags, SaveFlag.DurabilityLevel,    m_DurabilityLevel != WeaponDurabilityLevel.Regular );
            SetSaveFlag( ref flags, SaveFlag.Quality,            m_Quality != WeaponQuality.Regular );
            SetSaveFlag( ref flags, SaveFlag.Hits,                m_Hits != 0 );
            SetSaveFlag( ref flags, SaveFlag.MaxHits,            m_MaxHits != 0 );
            SetSaveFlag( ref flags, SaveFlag.Slayer,            m_Slayer != SlayerName.None );
            SetSaveFlag( ref flags, SaveFlag.Poison,            m_Poison != null );
            SetSaveFlag( ref flags, SaveFlag.PoisonCharges,        m_PoisonCharges != 0 );
            SetSaveFlag( ref flags, SaveFlag.Crafter,            m_Crafter != null );
            SetSaveFlag( ref flags, SaveFlag.Identified,        m_Identified != false );
            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.MinDamage,            m_MinDamage != -1 );
            SetSaveFlag( ref flags, SaveFlag.MaxDamage,            m_MaxDamage != -1 );
            SetSaveFlag( ref flags, SaveFlag.HitSound,            m_HitSound != -1 );
            SetSaveFlag( ref flags, SaveFlag.MissSound,            m_MissSound != -1 );
            SetSaveFlag( ref flags, SaveFlag.Speed,                m_Speed != -1 );
            SetSaveFlag( ref flags, SaveFlag.MaxRange,            m_MaxRange != -1 );
            SetSaveFlag( ref flags, SaveFlag.Skill,                m_Skill != (SkillName)(-1) );
            SetSaveFlag( ref flags, SaveFlag.Type,                m_Type != (WeaponType)(-1) );
            SetSaveFlag( ref flags, SaveFlag.Animation,            m_Animation != (WeaponAnimation)(-1) );
            SetSaveFlag( ref flags, SaveFlag.Resource,            m_Resource != CraftResource.Iron );
            SetSaveFlag( ref flags, SaveFlag.xAttributes,        !m_AosAttributes.IsEmpty );
            SetSaveFlag( ref flags, SaveFlag.xWeaponAttributes,    !m_AosWeaponAttributes.IsEmpty );
            SetSaveFlag( ref flags, SaveFlag.PlayerConstructed,    m_PlayerConstructed );
            SetSaveFlag( ref flags, SaveFlag.SkillBonuses,        !m_AosSkillBonuses.IsEmpty );
            SetSaveFlag( ref flags, SaveFlag.Slayer2,            m_Slayer2 != SlayerName.None );
            SetSaveFlag( ref flags, SaveFlag.ElementalDamages,    !m_AosElementDamages.IsEmpty );
            SetSaveFlag( ref flags, SaveFlag.EngravedText,        !String.IsNullOrEmpty( m_EngravedText ) );
 
            writer.Write( (int) flags );
 
            if ( GetSaveFlag( flags, SaveFlag.DamageLevel ) )
                writer.Write( (int) m_DamageLevel );
 
            if ( GetSaveFlag( flags, SaveFlag.AccuracyLevel ) )
                writer.Write( (int) m_AccuracyLevel );
 
            if ( GetSaveFlag( flags, SaveFlag.DurabilityLevel ) )
                writer.Write( (int) m_DurabilityLevel );
 
            if ( GetSaveFlag( flags, SaveFlag.Quality ) )
                writer.Write( (int) m_Quality );
 
            if ( GetSaveFlag( flags, SaveFlag.Hits ) )
                writer.Write( (int) m_Hits );
 
            if ( GetSaveFlag( flags, SaveFlag.MaxHits ) )
                writer.Write( (int) m_MaxHits );
 
            if ( GetSaveFlag( flags, SaveFlag.Slayer ) )
                writer.Write( (int) m_Slayer );
 
            if ( GetSaveFlag( flags, SaveFlag.Poison ) )
                Poison.Serialize( m_Poison, writer );
 
            if ( GetSaveFlag( flags, SaveFlag.PoisonCharges ) )
                writer.Write( (int) m_PoisonCharges );
 
            if ( GetSaveFlag( flags, SaveFlag.Crafter ) )
                writer.Write( (Mobile) m_Crafter );
 
            if ( GetSaveFlag( flags, SaveFlag.StrReq ) )
                writer.Write( (int) m_StrReq );
 
            if ( GetSaveFlag( flags, SaveFlag.DexReq ) )
                writer.Write( (int) m_DexReq );
 
            if ( GetSaveFlag( flags, SaveFlag.IntReq ) )
                writer.Write( (int) m_IntReq );
 
            if ( GetSaveFlag( flags, SaveFlag.MinDamage ) )
                writer.Write( (int) m_MinDamage );
 
            if ( GetSaveFlag( flags, SaveFlag.MaxDamage ) )
                writer.Write( (int) m_MaxDamage );
 
            if ( GetSaveFlag( flags, SaveFlag.HitSound ) )
                writer.Write( (int) m_HitSound );
 
            if ( GetSaveFlag( flags, SaveFlag.MissSound ) )
                writer.Write( (int) m_MissSound );
 
            if ( GetSaveFlag( flags, SaveFlag.Speed ) )
                writer.Write( (float) m_Speed );
 
            if ( GetSaveFlag( flags, SaveFlag.MaxRange ) )
                writer.Write( (int) m_MaxRange );
 
            if ( GetSaveFlag( flags, SaveFlag.Skill ) )
                writer.Write( (int) m_Skill );
 
            if ( GetSaveFlag( flags, SaveFlag.Type ) )
                writer.Write( (int) m_Type );
 
            if ( GetSaveFlag( flags, SaveFlag.Animation ) )
                writer.Write( (int) m_Animation );
 
            if ( GetSaveFlag( flags, SaveFlag.Resource ) )
                writer.Write( (int) m_Resource );
 
            if ( GetSaveFlag( flags, SaveFlag.xAttributes ) )
                m_AosAttributes.Serialize( writer );
 
            if ( GetSaveFlag( flags, SaveFlag.xWeaponAttributes ) )
                m_AosWeaponAttributes.Serialize( writer );
 
            if ( GetSaveFlag( flags, SaveFlag.SkillBonuses ) )
                m_AosSkillBonuses.Serialize( writer );
 
            if ( GetSaveFlag( flags, SaveFlag.Slayer2 ) )
                writer.Write( (int)m_Slayer2 );
 
            if( GetSaveFlag( flags, SaveFlag.ElementalDamages ) )
                m_AosElementDamages.Serialize( writer );
 
            if( GetSaveFlag( flags, SaveFlag.EngravedText ) )
                writer.Write( (string) m_EngravedText );
        }
 

bazspeed

Sorceror
Code:
public override void Deserialize( GenericReader reader )
        {
            base.Deserialize( reader );
 
            int version = reader.ReadInt();
 
            switch ( version )
            {
                case 9:
        {
            m_CritRate = reader.ReadInt();
            goto case 8;
        }
                case 8:
                case 7:
                case 6:
                case 5:
                {
                    SaveFlag flags = (SaveFlag)reader.ReadInt();
 
                    if ( GetSaveFlag( flags, SaveFlag.DamageLevel ) )
                    {
                        m_DamageLevel = (WeaponDamageLevel)reader.ReadInt();
 
                        if ( m_DamageLevel > WeaponDamageLevel.Vanq )
                            m_DamageLevel = WeaponDamageLevel.Ruin;
                    }
 
                    if ( GetSaveFlag( flags, SaveFlag.AccuracyLevel ) )
                    {
                        m_AccuracyLevel = (WeaponAccuracyLevel)reader.ReadInt();
 
                        if ( m_AccuracyLevel > WeaponAccuracyLevel.Supremely )
                            m_AccuracyLevel = WeaponAccuracyLevel.Accurate;
                    }
 
                    if ( GetSaveFlag( flags, SaveFlag.DurabilityLevel ) )
                    {
                        m_DurabilityLevel = (WeaponDurabilityLevel)reader.ReadInt();
 
                        if ( m_DurabilityLevel > WeaponDurabilityLevel.Indestructible )
                            m_DurabilityLevel = WeaponDurabilityLevel.Durable;
                    }
 
                    if ( GetSaveFlag( flags, SaveFlag.Quality ) )
                        m_Quality = (WeaponQuality)reader.ReadInt();
                    else
                        m_Quality = WeaponQuality.Regular;
 
                    if ( GetSaveFlag( flags, SaveFlag.Hits ) )
                        m_Hits = reader.ReadInt();
 
                    if ( GetSaveFlag( flags, SaveFlag.MaxHits ) )
                        m_MaxHits = reader.ReadInt();
 
                    if ( GetSaveFlag( flags, SaveFlag.Slayer ) )
                        m_Slayer = (SlayerName)reader.ReadInt();
 
                    if ( GetSaveFlag( flags, SaveFlag.Poison ) )
                        m_Poison = Poison.Deserialize( reader );
 
                    if ( GetSaveFlag( flags, SaveFlag.PoisonCharges ) )
                        m_PoisonCharges = reader.ReadInt();
 
                    if ( GetSaveFlag( flags, SaveFlag.Crafter ) )
                        m_Crafter = reader.ReadMobile();
 
                    if ( GetSaveFlag( flags, SaveFlag.Identified ) )
                        m_Identified = ( version >= 6 || reader.ReadBool() );
 
                    if ( GetSaveFlag( flags, SaveFlag.StrReq ) )
                        m_StrReq = reader.ReadInt();
                    else
                        m_StrReq = -1;
 
                    if ( GetSaveFlag( flags, SaveFlag.DexReq ) )
                        m_DexReq = reader.ReadInt();
                    else
                        m_DexReq = -1;
 
                    if ( GetSaveFlag( flags, SaveFlag.IntReq ) )
                        m_IntReq = reader.ReadInt();
                    else
                        m_IntReq = -1;
 
                    if ( GetSaveFlag( flags, SaveFlag.MinDamage ) )
                        m_MinDamage = reader.ReadInt();
                    else
                        m_MinDamage = -1;
 
                    if ( GetSaveFlag( flags, SaveFlag.MaxDamage ) )
                        m_MaxDamage = reader.ReadInt();
                    else
                        m_MaxDamage = -1;
 
                    if ( GetSaveFlag( flags, SaveFlag.HitSound ) )
                        m_HitSound = reader.ReadInt();
                    else
                        m_HitSound = -1;
 
                    if ( GetSaveFlag( flags, SaveFlag.MissSound ) )
                        m_MissSound = reader.ReadInt();
                    else
                        m_MissSound = -1;
 
                    if ( GetSaveFlag( flags, SaveFlag.Speed ) )
                    {
                        if ( version < 9 )
                            m_Speed = reader.ReadInt();
                        else
                            m_Speed = reader.ReadFloat();
                    }
                    else
                        m_Speed = -1;
 
                    if ( GetSaveFlag( flags, SaveFlag.MaxRange ) )
                        m_MaxRange = reader.ReadInt();
                    else
                        m_MaxRange = -1;
 
                    if ( GetSaveFlag( flags, SaveFlag.Skill ) )
                        m_Skill = (SkillName)reader.ReadInt();
                    else
                        m_Skill = (SkillName)(-1);
 
                    if ( GetSaveFlag( flags, SaveFlag.Type ) )
                        m_Type = (WeaponType)reader.ReadInt();
                    else
                        m_Type = (WeaponType)(-1);
 
                    if ( GetSaveFlag( flags, SaveFlag.Animation ) )
                        m_Animation = (WeaponAnimation)reader.ReadInt();
                    else
                        m_Animation = (WeaponAnimation)(-1);
 
                    if ( GetSaveFlag( flags, SaveFlag.Resource ) )
                        m_Resource = (CraftResource)reader.ReadInt();
                    else
                        m_Resource = CraftResource.Iron;
 
                    if ( GetSaveFlag( flags, SaveFlag.xAttributes ) )
                        m_AosAttributes = new AosAttributes( this, reader );
                    else
                        m_AosAttributes = new AosAttributes( this );
 
                    if ( GetSaveFlag( flags, SaveFlag.xWeaponAttributes ) )
                        m_AosWeaponAttributes = new AosWeaponAttributes( this, reader );
                    else
                        m_AosWeaponAttributes = new AosWeaponAttributes( this );
 
                    if ( UseSkillMod && m_AccuracyLevel != WeaponAccuracyLevel.Regular && Parent is Mobile )
                    {
                        m_SkillMod = new DefaultSkillMod( AccuracySkill, true, (int)m_AccuracyLevel * 5 );
                        ((Mobile)Parent).AddSkillMod( m_SkillMod );
                    }
 
                    if ( version < 7 && m_AosWeaponAttributes.MageWeapon != 0 )
                        m_AosWeaponAttributes.MageWeapon = 30 - m_AosWeaponAttributes.MageWeapon;
 
                    if ( Core.AOS && m_AosWeaponAttributes.MageWeapon != 0 && m_AosWeaponAttributes.MageWeapon != 30 && Parent is Mobile )
                    {
                        m_MageMod = new DefaultSkillMod( SkillName.Magery, true, -30 + m_AosWeaponAttributes.MageWeapon );
                        ((Mobile)Parent).AddSkillMod( m_MageMod );
                    }
 
                    if ( GetSaveFlag( flags, SaveFlag.PlayerConstructed ) )
                        m_PlayerConstructed = true;
 
                    if( GetSaveFlag( flags, SaveFlag.SkillBonuses ) )
                        m_AosSkillBonuses = new AosSkillBonuses( this, reader );
                    else
                        m_AosSkillBonuses = new AosSkillBonuses( this );
 
                    if( GetSaveFlag( flags, SaveFlag.Slayer2 ) )
                        m_Slayer2 = (SlayerName)reader.ReadInt();
 
                    if( GetSaveFlag( flags, SaveFlag.ElementalDamages ) )
                        m_AosElementDamages = new AosElementAttributes( this, reader );
                    else
                        m_AosElementDamages = new AosElementAttributes( this );
 
                    if( GetSaveFlag( flags, SaveFlag.EngravedText ) )
                        m_EngravedText = reader.ReadString();
 
                    break;
                }
                case 4:
                {
                    m_Slayer = (SlayerName)reader.ReadInt();
 
                    goto case 3;
                }
                case 3:
                {
                    m_StrReq = reader.ReadInt();
                    m_DexReq = reader.ReadInt();
                    m_IntReq = reader.ReadInt();
 
                    goto case 2;
                }
                case 2:
                {
                    m_Identified = reader.ReadBool();
 
                    goto case 1;
                }
                case 1:
                {
                    m_MaxRange = reader.ReadInt();
 
                    goto case 0;
                }
                case 0:
                {
                    if ( version == 0 )
                        m_MaxRange = 1; // default
 
                    if ( version < 5 )
                    {
                        m_Resource = CraftResource.Iron;
                        m_AosAttributes = new AosAttributes( this );
                        m_AosWeaponAttributes = new AosWeaponAttributes( this );
                        m_AosElementDamages = new AosElementAttributes( this );
                        m_AosSkillBonuses = new AosSkillBonuses( this );
                    }
 
                    m_MinDamage = reader.ReadInt();
                    m_MaxDamage = reader.ReadInt();
 
                    m_Speed = reader.ReadInt();
 
                    m_HitSound = reader.ReadInt();
                    m_MissSound = reader.ReadInt();
 
                    m_Skill = (SkillName)reader.ReadInt();
                    m_Type = (WeaponType)reader.ReadInt();
                    m_Animation = (WeaponAnimation)reader.ReadInt();
                    m_DamageLevel = (WeaponDamageLevel)reader.ReadInt();
                    m_AccuracyLevel = (WeaponAccuracyLevel)reader.ReadInt();
                    m_DurabilityLevel = (WeaponDurabilityLevel)reader.ReadInt();
                    m_Quality = (WeaponQuality)reader.ReadInt();
 
                    m_Crafter = reader.ReadMobile();
 
                    m_Poison = Poison.Deserialize( reader );
                    m_PoisonCharges = reader.ReadInt();
 
                    if ( m_StrReq == OldStrengthReq )
                        m_StrReq = -1;
 
                    if ( m_DexReq == OldDexterityReq )
                        m_DexReq = -1;
 
                    if ( m_IntReq == OldIntelligenceReq )
                        m_IntReq = -1;
 
                    if ( m_MinDamage == OldMinDamage )
                        m_MinDamage = -1;
 
                    if ( m_MaxDamage == OldMaxDamage )
                        m_MaxDamage = -1;
 
                    if ( m_HitSound == OldHitSound )
                        m_HitSound = -1;
 
                    if ( m_MissSound == OldMissSound )
                        m_MissSound = -1;
 
                    if ( m_Speed == OldSpeed )
                        m_Speed = -1;
 
                    if ( m_MaxRange == OldMaxRange )
                        m_MaxRange = -1;
 
                    if ( m_Skill == OldSkill )
                        m_Skill = (SkillName)(-1);
 
                    if ( m_Type == OldType )
                        m_Type = (WeaponType)(-1);
 
                    if ( m_Animation == OldAnimation )
                        m_Animation = (WeaponAnimation)(-1);
 
                    if ( UseSkillMod && m_AccuracyLevel != WeaponAccuracyLevel.Regular && Parent is Mobile )
                    {
                        m_SkillMod = new DefaultSkillMod( AccuracySkill, true, (int)m_AccuracyLevel * 5);
                        ((Mobile)Parent).AddSkillMod( m_SkillMod );
                    }
 
                    break;
                }
            }
 
Top