All pastes #180049 Raw Edit

petbox

public text v1 · immutable
#180049 ·published 2006-09-22 19:38 UTC
rendered paste body
using System;
using System.Collections;
using Server.Multis;
using Server.Mobiles;
using Server.Network;

namespace Server.Items
{
    [DynamicFliping]
    [Flipable(0x9A8, 0xE80)]
    public class PetJailBox : LockableContainer
    {
        private int m_ReleaseFee;
        
        public override int DefaultGumpID { get { return 0x4B; } }
        public override int DefaultDropSound { get { return 0x42; } }

        [CommandProperty(AccessLevel.GameMaster)]
        public int ReleaseFee
        {
            get {return m_ReleaseFee; }
            set { m_ReleaseFee = value; InvalidateProperties(); }
        }

        public override Rectangle2D Bounds
        {
            get { return new Rectangle2D(16, 51, 168, 73); }
        }

        [Constructable]
        public PetJailBox() : base(0x9A8)
        {
            Weight = 3.0; // TODO: Real weight
			ReleaseFee = 300000;
        }

        public PetJailBox(Serial serial) : base(serial)
        {
        }

        public override void OnDoubleClick(Mobile from)
        {
            if (from.AccessLevel > AccessLevel.Counselor )
                Open(from);  // GameMaster and higher opens the box
            else if (from.AccessLevel > AccessLevel.Player || from.InRange(this.GetWorldLocation(), 2))
                Server.Gumps.PetJailGump.OpenJailList(from,this,m_ReleaseFee); // Councelors and Players get a gump with their pets listed
            else
                from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
        }

        public override bool TryDropItem(Mobile from, Item dropped, bool sendFullMessage)
        {
            if (!(dropped is Xanthos.Evo.ShrinkItem))
            {
                from.SendMessage("Only shrunken pets may be placed in jail.");
                return false;
            }

            DropItem(dropped);

            return true;
        }

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

            writer.Write((int)1); // version
			writer.Write((int)m_ReleaseFee);
        }

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

            int version = reader.ReadInt();
			switch(version){
				case 1:
					m_ReleaseFee = reader.ReadInt();
					break;
			}
        }
    }
}

namespace Server.Gumps
{
	public class PetJailGump : Gump
	{
		[Description( "Lists all jailed pets within container." )]
		public static void OpenJailList( Mobile from, Item box, int Fee )
		{
			from.SendGump( new PetJailGump( from, box, Fee) );
        }

        #region declarations
        public static bool OldStyle = PropsConfig.OldStyle;

		public const int GumpOffsetX = PropsConfig.GumpOffsetX;
		public const int GumpOffsetY = PropsConfig.GumpOffsetY;

		public const int TextHue = PropsConfig.TextHue;
		public const int TextOffsetX = PropsConfig.TextOffsetX;

		public const int OffsetGumpID = PropsConfig.OffsetGumpID;
		public const int HeaderGumpID = PropsConfig.HeaderGumpID;
		public const int  EntryGumpID = PropsConfig.EntryGumpID;
		public const int   BackGumpID = PropsConfig.BackGumpID;
		public const int    SetGumpID = PropsConfig.SetGumpID;

		public const int SetWidth = PropsConfig.SetWidth;
		public const int SetOffsetX = PropsConfig.SetOffsetX, SetOffsetY = PropsConfig.SetOffsetY;
		public const int SetButtonID1 = PropsConfig.SetButtonID1;
		public const int SetButtonID2 = PropsConfig.SetButtonID2;

		public const int PrevWidth = PropsConfig.PrevWidth;
		public const int PrevOffsetX = PropsConfig.PrevOffsetX, PrevOffsetY = PropsConfig.PrevOffsetY;
		public const int PrevButtonID1 = PropsConfig.PrevButtonID1;
		public const int PrevButtonID2 = PropsConfig.PrevButtonID2;

		public const int NextWidth = PropsConfig.NextWidth;
		public const int NextOffsetX = PropsConfig.NextOffsetX, NextOffsetY = PropsConfig.NextOffsetY;
		public const int NextButtonID1 = PropsConfig.NextButtonID1;
		public const int NextButtonID2 = PropsConfig.NextButtonID2;

		public const int OffsetSize = PropsConfig.OffsetSize;

		public const int EntryHeight = PropsConfig.EntryHeight;
		public const int BorderSize = PropsConfig.BorderSize;

		private static bool PrevLabel = false, NextLabel = false;

		private const int PrevLabelOffsetX = PrevWidth + 1;
		private const int PrevLabelOffsetY = 0;

		private const int NextLabelOffsetX = -29;
		private const int NextLabelOffsetY = 0;

		private const int EntryWidth = 180;
		private const int EntryCount = 15;

		private const int TotalWidth = OffsetSize + EntryWidth + OffsetSize + SetWidth + OffsetSize;
		private const int TotalHeight = OffsetSize + ((EntryHeight + OffsetSize) * (EntryCount + 1));

		private const int BackWidth = BorderSize + TotalWidth + BorderSize;
		private const int BackHeight = BorderSize + TotalHeight + BorderSize;

		private Mobile m_Owner;
		private ArrayList m_Mobiles;
		private int m_Page;
        private int m_fee = 0;
        #endregion

        public PetJailGump(Mobile owner, Item box, int Fee) : this(owner, BuildList(owner, box), 0, Fee)
		{
		}

		public PetJailGump( Mobile owner, ArrayList list, int page, int Fee) : base( GumpOffsetX, GumpOffsetY )
		{
			owner.CloseGump( typeof( PetJailGump ) );

			m_Owner = owner;
			m_Mobiles = list;
            m_fee = Fee;

			Initialize( page);
		}

		public static ArrayList BuildList( Mobile owner, Item box )
		{
			ArrayList list = new ArrayList();
            if (box.Items.Count == 0)
                return list;
             ArrayList itemlist = box.Items;

			for ( int i = 0; i < itemlist.Count; ++i )
			{

                Xanthos.Evo.ShrinkItem m = (Xanthos.Evo.ShrinkItem)itemlist[i];

				if ( m != null && m.Visible && m.Owner == owner )
					list.Add( m );
			}

			return list;
		}

        public void Initialize(int page)
		{
			m_Page = page;

			int count = m_Mobiles.Count - (page * EntryCount);

			if ( count < 0 )
				count = 0;
			else if ( count > EntryCount )
				count = EntryCount;

			int totalHeight = OffsetSize + ((EntryHeight + OffsetSize) * (count + 1));

			AddPage( 0 );

			AddBackground( 0, 0, BackWidth, BorderSize + totalHeight + BorderSize, BackGumpID );
			AddImageTiled( BorderSize, BorderSize, TotalWidth - (OldStyle ? SetWidth + OffsetSize : 0), totalHeight, OffsetGumpID );

			int x = BorderSize + OffsetSize;
			int y = BorderSize + OffsetSize;

			int emptyWidth = TotalWidth - PrevWidth - NextWidth - (OffsetSize * 4) - (OldStyle ? SetWidth + OffsetSize : 0);

			if ( !OldStyle )
				AddImageTiled( x - (OldStyle ? OffsetSize : 0), y, emptyWidth + (OldStyle ? OffsetSize * 2 : 0), EntryHeight, EntryGumpID );

			AddLabel( x + TextOffsetX, y, TextHue, String.Format( "Page {0} of {1} ({2})", page+1, (m_Mobiles.Count + EntryCount - 1) / EntryCount, m_Mobiles.Count ) );

			x += emptyWidth + OffsetSize;

			if ( OldStyle )
				AddImageTiled( x, y, TotalWidth - (OffsetSize * 3) - SetWidth, EntryHeight, HeaderGumpID );
			else
				AddImageTiled( x, y, PrevWidth, EntryHeight, HeaderGumpID );

			if ( page > 0 )
			{
				AddButton( x + PrevOffsetX, y + PrevOffsetY, PrevButtonID1, PrevButtonID2, 1, GumpButtonType.Reply, 0 );

				if ( PrevLabel )
					AddLabel( x + PrevLabelOffsetX, y + PrevLabelOffsetY, TextHue, "Previous" );
			}

			x += PrevWidth + OffsetSize;

			if ( !OldStyle )
				AddImageTiled( x, y, NextWidth, EntryHeight, HeaderGumpID );

			if ( (page + 1) * EntryCount < m_Mobiles.Count )
			{
				AddButton( x + NextOffsetX, y + NextOffsetY, NextButtonID1, NextButtonID2, 2, GumpButtonType.Reply, 1 );

				if ( NextLabel )
					AddLabel( x + NextLabelOffsetX, y + NextLabelOffsetY, TextHue, "Next" );
			}

			for ( int i = 0, index = page * EntryCount; i < EntryCount && index < m_Mobiles.Count; ++i, ++index )
			{
                Xanthos.Evo.ShrinkItem m = (Xanthos.Evo.ShrinkItem)m_Mobiles[index];

				x = BorderSize + OffsetSize;
				y += EntryHeight + OffsetSize;

                AddImageTiled( x, y, EntryWidth, EntryHeight, EntryGumpID );
                AddLabelCropped(x + TextOffsetX, y, EntryWidth - TextOffsetX, EntryHeight, 0x58, m.Deleted ? "(deleted)" : m.ShrunkenPet.Name);

				x += EntryWidth + OffsetSize;

				if ( SetGumpID != 0 )
					AddImageTiled( x, y, SetWidth, EntryHeight, SetGumpID );

                AddButton( x + SetOffsetX, y + SetOffsetY, SetButtonID1, SetButtonID2, i + 3, GumpButtonType.Reply, 0 );
			}
		}

		public override void OnResponse( NetState state, RelayInfo info )
		{
			Mobile from = state.Mobile;

			switch ( info.ButtonID )
			{
				case 0: // Closed
				{
					return;
				}
				case 1: // Previous
				{
					if ( m_Page > 0 )
						from.SendGump( new PetJailGump( from, m_Mobiles, m_Page - 1 , m_fee ) );
					break;
				}
				case 2: // Next
				{
					if ( (m_Page + 1) * EntryCount < m_Mobiles.Count )
						from.SendGump( new PetJailGump( from, m_Mobiles, m_Page + 1, m_fee ) );
					break;
				}
				default:
				{
					int index = (m_Page * EntryCount) + (info.ButtonID - 3);

					if ( index >= 0 && index < m_Mobiles.Count )
					{
                        Xanthos.Evo.ShrinkItem m = (Xanthos.Evo.ShrinkItem)m_Mobiles[index];

						if ( m.Deleted )
						{
							from.SendMessage( "That has been deleted." );
							from.SendGump( new PetJailGump( from, m_Mobiles, m_Page, m_fee ) );
						}
						else if ( m.Visible )
						{
                            if (m.Owner == from)
                            {
                                if (from.Backpack.ConsumeTotal(typeof(Gold), m_fee))
                                {
                                    from.AddToBackpack(m);
                                    return;
                                }
                                if (from.BankBox.ConsumeTotal(typeof(Gold), m_fee))
                                {
                                    from.AddToBackpack(m);
                                    return;
                                }
                                from.SendMessage("You cannot afford to release this pet.");
                            }
                            else
                            {
                                from.SendMessage("That is not your pet.");
                            }
                        }
						else
						{
							from.SendMessage( "You cannot see that." );
							from.SendGump( new PetJailGump( from, m_Mobiles, m_Page, m_fee ) );
						}
					}

					break;
				}
			}
		}
	}
}