#region AuthorHeader // // FindMobs version 1.5 - utilities version 2.0, by Xanthos // based on the GoByName utility by unknown // #endregion AuthorHeaderusing System; using System; using System.Collections; using Server; using Server.Network; using Server.Mobiles; using Server.Accounting; using Server.Gumps; using Server.Commands; namespace Xanthos.Utilities { public class FindMobsGump : Gump { public const string kCommandName = "FindMobs"; public const int kGumpOffsetX = 30; public const int kGumpOffsetY = 30; public const int kTextHue = 0; public const int kTextOffsetX = 2; public const int kButtonWidth = 20; public const int kOffsetSize = 1; public const int kEntryHeight = 20; public const int kBorderSize = 10; public const int kOffsetGumpID = 0x0052; // Pure black public const int kHeaderGumpID = 0x0E14; // Dark navy blue, textured public const int kEntryGumpID = 0x0BBC; // Light offwhite, textured public const int kBackGumpID = 0x13BE; // Gray slate/stoney public const int kButtonGumpID = 0x0E14; // Dark navy blue, textured public const int kGoOffsetX = 2; public const int kGoOffsetY = 2; public const int kGoButtonID1 = 0x15E1; // Arrow pointing right public const int kGoButtonID2 = 0x15E5; // " pressed public const int kBringOffsetX = 1; public const int kBringOffsetY = 1; public const int kBringButtonID1 = 0x15E3; // 'X' Button public const int kBringButtonID2 = 0x15E7; // " pressed public const int kPrevWidth = 20; public const int kPrevOffsetX = 2; public const int kPrevOffsetY = 2; public const int kPrevButtonID1 = 0x15E3; // Arrow pointing left public const int kPrevButtonID2 = 0x15E7; // " pressed public const int kNextWidth = 20; public const int kNextOffsetX = 2; public const int kNextOffsetY = 2; public const int kNextButtonID1 = 0x15E1; // Arrow pointing right public const int kNextButtonID2 = 0x15E5; // " pressed private const int kMiniGumpButtonID = 7107; private const int kGreenHue = 0x40; private const int kRedHue = 0x20; private const int kPrevLabelOffsetX = kPrevWidth + 1; private const int kPrevLabelOffsetY = 0; private const int kNextLabelOffsetX = -29; private const int kNextLabelOffsetY = 0; private const int kEntryWidth = 500; private const int kEntryCount = 15; private const int kTotalWidth = kOffsetSize + kEntryWidth + kOffsetSize + (kButtonWidth * 2) + kOffsetSize; private const int kTotalHeight = kOffsetSize + ((kEntryHeight + kOffsetSize) * (kEntryCount + 2)); private const int kBackWidth = kBorderSize + kTotalWidth + kBorderSize; private const int kBackHeight = kBorderSize + kTotalHeight + kBorderSize; private static bool s_PrevLabel = false; private static bool s_NextLabel = false; private string m_SearchValue; private int m_Options; private Mobile m_Owner; private ArrayList m_Names; private int m_Page; private string m_Args; private bool m_MiniGump; public static void Initialize() { CommandSystem.Register( kCommandName, AccessLevel.GameMaster, new CommandEventHandler( Find_OnCommand ) ); } [Usage( kCommandName + " [-i] [-p|-t] " )] [Description( "Finds all mobiles by name, -p for players, -t searches by mobiles type name, -i specifies the internal map" )] private static void Find_OnCommand( CommandEventArgs e ) { string str; try { int options = GetOptions( e, out str ); e.Mobile.SendGump( new FindMobsGump( e.Mobile, str, options ) ); } catch { Misc.SendCommandDetails( e.Mobile, kCommandName ); } } public enum FindOptions { None = 0x00, Player = 0x01, Internal = 0x02, Type = 0x04, } private static int GetOptions( CommandEventArgs e, out string searchValue ) { int options = (int)FindOptions.None; searchValue = ""; for ( int i = 0; i < e.Length; i++ ) { string str = e.GetString( i ).ToLower(); if ( str.Equals( "-?" ) ) throw new Exception(); else if ( str.Equals( "-i" ) ) options |= (int)FindOptions.Internal; else if ( str.Equals( "-p" ) ) { options |= (int)FindOptions.Player; options &= ~( (int)FindOptions.Type ); // mutually exclusive, turn off the bit } else if ( str.Equals( "-t" ) ) { options |= (int)FindOptions.Type; options &= ~( (int)FindOptions.Player ); // mutually exclusive, turn off the bit } else searchValue = str; } return options; } public FindMobsGump( Mobile owner, string searchValue, int options ) : this( owner, BuildList( owner, searchValue, options ), 0, searchValue, options, false ) { m_SearchValue = searchValue; m_Options = options; m_MiniGump = false; GenerateArgString(); } public FindMobsGump( Mobile owner, ArrayList list, int page, string searchValue, int options, bool miniGump ) : base( kGumpOffsetX, kGumpOffsetY ) { m_Owner = owner; m_Names = list; m_SearchValue = searchValue; m_Options = options; m_MiniGump = miniGump; owner.CloseGump( typeof( FindMobsGump ) ); GenerateArgString(); Initialize( page ); } public static ArrayList BuildList( Mobile owner, string searchValue, int options ) { ArrayList list = new ArrayList(); bool searchInternal = ((options & (int)FindOptions.Internal) == (int)FindOptions.Internal); bool findPlayers = ((options & (int)FindOptions.Player) == (int)FindOptions.Player); bool findTypes = ((options & (int)FindOptions.Type) == (int)FindOptions.Type); foreach ( Mobile mob in World.Mobiles.Values ) { if ( searchInternal != (Map.Internal == mob.Map) ) continue; else if ( findPlayers && !(mob is PlayerMobile) ) continue; if ( findTypes && searchValue != "" && mob.GetType().Name.ToLower().StartsWith( searchValue ) ) list.Add( mob ); if ( !findTypes && (searchValue == "" || mob.Name.ToLower().StartsWith( searchValue )) ) list.Add( mob ); } return list; } private void GenerateArgString() { bool m_SearchInternal = ( ( m_Options & (int)FindOptions.Internal ) == (int)FindOptions.Internal ); bool m_FindPlayers = ( ( m_Options & (int)FindOptions.Player ) == (int)FindOptions.Player ); bool m_FindTypes = ( ( m_Options & (int)FindOptions.Type ) == (int)FindOptions.Type ); if ( m_SearchValue == "" ) m_Args = "all "; m_Args += m_FindPlayers ? "players" : "mobiles"; m_Args += m_SearchInternal ? " (internal)" : ""; if ( m_SearchValue != "" ) { m_Args += m_FindTypes ? " of type " : " named "; m_Args += m_SearchValue; } } public void Initialize( int page ) { m_Page = page; int count = m_Names.Count - ( page * kEntryCount ); if ( count < 0 ) count = 0; else if ( count > kEntryCount ) count = kEntryCount; if ( m_MiniGump ) { AddPage( 0 ); AddBackground( 0, 0, 40, 40, kBackGumpID ); AddItem( 10, 10, kMiniGumpButtonID, kGreenHue ); } else { int kTotalHeight = kOffsetSize + ( ( kEntryHeight + kOffsetSize ) * ( count + 2 ) ); int x = kBorderSize + kOffsetSize; int y = kBorderSize + kOffsetSize; int emptyWidth = kEntryWidth; AddPage( 0 ); AddBackground( 0, 0, kBackWidth, kBorderSize + kTotalHeight + kBorderSize, kBackGumpID ); AddImageTiled( kBorderSize, kBorderSize, kTotalWidth, kTotalHeight, kOffsetGumpID ); AddImageTiled( x, y, emptyWidth, kEntryHeight, kEntryGumpID ); AddLabel( x + kTextOffsetX, y, kTextHue, string.Format( "Page {0} of {1} ({2}) - Matches for: {3}", page + 1, ( m_Names.Count + kEntryCount - 1 ) / kEntryCount, m_Names.Count, m_Args ) ); x += emptyWidth + kOffsetSize; AddImageTiled( x, y, kPrevWidth, kEntryHeight, kHeaderGumpID ); if ( page > 0 ) { AddButton( x + kPrevOffsetX, y + kPrevOffsetY, kPrevButtonID1, kPrevButtonID2, 1, GumpButtonType.Reply, 0 ); if ( s_PrevLabel ) AddLabel( x + kPrevLabelOffsetX, y + kPrevLabelOffsetY, kTextHue, "Previous" ); } x += kPrevWidth + kOffsetSize; AddImageTiled( x, y, kNextWidth, kEntryHeight, kHeaderGumpID ); if ( ( page + 1 ) * kEntryCount < m_Names.Count ) { AddButton( x + kNextOffsetX, y + kNextOffsetY, kNextButtonID1, kNextButtonID2, 2, GumpButtonType.Reply, 1 ); if ( s_NextLabel ) AddLabel( x + kNextLabelOffsetX, y + kNextLabelOffsetY, kTextHue, "Next" ); } for ( int i = 0, index = page * kEntryCount; i < kEntryCount && index < m_Names.Count; ++i, ++index ) { x = kBorderSize + kOffsetSize; y += kEntryHeight + kOffsetSize; Mobile item = (Mobile)m_Names[ index ]; AddImageTiled( x, y, kEntryWidth, kEntryHeight, kEntryGumpID ); AddLabelCropped( x + kTextOffsetX, y, kEntryWidth - kTextOffsetX, kEntryHeight, 0x58, item.Deleted ? "(deleted)" : ( string.Format( "{0} : {1} : {2} {3}", item.Name, item is PlayerMobile ? ( (Account)item.Account ).Username : "Null", item.Map, item.Location ) ) ); if ( !item.Deleted ) { x += kEntryWidth + kOffsetSize; AddImageTiled( x, y, kButtonWidth, kEntryHeight, kButtonGumpID ); AddButton( x + kBringOffsetX, y + kBringOffsetY, kBringButtonID1, kBringButtonID2, i + 4, GumpButtonType.Reply, 0 ); x += kButtonWidth + kOffsetSize; AddImageTiled( x, y, kButtonWidth, kEntryHeight, kButtonGumpID ); AddButton( x + kGoOffsetX, y + kGoOffsetY, kGoButtonID1, kGoButtonID2, i + 1004, GumpButtonType.Reply, 0 ); } } // AddItem( kBackWidth - 55, ((kEntryHeight + kOffsetSize) * (count + 1)) + 15, kMiniGumpButtonID, kRedHue ); // AddButton( kBackWidth - 55, ( ( kEntryHeight + kOffsetSize ) * ( count + 1 ) ) + 15, 0, 0, 3, GumpButtonType.Reply, 0 ); } } public override void OnResponse( NetState state, RelayInfo info ) { Mobile from = state.Mobile; switch ( info.ButtonID ) { case 0: // Close { return; } case 1: // Previous { if ( m_Page > 0 ) from.SendGump( new FindMobsGump( from, m_Names, m_Page - 1, m_SearchValue, m_Options, false ) ); break; } case 2: // Next { if ( ( m_Page + 1 ) * kEntryCount < m_Names.Count ) from.SendGump( new FindMobsGump( from, m_Names, m_Page + 1, m_SearchValue, m_Options, false ) ); break; } case 3: // MiniGump toggle { from.SendGump( new FindMobsGump( from, m_Names, m_Page, m_SearchValue, m_Options, !m_MiniGump ) ); break; } default: { int index = (m_Page * kEntryCount) + (info.ButtonID - 4); bool bringing = index < 1000; if ( !bringing ) index -= 1000; if ( index >= 0 && index < m_Names.Count ) { Mobile sought = (Mobile)m_Names[index]; if ( sought.Deleted ) { from.SendMessage( "That mobile no longer exists." ); from.SendGump( new FindMobsGump( from, m_Names, m_Page, m_SearchValue, m_Options, false ) ); } else if ( bringing ) { from.SendMessage( "Bringing {0} to you.", sought.Name ); sought.Map = from.Map; sought.SetLocation( from.Location, true ); from.SendGump( new FindMobsGump( from, m_Names, m_Page, m_SearchValue, m_Options, false ) ); } else { from.SendMessage( "Going to {0}.", sought.Name ); if ( sought.Map == Map.Internal) { from.Map = sought.LogoutMap; } else { from.Map = sought.Map; } from.SetLocation( sought.Location, true ); from.SendGump( new FindMobsGump( from, m_Names, m_Page, m_SearchValue, m_Options, false ) ); } } break; } } } } }