RunUO/Scripts/Items/Special/Solen Items/BraceletOfBinding.cs

474 lines
No EOL
12 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using Server;
using Server.ContextMenus;
using Server.Network;
using Server.Prompts;
using Server.Targeting;
using Server.Spells;
using Server.Mobiles;
namespace Server.Items
{
public class BraceletOfBinding : BaseBracelet, TranslocationItem
{
private int m_Charges;
private int m_Recharges;
private string m_Inscription;
private BraceletOfBinding m_Bound;
private TransportTimer m_Timer;
[CommandProperty( AccessLevel.GameMaster )]
public int Charges
{
get{ return m_Charges; }
set
{
if ( value > this.MaxCharges )
m_Charges = this.MaxCharges;
else if ( value < 0 )
m_Charges = 0;
else
m_Charges = value;
InvalidateProperties();
}
}
[CommandProperty( AccessLevel.GameMaster )]
public int Recharges
{
get{ return m_Recharges; }
set
{
if ( value > this.MaxRecharges )
m_Recharges = this.MaxRecharges;
else if ( value < 0 )
m_Recharges = 0;
else
m_Recharges = value;
InvalidateProperties();
}
}
[CommandProperty( AccessLevel.GameMaster )]
public int MaxCharges{ get{ return 20; } }
[CommandProperty( AccessLevel.GameMaster )]
public int MaxRecharges{ get{ return 255; } }
public string TranslocationItemName{ get{ return "bracelet of binding"; } }
[CommandProperty( AccessLevel.GameMaster )]
public string Inscription
{
get{ return m_Inscription; }
set
{
m_Inscription = value;
InvalidateProperties();
}
}
[CommandProperty( AccessLevel.GameMaster )]
public BraceletOfBinding Bound
{
get
{
if ( m_Bound != null && m_Bound.Deleted )
m_Bound = null;
return m_Bound;
}
set{ m_Bound = value; }
}
[Constructable]
public BraceletOfBinding() : base( 0x1086 )
{
Hue = 0x489;
Weight = 1.0;
m_Inscription = "";
}
public override void AddNameProperty( ObjectPropertyList list )
{
list.Add( 1054000, m_Charges.ToString() + ( m_Inscription.Length == 0 ? "\t " : " :\t" + m_Inscription ) ); // a bracelet of binding : ~1_val~ ~2_val~
}
public override void OnSingleClick( Mobile from )
{
LabelTo( from, 1054000, m_Charges.ToString() + ( m_Inscription.Length == 0 ? "\t " : " :\t" + m_Inscription ) ); // a bracelet of binding : ~1_val~ ~2_val~
}
public override void GetContextMenuEntries( Mobile from, List<ContextMenuEntry> list )
{
base.GetContextMenuEntries( from, list );
if ( from.Alive && this.IsChildOf( from ) )
{
BraceletOfBinding bound = this.Bound;
list.Add( new BraceletEntry( new BraceletCallback( Activate ), 6170, bound != null ) );
list.Add( new BraceletEntry( new BraceletCallback( Search ), 6171, bound != null ) );
list.Add( new BraceletEntry( new BraceletCallback( Bind ), bound == null ? 6173 : 6174, true ) );
list.Add( new BraceletEntry( new BraceletCallback( Inscribe ), 6175, true ) );
}
}
private delegate void BraceletCallback( Mobile from );
private class BraceletEntry : ContextMenuEntry
{
private BraceletCallback m_Callback;
public BraceletEntry( BraceletCallback callback, int number, bool enabled ) : base( number )
{
m_Callback = callback;
if ( !enabled )
Flags |= CMEFlags.Disabled;
}
public override void OnClick()
{
Mobile from = Owner.From;
if ( from.CheckAlive() )
m_Callback( from );
}
}
public override void OnDoubleClick( Mobile from )
{
BraceletOfBinding bound = this.Bound;
if ( Bound == null )
{
Bind( from );
}
else
{
Activate( from );
}
}
public void Activate( Mobile from )
{
BraceletOfBinding bound = this.Bound;
if ( Deleted || bound == null )
return;
if ( !this.IsChildOf( from ) )
{
from.SendLocalizedMessage( 1042664 ); // You must have the object in your backpack to use it.
}
else if ( m_Timer != null )
{
from.SendLocalizedMessage( 1054013 ); // The bracelet is already attempting contact. You decide to wait a moment.
}
else
{
from.PlaySound( 0xF9 );
from.LocalOverheadMessage( MessageType.Regular, 0x5D, true, "* You concentrate on the bracelet to summon its power *" );
from.Frozen = true;
m_Timer = new TransportTimer( this, from );
m_Timer.Start();
}
}
private class TransportTimer : Timer
{
private BraceletOfBinding m_Bracelet;
private Mobile m_From;
public TransportTimer( BraceletOfBinding bracelet, Mobile from ) : base( TimeSpan.FromSeconds( 2.0 ) )
{
m_Bracelet = bracelet;
m_From = from;
}
protected override void OnTick()
{
m_Bracelet.m_Timer = null;
m_From.Frozen = false;
if ( m_Bracelet.Deleted || m_From.Deleted )
return;
if ( m_Bracelet.CheckUse( m_From, false ) )
{
Mobile boundRoot = m_Bracelet.Bound.RootParent as Mobile;
if ( boundRoot != null )
{
m_Bracelet.Charges--;
BaseCreature.TeleportPets( m_From, boundRoot.Location, boundRoot.Map, true );
m_From.PlaySound( 0x1FC );
m_From.MoveToWorld( boundRoot.Location, boundRoot.Map );
m_From.PlaySound( 0x1FC );
}
}
}
}
public void Search( Mobile from )
{
BraceletOfBinding bound = this.Bound;
if ( Deleted || bound == null )
return;
if ( !this.IsChildOf( from ) )
{
from.SendLocalizedMessage( 1042664 ); // You must have the object in your backpack to use it.
}
else
{
CheckUse( from, true );
}
}
private bool CheckUse( Mobile from, bool successMessage )
{
BraceletOfBinding bound = this.Bound;
if ( bound == null )
return false;
Mobile boundRoot = bound.RootParent as Mobile;
if ( Charges == 0 )
{
from.SendLocalizedMessage( 1054005 ); // The bracelet glows black. It must be charged before it can be used again.
return false;
}
else if ( from.FindItemOnLayer( Layer.Bracelet ) != this )
{
from.SendLocalizedMessage( 1054004 ); // You must equip the bracelet in order to use its power.
return false;
}
else if ( boundRoot == null || boundRoot.NetState == null || boundRoot.FindItemOnLayer( Layer.Bracelet ) != bound )
{
from.SendLocalizedMessage( 1054006 ); // The bracelet emits a red glow. The bracelet's twin is not available for transport.
return false;
}
else if ( !Core.AOS && from.Map != boundRoot.Map )
{
from.SendLocalizedMessage( 1054014 ); // The bracelet glows black. The bracelet's target is on another facet.
return false;
}
else if ( Factions.Sigil.ExistsOn( from ) )
{
from.SendLocalizedMessage( 1061632 ); // You can't do that while carrying the sigil.
return false;
}
else if ( !SpellHelper.CheckTravel( from, TravelCheckType.RecallFrom ) )
{
return false;
}
else if ( !SpellHelper.CheckTravel( from, boundRoot.Map, boundRoot.Location, TravelCheckType.RecallTo ) )
{
return false;
}
else if ( boundRoot.Map == Map.Felucca && from is PlayerMobile && ((PlayerMobile)from).Young )
{
from.SendLocalizedMessage( 1049543 ); // You decide against traveling to Felucca while you are still young.
return false;
}
else if ( from.Kills >= 5 && boundRoot.Map != Map.Felucca )
{
from.SendLocalizedMessage( 1019004 ); // You are not allowed to travel there.
return false;
}
else if ( from.Criminal )
{
from.SendLocalizedMessage( 1005561, "", 0x22 ); // Thou'rt a criminal and cannot escape so easily.
return false;
}
else if ( SpellHelper.CheckCombat( from ) )
{
from.SendLocalizedMessage( 1005564, "", 0x22 ); // Wouldst thou flee during the heat of battle??
return false;
}
else if ( Server.Misc.WeightOverloading.IsOverloaded( from ) )
{
from.SendLocalizedMessage( 502359, "", 0x22 ); // Thou art too encumbered to move.
return false;
}
else if ( from.Region.IsPartOf( typeof( Server.Regions.Jail ) ) )
{
from.SendLocalizedMessage( 1114345, "", 0x35 ); // You'll need a better jailbreak plan than that!
return false;
}
else if ( boundRoot.Region.IsPartOf( typeof( Server.Regions.Jail ) ) )
{
from.SendLocalizedMessage( 1019004 ); // You are not allowed to travel there.
return false;
}
else
{
if ( successMessage )
from.SendLocalizedMessage( 1054015 ); // The bracelet's twin is available for transport.
return true;
}
}
public void Bind( Mobile from )
{
if ( Deleted )
return;
if ( !this.IsChildOf( from ) )
{
from.SendLocalizedMessage( 1042664 ); // You must have the object in your backpack to use it.
}
else
{
from.SendLocalizedMessage( 1054001 ); // Target the bracelet of binding you wish to bind this bracelet to.
from.Target = new BindTarget( this );
}
}
private class BindTarget : Target
{
private BraceletOfBinding m_Bracelet;
public BindTarget( BraceletOfBinding bracelet ) : base( -1, false, TargetFlags.None )
{
m_Bracelet = bracelet;
}
protected override void OnTarget( Mobile from, object targeted )
{
if ( m_Bracelet.Deleted )
return;
if ( !m_Bracelet.IsChildOf( from ) )
{
from.SendLocalizedMessage( 1042664 ); // You must have the object in your backpack to use it.
}
else if ( targeted is BraceletOfBinding )
{
BraceletOfBinding bindBracelet = (BraceletOfBinding)targeted;
if ( bindBracelet == m_Bracelet )
{
from.SendLocalizedMessage( 1054012 ); // You cannot bind a bracelet of binding to itself!
}
else if ( !bindBracelet.IsChildOf( from ) )
{
from.SendLocalizedMessage( 1042664 ); // You must have the object in your backpack to use it.
}
else
{
from.SendLocalizedMessage( 1054003 ); // You bind the bracelet to its counterpart. The bracelets glow with power.
from.PlaySound( 0x1FA );
m_Bracelet.Bound = bindBracelet;
}
}
else
{
from.SendLocalizedMessage( 1054002 ); // You can only bind this bracelet to another bracelet of binding!
}
}
}
public void Inscribe( Mobile from )
{
if ( Deleted )
return;
if ( !this.IsChildOf( from ) )
{
from.SendLocalizedMessage( 1042664 ); // You must have the object in your backpack to use it.
}
else
{
from.SendLocalizedMessage( 1054009 ); // Enter the text to inscribe upon the bracelet :
from.Prompt = new InscribePrompt( this );
}
}
private class InscribePrompt : Prompt
{
private BraceletOfBinding m_Bracelet;
public InscribePrompt( BraceletOfBinding bracelet )
{
m_Bracelet = bracelet;
}
public override void OnResponse( Mobile from, string text )
{
if ( m_Bracelet.Deleted )
return;
if ( !m_Bracelet.IsChildOf( from ) )
{
from.SendLocalizedMessage( 1042664 ); // You must have the object in your backpack to use it.
}
else
{
from.SendLocalizedMessage( 1054011 ); // You mark the bracelet with your inscription.
m_Bracelet.Inscription = text;
}
}
public override void OnCancel( Mobile from )
{
from.SendLocalizedMessage( 1054010 ); // You decide not to inscribe the bracelet at this time.
}
}
public BraceletOfBinding( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.WriteEncodedInt( (int) 1 ); // version
writer.WriteEncodedInt( (int) m_Recharges );
writer.WriteEncodedInt( (int) m_Charges );
writer.Write( (string) m_Inscription );
writer.Write( (Item) this.Bound );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadEncodedInt();
switch ( version )
{
case 1:
{
m_Recharges = reader.ReadEncodedInt();
goto case 0;
}
case 0:
{
m_Charges = Math.Min( reader.ReadEncodedInt(), MaxCharges );
m_Inscription = reader.ReadString();
this.Bound = (BraceletOfBinding) reader.ReadItem();
break;
}
}
}
}
}