Hello,just asking the correct way to add atachment inside a script (deed).I adviced how to add a simple atachment in treasure map decoder:
Example code:
Now i wish to use atachment from the XML atachments resource,example (XML weapon attribute):
Can anyone write here the way to add atachment to an item when target it from a deed?Thank you!
Example code:
C#:
TMapDecoderXmlAtt tmd = (TMapDecoderXmlAtt)XmlAttach.FindAttachment(item, typeof(TMapDecoderXmlAtt));
if ( tmd == null && this.Uses > 0 )
{
XmlAttach.AttachTo(item, new TMapDecoderXmlAtt());
this.Uses--;
this.InvalidateProperties();
C#:
using System;
using Server;
using Server.Items;
using Server.Network;
using Server.Mobiles;
using System.Reflection;
namespace Server.Engines.XmlSpawner2
{
public class XmlWeaponAbility : XmlAttachment
{
private WeaponAbility m_Ability = null; // default data
public WeaponAbility WeaponAbility
{
get { return m_Ability; }
set { m_Ability = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public string Ability
{
get
{
if (m_Ability != null)
{
return m_Ability.GetType().Name;
}
else
{
return null;
}
}
set
{
if (value != null)
{
FieldInfo finfo = typeof(WeaponAbility).GetField(value);
if (finfo != null && finfo.IsStatic && finfo.FieldType == typeof(WeaponAbility))
{
try
{
m_Ability = (WeaponAbility)finfo.GetValue(null);
}
catch { }
}
}
else
{
m_Ability = null;
}
}
}
// These are the various ways in which the message attachment can be constructed.
// These can be called via the [addatt interface, via scripts, via the spawner ATTACH keyword.
// Other overloads could be defined to handle other types of arguments
// a serial constructor is REQUIRED
public XmlWeaponAbility(ASerial serial) : base(serial)
{
}
[Attachable]
public XmlWeaponAbility(string weaponability)
{
Ability = weaponability;
}
[Attachable]
public XmlWeaponAbility(string name, string weaponability)
{
Name = name;
Ability = weaponability;
}
[Attachable]
public XmlWeaponAbility(string name, string weaponability, double expiresin)
{
Name = name;
Ability = weaponability;
Expiration = TimeSpan.FromMinutes(expiresin); //
}
public override void Serialize( GenericWriter writer )
{
base.Serialize(writer);
writer.Write( (int) 0 );
// version 0
writer.Write(Ability);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
// version 0
Ability = reader.ReadString();
}
public override string OnIdentify(Mobile from)
{
if(from == null || from.AccessLevel == AccessLevel.Player) return null;
if(Expiration > TimeSpan.Zero)
{
return String.Format("{2}: Weapon ability {0} expires in {1} mins", Ability, Expiration.TotalMinutes, Name);
}
else
{
return String.Format("{1}: Weapon ability {0}", Ability, Name);
}
}
}
}