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; } } } } }