The Bracelet of Binding didn't show its attributes m_Charges (Charges) and m_Description (Inscription). Furthermore, I couldn't live with "binded" for "bound". This is a corrected version:
[code:1]
using System;
using Server.Network;
using Server.ContextMenus;
using System.Collections;
using Server.Targeting;
using Server.Prompts;
namespace Server.Items
{
public class BraceletOfBinding : Item
{
private string m_Description = "";
private Item m_Bound;
private int m_Charges;
[CommandProperty( AccessLevel.Counselor, AccessLevel.GameMaster )]
public int Charges
{
get
{
return m_Charges;
}
set
{
m_Charges = value;
InvalidateProperties();
}
}
[CommandProperty( AccessLevel.Counselor, AccessLevel.GameMaster )]
public string Description
{
get
{
return m_Description;
}
set
{
m_Description = value;
InvalidateProperties();
}
}
[CommandProperty( AccessLevel.Counselor, AccessLevel.GameMaster )]
public Item Bound
{
get
{
return m_Bound;
}
set
{
m_Bound = value;
InvalidateProperties();
}
}
[Constructable]
public BraceletOfBinding() : base(0x1086)
{
Weight = 0.5;
Name = "a bracelet of binding";
Hue = 0x489;
Layer = Layer.Bracelet;
}
public class ActivateEntry : ContextMenuEntry
{
private Mobile m_From;
private BraceletOfBinding m_BraceletOfBinding;
private Item m_Item;
public ActivateEntry( Mobile from, BraceletOfBinding braceletofbinding ) : base( 6170, 1 )
{
m_From = from;
m_BraceletOfBinding = braceletofbinding;
}
public override void OnClick()
{
if (m_BraceletOfBinding.Deleted || !m_BraceletOfBinding.Movable || !m_From.CheckAlive() )
return;
if ( !(m_BraceletOfBinding.Parent is Mobile) )
{
m_From.SendLocalizedMessage( 1054004 ); // Must be equiped to use
}
else
{
m_BraceletOfBinding.GoToTwin( m_From, m_BraceletOfBinding );
}
}
}
public class SearchEntry : ContextMenuEntry
{
private Mobile m_From;
private BraceletOfBinding m_BraceletOfBinding;
private Item m_Item;
public SearchEntry( Mobile from, BraceletOfBinding braceletofbinding ) : base( 6171, 1 )
{
m_From = from;
m_BraceletOfBinding = braceletofbinding;
}
public override void OnClick()
{
if (m_BraceletOfBinding.Deleted || !m_BraceletOfBinding.Movable || !m_From.CheckAlive() )
return;
if ( !(m_BraceletOfBinding.Parent is Mobile) )
{
m_From.SendLocalizedMessage( 1054004 ); // Must be equiped to use
}
else
{
m_BraceletOfBinding.SearchTwin( m_From, m_BraceletOfBinding );
}
}
}
public virtual void SearchTwin( Mobile from, BraceletOfBinding braceletofbinding )
{
Item twin = braceletofbinding.Bound;
if ( twin == null || !(twin.Parent is Mobile) )
{
from.SendLocalizedMessage( 1054006 );
}
else if ( ((Mobile)twin.Parent).Map != from.Map )
{
from.SendLocalizedMessage( 1054014 );
}
else
{
from.SendLocalizedMessage( 1054015 );
}
}
public virtual void GoToTwin( Mobile from, BraceletOfBinding braceletofbinding )
{
if ( braceletofbinding.Charges > 0 )
{
Item twin = braceletofbinding.Bound;
if ( twin == null || !(twin.Parent is Mobile) )
{
from.SendLocalizedMessage( 1054006 );
}
else if ( ((Mobile)twin.Parent).Map != from.Map )
{
from.SendLocalizedMessage( 1054014 );
}
else
{
from.SendLocalizedMessage( 1054015 );
Effects.SendLocationParticles( EffectItem.Create( from.Location, from.Map, EffectItem.DefaultDuration ), 0x3728, 10, 10, 2023 );
from.Location = ((Mobile)twin.Parent).Location;
from.PlaySound( 0x1FC );
braceletofbinding.Charges--;
}
}
else
{
from.SendLocalizedMessage( 1054005 );
}
}
public class BindEntry : ContextMenuEntry
{
private Mobile m_From;
private BraceletOfBinding m_BraceletOfBinding;
private Item m_Item;
public BindEntry( Mobile from, BraceletOfBinding braceletofbinding ) : base( 6173, 1 )
{
m_From = from;
m_BraceletOfBinding = braceletofbinding;
}
public override void OnClick()
{
if (m_BraceletOfBinding.Deleted || !m_BraceletOfBinding.Movable || !m_From.CheckAlive() )
return;
int number;
if ( !m_BraceletOfBinding.IsChildOf( m_From.Backpack ) )
{
number = 1042001; // That must be in your pack for you to use it.
}
else
{
number = 1054001; // Target BoB to bind to...
m_From.Target = new InternalTarget( m_BraceletOfBinding, m_Item );
}
m_From.SendLocalizedMessage( number );
}
}
public class InscribeEntry : ContextMenuEntry
{
private Mobile m_From;
private BraceletOfBinding m_BraceletOfBinding;
public InscribeEntry( Mobile from, BraceletOfBinding braceletofbinding ) : base( 6175, 1 )
{
m_From = from;
m_BraceletOfBinding = braceletofbinding;
}
public override void OnClick()
{
if (m_BraceletOfBinding.Deleted || !m_BraceletOfBinding.Movable || !m_From.CheckAlive() )
return;
int number;
if ( !m_BraceletOfBinding.IsChildOf( m_From.Backpack ) )
{
number = 1042001; // That must be in your pack for you to use it.
}
else
{
number = 1054009; // Please enter a description for this bracelet.
m_From.Prompt = new RenamePrompt( m_BraceletOfBinding );
}
m_From.SendLocalizedMessage( number );
}
}
private class InternalTarget : Target
{
private Item m_Item;
private BraceletOfBinding m_BraceletOfBinding;
public InternalTarget( BraceletOfBinding braceletofbinding, Item item ) : base ( 2, false, TargetFlags.None )
{
m_Item = item;
m_BraceletOfBinding = braceletofbinding;
}
protected override void OnTarget( Mobile from, object targeted )
{
if ( targeted is BraceletOfBinding )
{
if ( targeted == m_BraceletOfBinding )
{
from.SendLocalizedMessage( 1054012 );
}
else
{
BraceletOfBinding brace = (BraceletOfBinding)targeted;
m_BraceletOfBinding.Bound = brace;
from.SendLocalizedMessage( 1054003 );
from.PlaySound( 0x1FA );
}
}
else
{
from.SendLocalizedMessage( 1054002 );
}
}
}
private class RenamePrompt : Prompt
{
private BraceletOfBinding m_BraceletOfBinding;
public RenamePrompt( BraceletOfBinding braceletofbinding )
{
m_BraceletOfBinding = braceletofbinding;
}
public override void OnResponse( Mobile from, string text )
{
m_BraceletOfBinding.Description = text;
}
}
public override void GetContextMenuEntries( Mobile from, ArrayList list )
{
base.GetContextMenuEntries( from, list );
if ( from.Alive )
list.Add( new ActivateEntry( from, this ) );
if ( from.Alive )
list.Add( new SearchEntry( from, this ) );
if ( from.Alive )
list.Add( new BindEntry( from, this ) );
if ( from.Alive )
list.Add( new InscribeEntry( from, this ) );
}
public override void OnSingleClick( Mobile from )
{
string chrg = m_Charges.ToString();
string desc = m_Description;
if ( desc == null ) { desc = ""; }
LabelTo( from, 1054000, String.Format( "{0}\t{1}", m_Charges, m_Description ) );
}
public override void GetProperties( ObjectPropertyList list )
{
base.GetProperties( list );
list.Add( 1060658, "charges\t{0}", this.m_Charges ); // ~1_val~: ~2_val~
if (this.m_Description != ""
list.Add( 1060660, "inscription\t{0}", this.m_Description ); // ~1_val~: ~2_val~
}
public override void OnDoubleClick( Mobile from )
{
if ( !(this.Parent is Mobile) )
{
from.SendLocalizedMessage( 1054004 ); // Must be equiped to use
}
else
{
this.GoToTwin( from, this );
}
}
public BraceletOfBinding( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
writer.Write( (string) m_Description );
writer.Write( (Item) m_Bound );
writer.Write( (int) m_Charges );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch ( version )
{
case 0:
{
m_Description = reader.ReadString();
m_Bound = reader.ReadItem();
m_Charges = reader.ReadInt();
break;
}
}
}
}
}
[/code:1]